๊ฒ์์๋ ์๋ง์ ์ด๋ฒคํธ๋ค์ด ์๋ค.
ํ๋ ์ด์ด๊ฐ ์ ์บ๋ฆญํฐ์ ์์ผ์ ์ธ์ ๋ค์ด์ค๊ณ ๋๊ฐ๋์ง, ์ฒด๋ ฅ์ด ์ธ์ ๋จ์ด์ง๋์ง, ๋ฌด๊ธฐ๊ฐ ์ธ์ ๋ฐ๋ฅ๋๋์ง, ์ ์บ๋ฆญํฐ๊ฐ ์ธ์ ์ํํ ๋ฐ๋ฅ์ ์ฌ๋ผ์๋์ง ๋ฑ, ์ฐ๋ฆฌ๊ฐ ๊ฒ์ํ ๋๋ง๋ค ์์ฐ์ค๋ฝ๊ฒ ๊ฒฝํํ๋ ๊ฒ๋ค์ด๋ค.
ํค๋ณด๋ ์ ๋ ฅ์ด๋ ๋ง์ฐ์ค ํด๋ฆญ, ์ค๋ธ์ ํธ์ ์ถฉ๋์ฒด ์์ญ ํต๊ณผ, ํ๋ ์ด์ด๊ฐ ๊ณต๊ฒฉ๋ฐ๋ ๊ฒ ๋ฑ๊ณผ ๊ฐ์ ์๊ฐ์ฒ๋ผ ์ด๋ฒคํธ๋ ์๋์ ์ธ ์ฑ๊ฒฉ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ์ค์ค๋ก ๋ฅ๋์ ์ผ๋ก ๋ฐ์ํ์ง ์๋๋ค.
์ด๋ฒคํธ๋ ์๋ต์ ๋ง๋ค๊ณ ๋ฐ์์ํค๋ฉฐ, ๊ทธ ์๋ต์ด ๋ค์ ๊ทธ ์ดํ์ ์๋ต์ ์ผ์ผํค๋ ์ด๋ฒคํธ๊ฐ ๋ ์ ์๋ค. ์ฆ, ์ด๋ฒคํธ๋ ํ๋์ ํ๋์ ์ทจํจ(์ด๋ฒคํธ)์ผ๋ก์จ ๋ค๋ฅธ ํ๋์ ์๋ฐ(์๋ต)ํ๋ ์์ผ๋ก, ์๋ก์ ํ๋๋ค์ ์ค์ํ ๊ด๊ณ๋ฅผ ๋งบ๊ณ ์๋ค๊ณ ๋ณผ ์ ์๋ค.
ํ๋กํผํฐ(Property)๋ฅผ ํตํ ์ด๋ฒคํธ ๊ตฌํ์ ๋ฌธ์ ์
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemyObject : MonoBehaviour
{
private int _health = 100;
private int _ammo = 50;
public int Health
{
get { return _health; }
set
{
_health = Mathf.Clamp(value, 0, 100);
if(_health < 0)
{
OnDead();
return;
}
if(_health < 20)
{
OnHealthLow();
return;
}
}
}
public int Ammo
{
get { return _ammo; }
set
{
_ammo = Mathf.Clamp(value, 0, 50);
if(_ammo <= 0)
{
OnAmmoExpired();
return;
}
}
}
void OnDead()
{
// ์ฃฝ๋ ์ด๋ฒคํธ ๋ฐ์
}
void OnHealthLow()
{
// ์ฒด๋ ฅ ๋ฎ์ ๊ฒฝ๊ณ ์๋ฆผ ์ด๋ฒคํธ ๋ฐ์
}
void OnAmmoExpired()
{
// ํ์ฝ์ด ์๋ค๋ ์ด๋ฒคํธ ๋ฐ์
}
}
- ๊ฐ ์์ ์์ ์ ๋ฐ์ํด์ผ ํ ์ด๋ฒคํธ๋ฅผ ์ฒดํฌํ๊ณ , ์กฐ๊ฑด์ด ๋ง์กฑํ๋ค๋ฉด ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํจ๋ค.
- ๋งค๋ฒ Update() ํจ์์์ ์ฒดํฌํ์ง ์๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ ํฅ์๊ณผ ์ฒญ๊ฒฐํ ์ฝ๋ ๋ ๋ค ์ก์ ์ ์๋ค.
- ์ด๋ฒคํธ๊ฐ ๋ฐ์ํด์ผํ ๋์์ ๋ํ ์ ๋ณด๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ์ค๋ธ์ ํธ๊ฐ ์๋ค๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
- ๊ฐ๋ น, ๋ชฌ์คํฐ 100๋ง๋ฆฌ๊ฐ ์๋๋ฐ ๊ทธ ์ค ํ ๋ง๋ฆฌ๊ฐ ์ฃฝ์๋ค๋ฉด OnDead() ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๊ฒ์ด๋ค.
- 100๋ง๋ฆฌ ์ค ์ด๋ค ๋ชฌ์คํฐ๊ฐ ์ฃฝ์๋์ง์ ๋ํ ์ ๋ณด๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ฃฝ์ ๋ชฌ์คํฐ์ ๋ํ ์ ๋ณด๋ฅผ ์ ์๊ฐ ์๋ค.
์ด๋ฐ ๋ฌธ์ ๋๋ฌธ์ ๊ฐ ์ค๋ธ์ ํธ๊ฐ ๋ชจ๋ ์ข ๋ฅ์ ์ด๋ฒคํธ์ ๋ํด ์ ํ์ ์ผ๋ก ์์ ํ๋๋ก ํ๊ฒ ํด์ผ ํ ํ์์ฑ์ด ์๊ฒผ๋ค.
์ด๋ฒคํธ ๊ด๋ฆฌ (Event Management)
์์์ ์ด๋ค ๋ฌธ์ ๊ฐ ์๋์ง๋ฅผ ์์์ผ๋, ๊ทธ๊ฒ์ ํด๊ฒฐํ๊ธฐ ์ํ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค. ์ฑ ์ ๋์์๋๋๋ก, EventManager ํด๋์ค๋ฅผ ํตํด ์ค๋ธ์ ํธ๊ฐ ํน์ ์ด๋ฒคํธ๋ฅผ ์์ ํ ์ ์๋๋ก ๋ง๋ค์ด ๋ณผ ๊ฒ์ด๋ค. ๋จผ์ ์ธ ๊ฐ์ง ์ค์ํ ๊ฐ๋ ์ด ์๋ค.
์ด๋ฒคํธ ๋ฆฌ์ค๋ (Event Listener)
- ์๊ธฐ ์์ ์ด ๋ฐ์์ํจ ์ด๋ฒคํธ๋ฅผ ํฌํจํ์ฌ, ์ด๋ค ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ์๊ธฐ๋ฅผ ์ํ๋ ์ค๋ธ์ ํธ
- ์ค์ ๋ก ๋๋ถ๋ถ์ ์ค๋ธ์ ํธ๋ค์ ํ๋ ์ด์์ ์ด๋ฒคํธ์ ๋ํ ๋ฆฌ์ค๋
- ์๋ฅผ ๋ค์ด, ์ ์ ๊ฒฝ์ฐ์ ๋ค๋ฅธ ์ ์ ๋นํด ์ ์ ์ฒด๋ ฅ์ด๋ ํ์ฝ์ ๊ฐ์ง ๊ฒฝ์ฐ์ ๋ํ ์๋ฆผ์ ๋ฐ๊ธธ ์ํ ๊ฒ
- ์ด ๊ฒฝ์ฐ, ์ต์ ๋ ๊ฐ์ง ๋ณ๊ฐ์ ์ด๋ฒคํธ์ ๋ํ ๋ฆฌ์ค๋๊ฐ ๋จ
์ด๋ฒคํธ ํฌ์คํฐ (Event Poster)
- ์ค๋ธ์ ํธ๊ฐ ์ด๋ฒคํธ ๋ฐ์์ ์์์ฐจ๋ฆฐ ๊ฒฝ์ฐ, ๋ค๋ฅธ ๋ชจ๋ ๋ฆฌ์ค๋ ์ค๋ธ์ ํธ๋ค์ด ์ ์ ์๊ฒ ์ด๋ฒคํธ์ ๋ํด ์๋ ค์ผ ํจ
- ์์ ํ๋กํผํฐ์์ ๋ฐ์์ํจ ๋ด๋ถ ์ด๋ฒคํธ ํธ์ถ๊ณผ ๋ฌ๋ฆฌ, ์ ์ญ ๋ ๋ฒจ์์ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์์ผ์ผ ํจ
์ด๋ฒคํธ ๋งค๋์ (Event Manager)
- ์ฌ๋ฌ ๋ ๋ฒจ(Scene)์ ๊ฑธ์ณ ๊ณ์ ์ ์ง๋๊ณ , ์ ์ญ์ ์ผ๋ก ์ ๊ทผ ๊ฐ๋ฅํ ์ฑ๊ธํค ์ค๋ธ์ ํธ(Singleton Object)
- ๋ฆฌ์ค๋๋ฅผ ํฌ์คํฐ์๊ฒ ์ค์ง์ ์ผ๋ก ์ฐ๊ฒฐํ๋ ์ญํ
- ์ด๋ฒคํธ ๋งค๋์ ๋ ํฌ์คํฐ๊ฐ ๋ณด๋ธ ์๋ฆผ์ ๋ฐ๊ณ , ์ ํฉํ ๋ชจ๋ ๋ฆฌ์ค๋์๊ฒ ์ด๋ฒคํธ ํ์์ผ๋ก ์ฆ์ ์๋ฆผ์ ๋ฐ์์ํด
์ธ ๊ฐ์ง ๊ฐ๋ ์ ๋ํด ์์๋ดค๋๋ฐ, ์ด๊ฒ๋ค์ ํจ๊ณผ์ ์ผ๋ก ๊ตฌํํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ ๊ฐ์ง ์ ๋ ์์๋ณด์.
์ธํฐํ์ด์ค๋ฅผ ํตํ ์ด๋ฒคํธ ๊ด๋ฆฌ
์ด๋ฒคํธ ๋ฆฌ์ค๋ ๋ง๋ค๊ธฐ
์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ค๋ฉด, ํด๋น ์ด๋ฒคํธ๋ฅผ ์์ ํ ์ ์๋ ์ค๋ธ์ ํธ๋ก ์ฐ์ ๋ง๋ค์ด์ค์ผ ํ๋ค. ์ธํฐํ์ด์ค๋ฅผ ํตํด ๋ฆฌ์ค๋๋ฅผ ๋ง๋๋ ์์ ๋ฅผ ๋ดค๋ค.
public enum EVENT_TYPE
{
eGameInit,
eGameEnd,
eAmmoChange,
eHealthChange,
eDead
};
public interface IListener
{
// ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋, ๋ฆฌ์ค๋์์ ํธ์ถํ ํจ์
void OnEvent(EVENT_TYPE EventType, Component Sender, object Param = null);
}
์ด๋ฒคํธ ํ์ ์ ํด๋นํ๋ ์ ๋ณด๋ฅผ ์ด๊ฑฐํ(enum)์ผ๋ก ์ ์๋ฅผ ํ๊ณ , ์ธํฐํ์ด์ค ๋ํ ์ ์๋ฅผ ํด์คฌ๋ค.
OnEvent() ํจ์๋ ํด๋น ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์ ํด๋์ค์์ ๊ฐ์์ ์ด๋ฒคํธ ๋ด์ฉ์ผ๋ก ๋คํ์ฑ์ ์ด๋ฃจ์ด์ค ๊ฒ์ด๋ค.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// IListener ์ธํฐํ์ด์ค๋ฅผ ์์ํ์ฌ ๋ง๋ ๋ฆฌ์ค๋
public class MyCustomListener : MonoBehaviour, IListener
{
// ์ด๋ฒคํธ ์์ ์ ์ํด ํจ์ ๊ตฌํ
public void OnEvent(EVENT_TYPE EventType, Component Sender, object Param = null)
{
}
}
์ด๋ฒคํธ ๋งค๋์ ์๊ฒ ๋ฑ๋ก๋ ๋ฆฌ์ค๋๋ค์ด OnEvent() ํจ์๋ฅผ ํธ์ถ๋นํ๋ ๊ตฌ์กฐ๋ก ๋ง๋ค ๊ฒ์ด๋ฏ๋ก, ์ด์ ์ด๋ฒคํธ ๋งค๋์ ๋ฅผ ๋ง๋ค์ด์ค์ผ ํ๋ค.
์ด๋ฒคํธ ๋งค๋์ ๋ง๋ค๊ธฐ
์ด๋ฒคํธ ๋งค๋์ ์ ์ญํ ์ ์ด๋ฒคํธ๊ฐ ์ค์ ๋ก ๋ฐ์ํ์ ๋, ๋ฑ๋ก๋ ๋ฆฌ์ค๋๋ค์๊ฒ ์ด๋ฒคํธ๋ฅผ ํธ์ถํ๋ ๊ฒ์ด๋ค.
์ฌ๋ฌ ์ฌ(Scene)๋ค์ ๋๋ ๋ค์ด๋ ์กด์ฌํด์ผ ํ๊ณ , ์ ์ญ์ ์ผ๋ก ์ ๊ทผ์ด ๊ฐ๋ฅํด์ผ ํ๋ฏ๋ก ์ฑ๊ธํค ํจํด์ผ๋ก ๊ตฌํํ๋ค.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EventManager : MonoBehaviour
{
public static EventManager Instance { get { return _instance; } }
private static EventManager _instance = null;
private Dictionary<EVENT_TYPE, List<IListener>> Listeners =
new Dictionary<EVENT_TYPE, List<IListener>>();
void Awake()
{
if(_instance == null)
{
_instance = this;
DontDestroyOnLoad(gameObject);
return;
}
DestroyImmediate(gameObject);
}
...
}
๋์ ๋๋ฆฌ(Dictionary)๋ก ์ ์ธํ Listeners๋ ์ด๋ฒคํธ๋ฅผ ์์ ๋ฐ๊ธธ ์ํ๋ ๋ฆฌ์ค๋๋ค์ ์ ์ฅํ๊ณ ์๋ค.
์๋ฅผ ๋ค์ด, ์ฒด๋ ฅ์ด ๋ณ๊ฒฝ๋๋ค๋ ์ด๋ฒคํธ๋ฅผ ์์ ๋ฐ๊ณ ์ถ์ ๋ฆฌ์ค๋๋ ํ ๋์ด ์๋ ์๋ ์๋ค.
์์ ์ ์ฒด๋ ฅ ์ํ๋ฅผ ๋ํ๋ด์ผ ํ๋ UI ์ฒด๋ ฅ๋ฐ๋ ๋ฌผ๋ก ์คํฏ(Stat)์ ๋ณด์ฌ์ฃผ๋ ์ฐฝ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ์ด๋ฃจ์ด์ ธ์ผ ํ๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์, ํด๋น ์ด๋ฒคํธ์ ๋ํด ์์ ๋ฐ์ ๋ฆฌ์ค๋๋ค์ ๋ฆฌ์คํธ(List)๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ด๋ค.
๋ฆฌ์ค๋๋ค์ ์ด๋ฒคํธ ๋ฐ์ ์๋ฆผ์ ๋ฐ๊ธฐ ์ํด, ๋จผ์ ์ด๋ฒคํธ ๋งค๋์ ์ ์์ ์ ๋ฑ๋กํด์ผ ํ๋ ์ ์ฐจ๋ฅผ ๊ฑฐ์ณ์ผ ํ๋ค.
๋ฑ๋ก์ ํ๋ค๋ฉด, ์ด์ ๋ฆฌ์ค๋๋ค์ ์ด๋ฒคํธ ๋งค๋์ ๋ก๋ถํฐ ์ด๋ฒคํธ ๋ฐ์ ์๋ฆผ์ ๋ฐ์ ์ ์๋ค.
๊ทธ๊ฑธ ์ํด ๋ง๋ AddListener() ๋ฉ์๋๊ฐ ๋ค์๊ณผ ๊ฐ๋ค.
public void AddListener(EVENT_TYPE eventType, IListener Listener)
{
List<IListener> ListenList = null;
/* ์ด๋ฒคํธ ํ์ ํค๊ฐ ์กด์ฌํ๋์ง ๊ฒ์ฌ. ์กด์ฌํ๋ฉด ๋ฆฌ์คํธ์ ์ถ๊ฐ */
if(Listeners.TryGetValue(eventType, out ListenList))
{
ListenList.Add(Listener);
return;
}
/* ์์ผ๋ฉด ์๋ก์ด ๋ฆฌ์คํธ ์์ฑ */
ListenList = new List<IListener>();
ListenList.Add(Listener);
Listeners.Add(eventType, ListenList); /* ๋ฆฌ์ค๋ ๋ฆฌ์คํธ์ ์ถ๊ฐ */
}
์ด์ , ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ์ด๋ฒคํธ ๋งค๋์ ์๊ฒ ์์์ ์๋ ค์ค PostNotification() ๋ฉ์๋๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค.
public void PostNotification(EVENT_TYPE eventType, Component Sender, object param = null)
{
List<IListener> ListenList = null;
if (!Listeners.TryGetValue(eventType, out ListenList))
return;
for(int i = 0; i < ListenList.Count; i++)
ListenList?[i].OnEvent(eventType, Sender, param);
}
๋ ์ด์ ์ฌ์ฉํ์ง ์๋ ์ด๋ฒคํธ๊ฐ ์๋ค๋ฉด, ์ง์ฐ๋ ๊ธฐ๋ฅ ๋ํ ํ์ํ ๊ฒ์ด๋ค.
public void RemoveEvent(EVENT_TYPE eventType) => Listeners.Remove(eventType);
์ ๋๋ก ๋ ๋ฆฌ์ค๋๋ค์ ๊ฐ์ง๊ณ ์๋์ง ๊ฒ์ฌํ์ฌ, ๋ฌด๊ฒฐ์ฑ์ ์ด๋ค์ฃผ๋๋ก ํ๋ ๊ธฐ๋ฅ๋ ํ์ํ ๊ฒ์ด๋ค.
์ด๋ฒคํธ ๋งค๋์ ๋ฅผ ์ฑ๊ธํค์ผ๋ก ๊ตฌํํ๊ธฐ ๋๋ฌธ์ ์ฌ์ด ๋ฐ๋์ด๋ ํ๊ดด๋์ง ์๊ณ ๊ทธ๋๋ก ์ ์ง๋์ง๋ง, ์ผ๋ฐ ์ค๋ธ์ ํธ๋ค์ ๊ทธ๋ ์ง ์์ ์ ์๋ค.
์ฌ์ด ๋ฐ๋์ด์ ์ด๋ฏธ ํ๊ดด๋ ์ค๋ธ์ ํธ๋ฅผ ์ฐธ์กฐํ๋ ค๊ณ ํ๋ฉด ์ ๋๋ฏ๋ก, ๊ทธ๋ฐ ๋ถ๋ถ์ ์์ ํด์ฃผ๋ ๊ธฐ๋ฅ์ด ํ์ํ๋ค.
public void RemoveRedundancies()
{
Dictionary<EVENT_TYPE, List<IListener>> newListeners =
new Dictionary<EVENT_TYPE,List<IListener>>();
foreach(KeyValuePair<EVENT_TYPE, List<IListener>> Item in Listeners)
{
for (int i = Item.Value.Count - 1; i >= 0; i--)
{
if(Item.Value[i].Equals(null))
Item.Value.RemoveAt(i);
}
if(Item.Value.Count > 0)
newListeners.Add(Item.Key, Item.Value);
}
Listeners = newListeners;
}
OnLevelWasLoaded() ํจ์๋ ์ฌ์ด ๋ฐ๋์์ ๋ ํธ์ถ๋๋ ํจ์๋ค. ์ฌ๊ธฐ์์ ์ ๋ฉ์๋๋ฅผ ํธ์ถํด์ฃผ์.
void OnLevelWasLoaded()
{
RemoveRedundancies();
}
ํ ์คํธ ํด๋ณด๊ธฐ
์ด์ ๊ตฌ์กฐ๋ ๋ค ๋ง๋ค์๋ค. ์ ๋๋ก ์ ๋์ํ๋์ง ํ ์คํธ๋ฅผ ํด๋ณด์.
๊ฐ๋จํ๊ฒ F ํค๋ฅผ ๋๋ฅผ ๋๋ง๋ค ํ๋ ์ด์ด์ ์ฒด๋ ฅ์ 10์ฉ ๊น์ ๊ฒ์ด๊ณ , ์ด๋ฒคํธ๋ฅผ ๋ฐ์์์ผ์ ํ๋ฉด UI Text์ ๋ณ๊ฒฝ๋ ์ฒด๋ ฅ ๊ฐ์ผ๋ก ์ ๋ฐ์ดํธ ๋๋๋ก ๋ง๋ค์ด ๋ดค๋ค.
EnemyObject.cs
// ์บ๋ฆญํฐ ์ค๋ธ์ ํธ๋ฅผ ํ๋ ๋ง๋ค์ด์ ๋ถ์ฐฉ
public class EnemyObject : MonoBehaviour
{
private int _health = 100;
public int Health
{
get { return _health; }
set
{
_health = Mathf.Clamp(value, 0, 100);
EventManager.Instance.PostNotification(EVENT_TYPE.eHealthChange, this, _health);
// ์ฒด๋ ฅ๋ณ๊ฒฝ ์ด๋ฒคํธ๋ฅผ ์ด๋ฒคํธ ๋งค๋์ ์๊ฒ ์๋ฆฌ๊ธฐ
}
}
void Update()
{
if (Input.GetKeyDown(KeyCode.F))
{
Health -= 10;
}
}
}
UI_Health.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
// Canvas - Text ๊ณ์ธต๊ตฌ์กฐ๋ก, ์ด ์คํฌ๋ฆฝํธ๋ Canvas์ ๋ถ์ฐฉ๋จ
public class UI_Health : MonoBehaviour, IListener
{
private Text healthText;
void Start()
{
healthText = GetComponentInChildren<Text>();
EventManager.Instance.AddListener(EVENT_TYPE.eHealthChange, this);
healthText.text = "???";
}
public void OnEvent(EVENT_TYPE EventType, Component Sender, object Param = null)
{
switch (EventType)
{
case EVENT_TYPE.eHealthChange:
healthText.text = Param.ToString();
break;
}
}
}
ํ์ ํ์ง๋ง ๊ฐ๋จํ ํ ์คํธ์ฉ์ผ๋ก ๋ง๋ค์ด ๋ดค๋ค. ์ฒด๋ ฅ๋ณ๊ฒฝ ์ด๋ฒคํธ๋ฅผ ์์ ๋ฐ๊ณ ์ถ์ ์ชฝ์ UI Text์ด๊ธฐ ๋๋ฌธ์ ์ด๋ฒคํธ ๋งค๋์ ์ ๋ฆฌ์ค๋๋ก ๋ฑ๋ก์ ์ด๊ธฐ์ ํด์ค ๋ชจ์ต์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ฌ ์์ ์ ๋ฐ์ ๋, ์ํ๋ ์ด๋ฒคํธ ํ์ ๋ง ์์ ํ๋๋ก switch๋ฌธ์ผ๋ก ๋ถ๊ธฐํด์คฌ๋ค.
์ ๋ํฐ ํํ ๋ฆฌ์ผ์ ๋์ค๋ ๊ท์ฌ์ด ์กด ๋ ๋ชฌ์ผ๋ก ์บ๋ฆญํฐ๋ฅผ ์ ์ ํด์คฌ๋ค.
๋๋ฆฌ์(Delegate)๋ฅผ ์ด์ฉํ์ฌ ๋ง๋๋ ๋ฐฉ๋ฒ
์ธํฐํ์ด์ค ๋ง๊ณ ๋, ๋๋ฆฌ์(Delegate)๋ฅผ ์ด์ฉํด์ ๋ง๋ค ์๋ ์๋ค. ์ธํฐํ์ด์ค ๊ตฌํ ์ฝ๋์์ ์ฝ๊ฐ๋ง ์์ ํ๋ฉด ๋๋ค.
์๋ ๋๋ณด๊ธฐ๋์ ์ฝ๋๋ฅผ ์ฒจ๋ถํ๊ฒ ๋ค.
EventManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EventManager : MonoBehaviour
{
public static EventManager Instance { get { return _instance; } }
private static EventManager _instance = null;
// ๋๋ฆฌ์ ์ ์ธ
public delegate void OnEvent(EVENT_TYPE eventType, Component Sender, object Param = null);
private Dictionary<EVENT_TYPE, List<OnEvent>> Listeners = new Dictionary<EVENT_TYPE, List<OnEvent>>();
void Awake()
{
if(_instance == null)
{
_instance = this;
DontDestroyOnLoad(gameObject);
return;
}
DestroyImmediate(gameObject);
}
public void AddListener(EVENT_TYPE eventType, OnEvent Listener)
{
List<OnEvent> ListenList = null;
if(Listeners.TryGetValue(eventType, out ListenList))
{
ListenList.Add(Listener);
return;
}
ListenList = new List<OnEvent>();
ListenList.Add(Listener);
Listeners.Add(eventType, ListenList);
}
public void PostNotification(EVENT_TYPE eventType, Component Sender, object param = null)
{
List<OnEvent> ListenList = null;
if (!Listeners.TryGetValue(eventType, out ListenList))
return;
for(int i = 0; i < ListenList.Count; i++)
{
ListenList?[i](eventType, Sender, param);
}
}
public void RemoveEvent(EVENT_TYPE eventType) => Listeners.Remove(eventType);
public void RemoveRedundancies()
{
Dictionary<EVENT_TYPE, List<OnEvent>> newListeners = new Dictionary<EVENT_TYPE, List<OnEvent>>();
foreach(KeyValuePair<EVENT_TYPE, List<OnEvent>> Item in Listeners)
{
for (int i = Item.Value.Count - 1; i >= 0; i--)
{
if(Item.Value[i].Equals(null))
Item.Value.RemoveAt(i);
}
if(Item.Value.Count > 0)
newListeners.Add(Item.Key, Item.Value);
}
Listeners = newListeners;
}
void OnLevelWasLoaded()
{
RemoveRedundancies();
}
}
UI_Health.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class UI_Health : MonoBehaviour
{
private Text healthText;
void Start()
{
healthText = GetComponentInChildren<Text>();
EventManager.Instance.AddListener(EVENT_TYPE.eHealthChange, OnEvent);
healthText.text = "???";
}
public void OnEvent(EVENT_TYPE EventType, Component Sender, object Param = null)
{
switch (EventType)
{
case EVENT_TYPE.eHealthChange:
healthText.text = Param.ToString();
break;
}
}
}
- ์ด ๊ธ์ <์ ๋ํฐ C# ์คํฌ๋ฆฝํ ๋ง์คํฐํ๊ธฐ> ์ฑ ์ ๋ฐํ์ผ๋ก ๊ณต๋ถํ ๊ธ์ ๋๋ค.