본문 바로가기

유니티

[ 유니티 ] Action (Delegate)과 event 키워드

[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번 호출");
    }
}

 

 

출처