System.Action ? ( 델리게이트 )

DevCho1107

·

2020. 2. 3. 17:43

델리게이트와 event 키워드




Action 타입은 입력과 출력이 없는 메소드를 가리킬 수 있는 델리게이트이다. 

델리게이트란 메소드를 값으로 할당 받을 수 있는 타입이다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
using UnityEngine;
 
public class Cleaner MonoBehaviour {
    Action onClean;
    
    void Start() {
        //+=를 사용해 메소드를 등록한다. 이때, () 괄호는 붙이지 않는 것에 주의한다.
        onClean += CleaningRoomA;    // () 붙이지 않는다.
        onClean += CleaningRoomB;
    }
    
    void Update() {
        if(Input.GetMouseButtonDown(0)) 
        {    
            onClean(); // CleaningRoomA 와 CleaningRoomB 실행
        }
    }
    
    void CleaningRoomA()
    {
        Debug.Log("방 A청소");
    }
 
    void CleaningRoomB()
    {
        Debug.Log("방 B청소");
    }
 
cs

이러한 Action Delegate를 통해 이벤트를 구현할 수 있다.
위 코드에 public 키워드를 추가하여 외부로 공개하고, 다른 클래스의 메소드를 onClean 델리게이트에 추가해주면 된다.
이러한 방식의 구현을 통해 코드간의 강한 결합성을 해소한다.

위의 말들을 정리해서 말하자면, 이벤트 리스너가 이벤트를 구독하고 이를 통해 견고한 커플링 해소가 가능하다고 할 수 있다.

추가적으로 델리게이트 타입의 변수는 event 키워드를 붙여 선언 할 수 있으며, 해당 클래스 외부에서 해당 델리게이트를 실행할 수 없게끔 해준다. (접근지정자과 유사한 개념) 



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
using UnityEngine;
 
public class Cleaner MonoBehaviour {
    public event Action onClean;
    
    void Start() {
        //+=를 사용해 메소드를 등록한다. 이때, () 괄호는 붙이지 않는 것에 주의한다.
        onClean += CleaningRoomA;    // () 붙이지 않는다.
        onClean += CleaningRoomB;
    }
    
    void Update() {
        if(Input.GetMouseButtonDown(0)) 
        {    
            onClean(); // CleaningRoomA 와 CleaningRoomB 실행
        }
    }
    
    void CleaningRoomA()
    {
        Debug.Log("방 A청소");
    }
 
    void CleaningRoomB()
    {
        Debug.Log("방 B청소");
    }
 
 
public class OtherClass MonoBehaviour {
    
    void Start()
    {
        Cleaner clean = FindObjectType<Cleaner>();
        //이벤트 리스너가 이벤트를 구독.
        clean.onClean += ExitRoom;
    }
 
    void ExitRoom()
    {
        Debug.Log("방을 나간다");
    }
 
    void Update()
    {
        clean.onClean(); // 실행 불가 ( event 키워드 )
    }
}
cs

다형성을 사용하여 자식클래스 타입의 오브젝트를 부모 클래스 타입으로 다룰 수 있습니다. 
virtual로 선언된 가상 메소드는 자식 클래스에서 override로 재정의 할 수 있습니다. 
델리게이트(delegate)는 메서드를 할당받아 원하는 시점에 할당된 메소드를 매번 실행할 수 있는 타입입니다. 
Action은 입력과 출력이 없는 델리게이트 타입이다.
이벤트는 연쇄적인 처리를 발생시키는 사건이다. 
이벤트를 사용해 한 클래스에서 일어난 사건을 다른 클래스에서 알 수 있습니다. 
이벤트를 구독하는 메서드를 이벤트 리스너라고 부릅니다. 
이벤트는 클래스 외부로 델리게이트 변술르 공개하여 구현할 수 있습니다. 
event 키워드는 이벤트를 클래스 외부에서 발동할 수 없게 합니다. 
슬라이더 컴포넌트는 value값에 따라 슬라이더를 채웁니다. 
슬라이더 컴포넌트는 슬라이더의 모습을 그리지 않습니다. 
Fill 게임 오브젝트의 이미지 컴포넌트가 슬라이더의 모습을 그립니다. 
UI 컴포넌트의 interactable 필드를 체크 해제 하면 상호작용이 불가능합니다. 
캔버스 컴포넌트의 렌더모드를 World Splace로 변경하면 UI를 게임월드에 배치할 수 있다. 
내비메시는 내비메시 에이전트가 이동할 수 있는영역이다. 
내비메시는 실시간으로 생성되지 않으므로 미리 구워야한다. (bake)
-레트로의 유니티 게임프로그래밍 에센스 발췌 -


'< Programming > > C#' 카테고리의 다른 글

유니티 포스트 프로세싱(Post processing)  (0) 2020.02.04
익명함수와 람다식  (0) 2020.02.04
interface 사용하기  (0) 2020.02.03
유니티 스크립트 : 지정 축 기준으로 회전  (0) 2020.01.09
박싱 언박싱  (0) 2020.01.07