[TIL] 41 반별강의(Singleton,Delegate,action), 심화주차 시작 ⭐⭐⭐
카테고리: Til
Approximately
, Delegate
, action
유니티 심화주차 1일 , 개인공부
[o] 알고리즘 문제 - 47
[o] 다른반 강의 듣기
[x] ui 2회차 듣기
[x] 심화주차 강의 듣기.
1. Approximately(근사치)
Approximately
if (Mathf.Approximately(1.0f, 10.0f / 10.0f))
{
print("The values are approximately the same");
}
- 실수형의 경우 1.0f == 10.0f / 10.0f 가 항상 true가 아닐 수 있다. -> Approximately
2. 반별강의
데이터 동기화 (싱글톤, 델리게이트, so, ~ playerprefs, json)
싱글톤
public class GameManager : MonoBehaviour
{
private static GameManager _instance;
public static GameManager Instance
{
get
{ // 다른 곳에서 GaneManager.Instance~~ 를 실행 했을때 NULL 이면(게임메니저가 없으면) GameManager을 생성, DondestroyOnload
// Instance = 새로 생성된 게임 오브젝트의 GameManager.cs 의 PRIVATE _instance
if(_instance == null)
{
GameObject go = new GameObject("GameManager");
go.AddComponent<GameManager>();
_instance = go.GetComponent<GameManager>();
DontDestroyOnLoad(go);
}
return _instance;
}
set
{
if (_instance == null) _instance = value;
}
}
private void Awake()
{
if(_instance == null)
{
_instance = this;
DontDestroyOnLoad(this);
}
else
{
if (_instance != this) Destroy(this);
}
}
}
- Instance - get, set
- 다른 곳에서 GaneManager.Instance~~ 를 실행 했을때 NULL 이면(게임메니저가 없으면) GameManager을 생성, DondestroyOnload
- Awake
- 싱글톤화, DondestroyOnLoad, 새로 생긴 GameObject 가 있으면 삭제(Destroy).
델리게이트(Delegate)
Delegate
메서드를 참조하는 객체로, 메서드의 시그니처(입력 매개변수와 반환 타입)에 대한 정보를 포함Func
반환 타입이 void가 아닌 0~n개의 매개변수를 가진 함수를 나타내는 제네릭 델리게이트Action
반환 타입이 void인 메소드를 위해 특별히 설계된 제네릭 델리게이트- public Action action , public event Action action
- event 키워드를 붙이지 않고 Action을 선언할 경우 다른 클래스에서 Action을 실행할 수 있게 됩니다.
- button.onClick.AddListener, inputField.onValueChanged(인풋필드에 값이 변결될 때 마다) 도 Delegate
public delegate void TestDelegate();
public TestDelegate characterUpdate;
//Action
public Action action;
namespace System
{
public delegate void Action();
}
//Func
public Func<int, float, bool> fun;
bool funcfunc(int a , float b)
{
return true;
}
델리게이트 x public으로 cs.method로 사용
// Player
public class Player : MonoBehaviour
{
public void GetExp()
{
Debug.Log("Get Exp");
}
}
// QuestManager
public class QuestManager : MonoBehaviour
{
public void UpdateQuest()
{
Debug.Log("Update Quest");
}
}
// UIManager
public class UIManager : MonoBehaviour
{
public void UpdateUI()
{
Debug.Log("Update UI");
}
}
// GameManager
public Player player;
public QuestManager qm;
public UIManager ui;
void StageClear()
{
player.GetExp();
qm.UpdateQuest();
ui.UpdateUI();
}
Delegate_Action
// Player
public class Player : MonoBehaviour
{
private void Start()
{
GameManager.Instance.action += GetExp;
}
public void GetExp()
{
Debug.Log("Get Exp");
}
}
// QuestManager
public class QuestManager : MonoBehaviour
{
private void Start()
{
GameManager.Instance.action += UpdateQuest;
}
public void UpdateQuest()
{
Debug.Log("Update Quest");
}
}
// UIManager
public class UIManager : MonoBehaviour
{
private void Start()
{
GameManager.Instance.action += UpdateUI;
}
public void UpdateUI()
{
Debug.Log("Update UI");
}
}
// GameManager
public event Action action;
void StageClear()
{
action?.Invoke();
}
Delegate_Action_int
// Player
public class Player : MonoBehaviour
{
private void Start()
{
GameManager.Instance.actionint += GetExpint;
}
public void GetExpint(int a)
{
Debug.Log("action"+a);
}
}
// GameManager
public Action<int> actionint;
void StageClear()
{
actionint?.Invoke(1);
}
SO(Sctiptable Object)
LOAD(SO)
Resources.Load
data = Resources.Load
// Player
private CharacterSO data;
private void Awake()
{
data = Resources.Load<CharacterSO>("SO/DefaultCharacterData");
}
// CharacterManager (so 변경)
private void Awake()
{
data = Resources.Load<CharacterSO>("SO/DefaultCharacterData");
}
private void Start()
{
characterUpdate += ChangeCharacter;
characterUpdate += ChangeExp;
characterUpdate += ChangeName;
}
public void ChangeCharacter()
{//데이터 읽어옴
Debug.Log(data.hp);
}
public void ChangeExp()
{
Debug.Log(data.exp);
}
public void ChangeName()
{
Debug.Log(data.name);
}
// GameManager(데이터)
private CharacterSO data;
private void Awake()
{
data = Resources.Load<CharacterSO>("SO/DefaultCharacterData");
}
private void Start()
{
data.hp = 50;
data.exp = 150;
data.name = "Name";
CharacterUpdate();
}
void CharacterUpdate()
{
//데이터 변화
CharacterManager.Instance.characterUpdate?.Invoke();
}
댓글남기기