카테고리 없음

2025_04_24 TIL

chajungto0211 2025. 4. 24. 22:28
이 글은 평범한 취준생이 평범하게 자신이 당일 배운것들과 느낀점들을 쓰기 때문에 정보가 정확하지 않을 수 있습니다.

분명 Go to Bed를 만들려고 한건 저번주 금요일 쯤이었고, 분명 시간이 어느정도 여유는 있을거라고 생각이 들었지만, 현실은 코드를 5번째 갈아엎고 이제 2스테이지를 만드는데 성공한 나 자신을 볼 수 있다. 물론 이제 3스테이지를 만들면 되지만, 내일까지 과연 3스테이지를 만든다는 보장도 없으니... 일단 오늘은 나의 코드들과 밤을 함께 보내야 할 예정이다. 그럼 코드들과 밤을 보내기 전에, 오늘 내가 배운 유니티 기술에 대해서 까먹지 않게 남겨두려고 한다.

 

 

Unity Event

현재 프로젝트에서 싱글톤을 자제해야하는 입장에서, 나는 다른 스크립트에서의 함수가 필요한데, 들고 올 방법이 없을 때 종종 static과 Action을 결합해서 쓰고는 했다. 다만 이 방법의 단점은, 할당을 시켜주었으면 해제하는 것을 잊지 말아야 하고, 나중에 너무 많아지면 그만큼 관리도 어렵다는 것이다. 하지만 저번 TIL에서는, static을 쓰지 않기로 마음먹었었다. 그래서 딱히 방법이 없어서 내가 모르는 방법이 있나 찾아보았다. 그때 발견한 것이 바로 Unity Event이다.

 

내가 이걸 발견하고 다른 분들께도 이거 아시나고 물어봤는데 알고 계셨다. 나만 몰랐던것 같았다. 일단 사용법을 간단히 살펴보자.먼저 UnityEvent 변수를 만들어준다.

그렇다면 이제 인스펙터창에 본인이 쓴 UnityEvent이 뜰 것이다. 

함수이름은 리펙토링할 예정...

그리고 여기에 내가 실행시켜주고 싶은 스크립트의 함수가 있다면, 해당 오브젝트를 끌고와서 여기에서 설정해주면 끝이다. 이렇게 쉽고 간단한 걸 왜 이제 알았는지 모르겠다.

 

다른 예시를 보여주자면, 중간에 어떤 버튼을 누르면 특정 오브젝트만 초기화를 시켜줘야 했었다. 하지만 어떻게 이 물건들을 참조하고 실행시킬지가 고민이었다. 하지만 Unity Event 하나로 해결하였다.

복잡하긴 하다.

인스펙터창이 조금 꽉차긴 했지만, 성공적으로 초기화시켰다. 

 

하지만 이런 간편함과는 다르게, 해당 기능의 불편함을 확실하게 느꼈다. 나도 이런 단점을 알고싶지는 않았다. 내 1시간을 버려가면서까지 알고싶지 않았다...

 

바로 디버깅이 힘들다는 점이었다. 분명히 나는 어느 버튼을 누르면 player의 Action map을 바꾸는 행동을 하도록 만들었다. 그런데, 버튼을 누르니 어느 map에서 해선는 안되는 행동들이 실행되던 것이었다. 내가 코딩을 잘못했다고 판단하고, 게속 내 코드를 손보면서 디버깅을 시작했다. 하지만 해당 오류가 나는 부분을 해당 부분에서 발견할 수 있었다.

 

 public void ChangeInputToUI()
 {
     if (CurrentInteract.Panel is IPanelButton IPB) CurrentButton = IPB.DefaultButton;
     _playerController.SwitchCurrentActionMap("UI");
 }

 public void ChangeInputToTest()
 {
     if (CurrentInteract.Panel is IPanelButton IPB) CurrentButton = IPB.DefaultButton;
     _playerController.SwitchCurrentActionMap("Test");
 }

 public void ChangeInputToEmpty()
 {
     _playerController.SwitchCurrentActionMap("Empty");
 }

 public void ChangeInputToPlayer()
 {
     _playerController.SwitchCurrentActionMap("Player");
 }

 

이름이 비슷해서 제대로 넣은줄 알았는데 아예 다른 함수를 넣고 돌리고 있었던 것이다... 항상 간편한 기능 뒤에는 이런 이면이 있다는 것도 알아두면 좋을 것 같다.

 

오늘 TIL은 조금 짧은 것 같지만 아직 해야할 일들이 많기에... 코드와 함께 밤을 지새러 가야겠다. (while(true)문에 코드를 가두어놓고 break;없이 코드랑 밤에 놀아보자)