오늘 버튼 사운드 관련 작업을 하다가 클릭음을 넣어주는 작업에서 비슷한 두 코드를 두고 궁금증이 생겨서 찾아보고 정리한다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
#if UNITY_EDITOR
using UnityEditor;
#endif
public class BtnSound : MonoBehaviour
{
[SerializeField] private List<Button> _buttons;
//private List<Button> _buttons;
#if UNITY_EDITOR
[ContextMenu("SetComponent")]
public void SetComponent()
{
if (_buttons != null)
{
_buttons.Clear();
}
Button[] buttons = GameObject.FindObjectsOfType<Button>(true);
_buttons.AddRange(buttons);
}
#endif
[SerializeField] private AudioClip btnClip;
private void Start()
{
foreach (var button in _buttons)
{
button.onClick.AddListener(PlayBtnClickSound);
}
}
public void PlayBtnClickSound()
{
SoundManager.Instance.PlayUnitSFX(btnClip);
}
}
먼저 버튼 클릭은 기본적으론 위 코드를 통해 하이어라키 창에 있는 모든 버튼 컴포넌트를 수집해서 시작할때 추가해주는 식이다.
Find함수가 활용되지만 이는 에디터 단계에서 사용되므로 게임 사용시의 문제는 없다.
다만, 동적으로 생성되는 버튼들은 에디터 단계에서 수집이 불가능하므로 아래와 같은 두 코드 중 하나를 사용하여 클릭음을 추가해줬다.
button.onClick.AddListner(() => PlayBtnClickSound());
button.onClick.AddListner(PlayBtnClickSound);
하나는 람다식, 하나는 메서드를 사용한 방법이다.
• 설명: 람다 표현식은 익명 메서드를 정의하는 방법으로, onClick 이벤트가 발생할 때마다 btnSound.PlayBtnClickSound()를 호출한다.
• 장점: 람다 표현식을 사용하면 추가적인 로직을 포함할 수 있다. 예를 들어, 여러 메서드를 호출하거나 조건문을 추가할 수 있다.
• 예시:
buttonInstance.onClick.AddListener(() => {
PlayBtnClickSound();
Debug.Log("Button clicked!");
});
• 설명: 메서드 그룹은 메서드의 이름만을 사용하여 해당 메서드를 이벤트에 추가하는 방식이다.
• 장점: 코드가 더 간결하고 직관적이다. 추가적인 로직이 필요 없을 때 사용하기 좋다.
• 주의사항: 메서드 그룹을 사용할 때는 메서드가 매개변수를 가지지 않아야 한다. 그렇지 않으면 컴파일 오류가 발생한다.
• 람다 표현식: 추가적인 로직을 포함할 수 있으며, 더 유연하다.
• 메서드 그룹: 코드가 간결하고 직관적이다.