들어가며
유니티에서 버튼에 함수를 연결하는 것은 매우 쉽다.
드래그 드롭하면 끝나지 않나요? ....라고 생각한 당신, 아직 오류한테 덜 맞아본 것이다.
님들도 드래그 드롭으로 연결하셈 편함
흠...
물론, public 선언하고 인스펙터에서 그대로 드래그 드롭한다면 편하긴 하다. 그런데, 만약 모종의 이유로 프로젝트를 밖으로 내보내고 다른 컴퓨터에서 프로젝트를 실행시킬 경우에 뭔가 누락된 파일이 있어서 버튼과 함수 간의 연결이 풀리거나, 에러가 떠서 버튼UI가 모두 날라가는 등의 화가나고 껄끄러운 일이 일어나지 않을 자신이 있는가?
자신은 어떤 함수가 어디와 연결이 되어있는지 속속이 꿰고 있다면 상관없다고 생각하겠지만, 다른 사람이라면? 회사나 팀 단위로 프로젝트가 진행되는 곳에서는 드래그 드롭으로 연결했다가 나중에 다른 사람이 해당 함수를 연결을 해야하는데, 어디에 해야할지 몰라서 이상한데다가 연결을 해버리면 그거야말로 참사가 날 수 있다.
콘텐츠의 양이 늘어나다보면 당연히 함수는 늘어날 것이고, UI는 이루 말할 것도 없을 것이며(더구나 UI는 게임의 완성도를 좌우할 정도로 중요하다고 생각함) 버튼 역시 늘어날 것인데, 이를 일일이 연결하는 것보다는 혹시 모를 상황을 대비해 코드로 자동으로 연결이 되도록 하는 것이 좋다.
버튼 코드로 연결
버튼을 코드로 연결하는 것은 그렇게 어렵지 않다. 버튼은 Action과 같은 원리라고 보면 된다. 만약 Action이 뭔지 모르겠다면 다음 포스팅을 참고하길 바란다.
2025.08.31 - [C#/C# 문법] - C# 중급 문법 (7) : 델리게이트와 이벤트
C# 중급 문법 (7) : 델리게이트와 이벤트
안녕하세요! C# 객체 지향 프로그래밍의 다양한 개념들을 탐험하며 코드의 재사용성과 유연성을 높이는 방법들을 알아봤습니다. 이번에는 객체 간의 상호작용을 더욱 유연하고 확장 가능하게
jinjin7576.tistory.com
원리로만 따지면 액션 이벤트와 같기 때문에 구독과 구독 해제가 있다는 것을 짐작이 가능하다.
예제를 보자.
using UnityEngine;
using UnityEngine.UI;
public class ButtonTest : MonoBehaviour
{
public Button btn;
private void Start()
{
btn = GameObject.Find("Button").GetComponent<Button>();
btn.onClick.AddListener(Test); //구독하기
}
void Test() //호출될 함수
{
Debug.Log("버튼 함수 호출 테스트");
}
void StopListener()
{
btn.onClick.RemoveListener(Test); //구독 취소하기
}
}
위 코드는 버튼을 찾아서 변수에 담은 뒤에, 바로 AddListener() 함수를 통해 매개변수로 들어간 Test() 라는 함수를 구독시켰다. 이제 버튼을 누르면 Test() 함수가 호출되면서 로그를 출력할 것이다.
구독 해제도 있다. RemoveListener(Test) 함수를 통해서 Test 함수가 버튼을 구독한 것을 해지(취소?) 할 수 있다.
또한, RemoveAllListener() 도 존재하니 상황에 맞게 잘 쓰자.
정리하며
아직도 왜 코드로 굳이 연결을 하는지 이해하지 못하겠다면 마지막 요약을 해보자면......
당신이 블로그로 드래그 드롭으로 버튼에 함수 연결하는 걸 설명하려면 화면 캡처를 키든가 스크린샷을 켜서 드래그 드롭을 하는 과정을 찍고, 어떤 버튼에 어떤 함수가 연결되어야 하는지 설명을 하거나, OBS를 이용해서 동영상을 찍어서 블로그에 업로드를 해야한다.
근데, 코드로 하면 글로 적당히 설명하고 미리 적어놓았던 코드를 복붙하면 끝난다. 물론 그 만큼 신경을 써야하는 것이 많아지고 글로만 설명하기에 어려운 내용들도 존재하며, 들이는 노력은 차이가 없을 수도 있다.
가장 크게 느껴지는 결과로는 시간이 절약된다. 그 말은 효율성이 좋다는 뜻이다. 그렇다고 블로그 글의 퀄리티가 떨어지는 것이 당연하다는 것은 아니고, 같은 퀄리티의 결과물이라면 다른 결과물에 비해 밀리는 부분이 존재하겠지만 얘기 하고 싶었던 것은 글을 쓰는 것이 같은 퀄리티의 결과물을 내기에는 시간이 줄어든다는 것이다.
위의 예시가 이해가 가지 않을 수도 있다고 생각이 든다. 오히려 드래그 드롭하는 것이 더 효율성이 좋게 느껴질 수도 있는 노릇이다. 하지만, 쓰는 것에는 다 이유가 있고, 장점이 존재한다면 단점도 존재한다는 점을 생각해보면 좋다.
'Unity > Unity 라이브러리' 카테고리의 다른 글
| UI의 위치 값은 두가지? (0) | 2025.10.12 |
|---|---|
| Sprite가 늘어나는 영역을 정해준다, Sprite Border (0) | 2025.10.06 |
| FindObjectOfType<T>와 FindObejctsByType<T> (0) | 2025.10.02 |
| childCount와 GetComponentsInChildren의 차이 (0) | 2025.09.27 |
| URP에서의 카메라 오버레이 (0) | 2025.09.18 |