내일배움캠프 25일차 TIL <Unity > AddListener & Button 05/14

정광훈(Unity_9기)·2025년 5월 14일

TIL (Today I Learned)

목록 보기
37/110
post-thumbnail

AddListener

  1. 오늘 있었던 일

팀 프로젝트를 마지막날 튜터님이 점검 한 번 해주셨는데

 private Button jumpButton;
 
 Transform gameCanvas = _gameUICanvas.transform;
 
 currentScoreTxt = jumpButton = gameCanvas.Find("Button - Jump").GetComponent<Button>();
 jumpButton.onClick.AddListener(OnClickJumpButton);

내가 구현한 GameUI 스크립트에서 저런 식으로 구현하지 말고

Button컴포넌트에서 OnClick() 이벤트를 사용해서 하는 것이
쉽고 빠르게 버그도 안 나면서 작업을 할 수 있다고 하셨다.


  1. 튜터님이 알려주신 점

처음 강의에서 배울 때는 사진처럼 했지만
이후 강의에서는 저렇게 코드로 작성하는 식으로 알려주셨다.

단점이라면 오브젝트가 깨졌을 때 (초기화?) 다시 일일이 OnClick()에 할당하는 것이 귀찮다는 점이라고 하셨다.

AddListener의 역할:
이 버튼이 클릭되면 (이벤트 발생), 저 함수를 실행해줘!" 라고 지시하는 것

장점:
이벤트 연결 로직을 코드 내에서 관리하므로,
UI 구조가 변경되더라도 코드만 수정하면 이벤트 연결을 유지할 수 있다.

단점
공동 작업할 때는 gameCanvas.Find("Button - Jump")
(" ") 이 부분 안의 오브젝트의 이름이 조금이라도 틀릴 경우 아예 작동을 안한다는 것이다.
그래서 초보인 나에게는 버튼에 직접 연결하는 방법을 추천해 주셨다.


  1. 다음에 공부할 내용
    public void AddListener(UnityAction call)
    {
        AddCall(GetDelegate(call));
    }

놀랍게도 이 AddListener는 GetDelegate로 튜터님의 바로 다음 강의에서 진행될 내용이였다.

Delegate는 강의를 들은 후 작성하겠다.


  1. 추가로
        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으로 선언해줘야 가능.

다음에는 꼭 쉽고 간단하게 하자.

0개의 댓글