
AddListener
팀 프로젝트를 마지막날 튜터님이 점검 한 번 해주셨는데
private Button jumpButton;
Transform gameCanvas = _gameUICanvas.transform;
currentScoreTxt = jumpButton = gameCanvas.Find("Button - Jump").GetComponent<Button>();
jumpButton.onClick.AddListener(OnClickJumpButton);
내가 구현한 GameUI 스크립트에서 저런 식으로 구현하지 말고
Button컴포넌트에서 OnClick() 이벤트를 사용해서 하는 것이
쉽고 빠르게 버그도 안 나면서 작업을 할 수 있다고 하셨다.

처음 강의에서 배울 때는 사진처럼 했지만
이후 강의에서는 저렇게 코드로 작성하는 식으로 알려주셨다.
단점이라면 오브젝트가 깨졌을 때 (초기화?) 다시 일일이 OnClick()에 할당하는 것이 귀찮다는 점이라고 하셨다.
AddListener의 역할:
이 버튼이 클릭되면 (이벤트 발생), 저 함수를 실행해줘!" 라고 지시하는 것
장점:
이벤트 연결 로직을 코드 내에서 관리하므로,
UI 구조가 변경되더라도 코드만 수정하면 이벤트 연결을 유지할 수 있다.
단점
공동 작업할 때는 gameCanvas.Find("Button - Jump")
(" ") 이 부분 안의 오브젝트의 이름이 조금이라도 틀릴 경우 아예 작동을 안한다는 것이다.
그래서 초보인 나에게는 버튼에 직접 연결하는 방법을 추천해 주셨다.
public void AddListener(UnityAction call)
{
AddCall(GetDelegate(call));
}
놀랍게도 이 AddListener는 GetDelegate로 튜터님의 바로 다음 강의에서 진행될 내용이였다.
Delegate는 강의를 들은 후 작성하겠다.
currentScoreTxt = gameCanvas.Find("CurrentScoreText").GetComponent<TextMeshProUGUI>();
bestScoreTxt = gameCanvas.Find("BestScoreText").GetComponent<TextMeshProUGUI>();
stateCurrentScoreTxt = gameStateCanvas.Find("CurrentScoreText").GetComponent<TextMeshProUGUI>();
stateBestScoreTxt = gameStateCanvas.Find("BestScoreText").GetComponent<TextMeshProUGUI>();
jumpButton = gameCanvas.Find("Button - Jump").GetComponent<Button>();
slidingButton = gameCanvas.Find("Button - Sliding").GetComponent<Button>();
restartButton = gameStateCanvas.Find("Button - Restart").GetComponent<Button>();
homeButton = gameStateCanvas.Find("Button - Home").GetComponent<Button>();
backButton = gameStateCanvas.Find("Button - Next").GetComponent<Button>();
pauseButton = gameCanvas.Find("Button - Pause").GetComponent<Button>();
강의에서 배운대로 이런 식으로 구성했는데
이것도 그냥
[SerializeField] private GameObject _gameUICanvas;
[SerializeField] private GameObject _gameStateUICanvas;
[SerializeField]를 이용하여 컴포넌트에 직접 할당하는 것이 편하다고 하셨다.
직관적이고 안정성까지 챙길 수 있다.
그리고 리소스를 다 잡아먹어서 처음 로딩하는데
오래 걸리게 하는 주범이라고 하셨다.
그리고 오브젝트를 할당할 때 public으로 선언해줘야 가능.
다음에는 꼭 쉽고 간단하게 하자.