[Action]
[정의]
Action 타입은 입력과 출력이 없는 메소드를 가리킬 수 있는 델리게이트이다 .
cf)델리게이트란 ? 대리자 . c++ 함수포인터와 같이 메서드를 참조하는 대리자이다 .
델리게이트가 대신 할 수 있는 메서드는 반환형 / 매개변수 종류와 개수가 모두 일치해야함 .
[사용]
using UnityEngine;
public class Cleaner : MonoBehaviour {
Action _onButtonDown;
void Awake() {
//메소드를 등록.이때 ()는 붙이지 않음
_onButtonDown += Logger_1;
_onButtonDown += Logger_2;
}
void Update() {
if(Input.GetMouseButtonDown(0))
{
_onButtonDown();
}
}
void Logger_1()
{
Debug.Log("1번 호출");
}
void Logger_2()
{
Debug.Log("2번 호출");
}
[Event 키워드]
Action을 public으로 구현하고 ,이벤트 리스너가 이벤트를 구독하는 형태의 구현을 하면 견고한 커플링의 해소가 가능하다.
이때 델리게이트 타입의 변수는 event 키워드를 붙여 해당 클래스 외부에서는 등록만 될 뿐 델리게이트의 실행을 막아준다
(일종의 접근 제한자)
using UnityEngine;
public class Test1 : MonoBehaviour {
//event 키워드가 붙으면 외부에서 등록은 가능하지만 사용은 불가하다
public event Action _onButtonDown;
}
public class Test2 : MonoBehaviour {
void Awake()
{
Test1 test1=FindObjectofType<Test1>();
test1._onButtonDown += Logger_1; //이건 가능
//test1_onButtonDown(); event 키워드로 직접 호출은 불가
}
void Logger_1()
{
Debug.Log("1번 호출");
}
}
출처
'유니티' 카테고리의 다른 글
[ 유니티 ] 자식 오브젝트 삭제하기 (0) | 2023.04.04 |
---|---|
[ 유니티 ] 유니티 2021.3.16f1 설치 오류 (0) | 2023.03.29 |
[유니티] Some objects were not cleaned up when closing the scene. (Did you spawn new GameObjects from OnDestroy?) 오류 (0) | 2023.02.20 |
[유니티] 캔버스를 부모로 설정시 Transform이 바뀌는 문제 해결 (0) | 2023.02.16 |
[UI Tool Kit] 04 . 레이아웃과 트랜지션 애니메이션 (0) | 2023.02.13 |