Quick Reference
Unity Button은 고정 prefab 행동은 Inspector, 런타임 조건은 코드로 연결하고, RemoveAllListeners()는 runtime listener만 지웁니다.
- 기준 버전은 Unity 6.5 (6000.5), Unity UI 2.0.0입니다. Button의 On Click Inspector 목록은 persistent listener,
button.onClick.AddListener는 runtime listener입니다. - 한 버튼의 행동 소유자를 정합니다. 단순 prefab wiring은 Inspector, 화면 controller와 데이터 흐름은 코드 등록이 잘 맞습니다. 같은 행동을 두 경로에서 등록하면 두 번 실행됩니다.
RemoveAllListeners()는 runtime listener만 제거합니다. Inspector persistent listener를 지우는 정리 API가 아니며, 공용 Button의 모든 runtime 행동을 지워도 되는 소유자만 사용합니다.
Inspector와 이벤트 연결
- Interactable이 꺼지면 Button은 클릭을 처리하지 않습니다.
CanvasGroup.interactable, parent active 상태, Graphic Raycaster도 함께 영향을 주므로 Button 자체만 보고 원인을 판단하지 않습니다. - Transition은
None,Color Tint,Sprite Swap,Animation입니다.Target Graphic이 지정되지 않았거나 raycast 대상이 아니면 클릭 면적·상태 전환이 의도와 달라질 수 있습니다. - Inspector의 **On Click()**은 scene/prefab에 직렬화되는 persistent listener입니다. 디자이너가 고정된 prefab 행동을 연결하기 좋지만, 런타임 조건·등록 시점·해제는 코드에서 보이지 않습니다.
스크립트 연결
csharp
using UnityEngine;
using UnityEngine.UI;
public sealed class SettingsPopup : MonoBehaviour
{
[SerializeField] private Button closeButton;
private void OnEnable()
{
closeButton.onClick.AddListener(Close);
}
private void OnDisable()
{
closeButton.onClick.RemoveListener(Close);
}
private void Close()
{
gameObject.SetActive(false);
}
}AddListener에 같은 method group을 반복 등록하면 호출도 반복됩니다. 재사용 popup은OnEnable/OnDisable을 한 쌍으로 두거나Awake에서 한 번 등록하는 방식 중 하나를 고릅니다.- 람다는 인자를 캡처할 때 편하지만, 같은 delegate instance를 보관하지 않으면
RemoveListener로 정확히 해제할 수 없습니다. 풀링되는 목록 Button은 bind object가 listener를 소유하고 unbind에서 해제합니다. RemoveAllListeners()는 등록한 runtime listener의 소유자가 명확하고 Button이 전용 인스턴스일 때만 씁니다. 다른 component가 등록한 listener까지 지울 수 있습니다.
자주 틀리는 부분
On Click Inspector와 AddListener를 같은 행동에 겹치지 마세요. 화면은 한 번 열렸는데 저장·씬 전환·사운드가 두 번 실행되는 원인이 됩니다. prefab 기본 동작과 controller runtime 동작의 경계를 팀 규칙으로 정하세요.
버튼이 안 눌린다고 onClick을 다시 등록하지 마세요. Interactable, CanvasGroup, EventSystem/Input Module, Graphic Raycaster, 투명 Raycast Target blocker를 먼저 확인해야 합니다.
참고 링크
2 sources