유니티

[C#] Event / Action

simstealer 2022. 7. 21. 16:36

Event

- 이벤트 자체는 어떤 일을 실행하지 않지만 이벤트를 구독하는 처리들이 연쇄적으로 실행됩니다.

- 이벤트와 이벤트 리스너로 구분됩니다.

- 이벤트가 발동되면 이벤트에 등록된 메서드 들이 모두 실행됩니다. 이 메서드들을 이벤트 리스너라고 합니다.

- 이벤트는 이벤트 리스너들에게 알리는 역할만 합니다. 기능에는 관심이  없습니다.

 > 이로 인해 메서드들과 결합도가 낮아 견고한 커플링 해소가 가능합니다.

 > 견고한 커플링이란 어떤 클래스가 다른 클래스의 구현에 강하게 결합되어 코드를 유연하게 변경할 수 없는 상태입니다.

 

Action

- 입력과 출력이 없는 메서드를 가리킬 수 있는 델리게이트입니다.

public class A : MonoBehaviour
{
    Action on; // 메서드 할당을 할 수 있는 on 델리게이트 생성.
    void Start()
    {
        on += Test; // Test 메서드를 on 델리게이트에 등록.
    }
    
    void Update()
    {
        on(); // on 델리게이트 실행을 하면 등록되어 있는 Test메서드가 실행된다.
    }
    
    void Test()
    {
        Debug.Log("Test!");
    }
}

event Action

// Action 앞에 event를 붙이면 클래스 외부에서는 해당 델리게이트를 실행할 수 없게 됩니다.
// 소유하고 있는 측, 외에서 실행하는 것을 방지 할 수 있는것입니다.

public class Player : MonoBehaviour
{
	public event Action onDeath;
    public void Die()
    {
    	onDeath(); // 소유자가 델리게이트 실행.
    }
}

public class GameData : MonoBehaviour
{
	void Start()
    {
    	Player player = FindOfType<Player>();
        player.onDeath += Save; // 외부 클래스에서 등록을 할 수 있지만
        // player.onDeath(); // 실행을 할 순 없다
    }
    
    public void Save()
    {
    	Debug.Log("Game Save!");
    }
}