[Unity] Button OnClick Event is triggered twice

2024. 8. 26. 14:46·게임개발/Unity

유니티에서 버튼 UI를 쓰면 OnClick 이벤트에 메서드를 할당하여 사용하게 된다.

 

메서드는 보통 인스펙터 창에서 추가하거나, 혹은 스크립트에서 button.onClick.AddListener()를 사용하여 넣어준다.

 

인스펙터 창 OnClick

using System;
using UnityEngine;
using UnityEngine.UI;

public class TestButton: MonoBehaviour
{
    Button button;
    void Awake()
    {
        button = GetComponent<Button>();
        button.onClick.AddListener(OnClickButton);
    }
    
    void OnClickButton()
    {
    	Debug.Log($"Button clicked");
    }
}

 

그런데 C# 스크립트로 메서드를 할당하면, 버튼을 클릭했을 때 버튼에 할당된 메서드가 두 번 실행되는 문제가 발생한다.

 

1. Input Setting

구글에 검색했을 때 처음 나온 해결책은 InputSetting을 바꾸는 것이었다.

https://discussions.unity.com/t/button-onclick-event-is-firing-twice/600697

 

하지만 나의 경우 Input Setting은 문제가 없어서 도움은 되지 않았다.

 

2. Remove All Listener

이후에 검색했을 때 나온 방법으로, AddListener를 하기 전에 RemoveAllListener를 통해 메서드를 다 지워준다.

https://stackoverflow.com/questions/64338261/button-onclick-listener-triggers-twice

아마 이유는 한 번 함수가 추가되고 나서, 게임을 껐을 때 함수가 남아있어 두 번 실행되는 것으로 보인다.

 

애초에 이런 일이 발생하지 않도록 OnDestroy나 OnDisable에서 RemoveAllListener를 해주는 것이 나아보인다.

using System;
using UnityEngine;
using UnityEngine.UI;

public class TestButton : MonoBehaviour
{
    Button button;
    void Awake()
    {
        button = GetComponent<Button>();
        // AddListener 이전에 등록된 모든 메서드 제거
        //button.onClick.RemoveAllListeners();
        button.onClick.AddListener(OnClickButton);
    }

    void OnClickButton()
    {
        Debug.Log($"Button clicked");
    }

    void OnDisable()
    {
        button.onClick.RemoveAllListeners();
    }

    void OnDestroy()
    {
        button.onClick.RemoveAllListeners();
    }
}

 

3. With UnityAction

만약 onClick에 UnityAction을 만들어 넣었다면, UnityAction도 마찬가지로 등록된 함수들을 없애줘야 한다.

using System;
using UnityEngine;
using UnityEngine.UI;

public class TestButton : MonoBehaviour
{
    Button button;
    UnityAction buttonEvent;
    void Awake()
    {
        button = GetComponent<Button>();
        buttonEvent += OnClickButton;
        button.onClick.AddListener(buttonEvent);
    }

    void OnClickButton()
    {
        Debug.Log($"Button clicked");
    }

    void OnDisable()
    {
        buttonEvent -= OnClickButton;
        button.onClick.RemoveAllListeners();
    }

    void OnDestroy()
    {
        buttonEvent -= OnClickButton;
        button.onClick.RemoveAllListeners();
    }
}

 

저작자표시 변경금지 (새창열림)

'게임개발 > Unity' 카테고리의 다른 글

[Unity] NetworkVariable, INetworkSerializable Synchronization Problem  (0) 2025.06.05
[Unity] StopCoroutine, 코루틴 중지시키기  (3) 2025.06.03
[Unity] 마우스 커서 숨기기, 마우스 화면 고정(cursor visible, cursor lock)  (1) 2023.12.17
표준국어대사전 API 이용 (Unity, C#)  (0) 2022.08.19
Unity User SSA CL Certificate Error  (0) 2022.08.15
'게임개발/Unity' 카테고리의 다른 글
  • [Unity] NetworkVariable, INetworkSerializable Synchronization Problem
  • [Unity] StopCoroutine, 코루틴 중지시키기
  • [Unity] 마우스 커서 숨기기, 마우스 화면 고정(cursor visible, cursor lock)
  • 표준국어대사전 API 이용 (Unity, C#)
깜냥c
깜냥c
게임 개발/클라이언트/AI/PS/기타 연구
  • 깜냥c
    Choice Program
    깜냥c
  • 전체
    오늘
    어제
    • 분류 전체보기 (57)
      • 언어 (11)
        • C,C++ (9)
        • C# (1)
        • Python (1)
      • PS (20)
        • 백준 문제 (19)
        • 알고리즘 (1)
      • 인공지능 (2)
      • 게임제작 (7)
      • 게임개발 (14)
        • Unity (7)
        • Unreal Engine (5)
        • Godot Engine (1)
      • 기타 (2)
  • 블로그 메뉴

    • 홈
    • 방명록
    • 블로그 소개
  • 링크

    • 김병장의 IT 블로그
    • 식품영양과 데이터사이언스
  • 공지사항

  • 인기 글

  • 태그

    백준
    BOJ
    C언어
    Godot
    배낭 문제
    Unreal
    unity
    입출력
    C++
    UE5
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
깜냥c
[Unity] Button OnClick Event is triggered twice
상단으로

티스토리툴바