Ssssong += Dev

[C#] 델리게이트(delegate) 본문

개발/공부

[C#] 델리게이트(delegate)

ssong_dev 2022. 6. 17. 12:59

델리게이트는 정해진 기능을 대신 할 수 있는 대리자이다.

delegate 리턴타입 델리게이트명(매개변수) 형식으로 규격을 정해줄 수 있다.

//델리게이트 선언
public delegate void PrintInfoDel();

//델리게이트 형식을 매개 변수로 받아오기
void PrintInfo(PrintInfoDel printInfoDel)
{
    Debug.Log("---------------");
    target.ShowInfo();
    Debug.Log("---------------");
}

void Start()
{
    Player player = new Player();

    //델리게이트 적용
    PrintInfo(player.ShowInfo);
}

 

 

델리게이트는 비슷한 형식의 함수가 일부분의 기능만 다르게 동작할 때,

해당 기능을 델리게이트로 치환해서 함수의 중복을 줄일 수가 있다.

 

 

델리게이트는 체인이 가능하다. 체인을 통해서 델리게이트 기능을 조건에 따라 추가하고 빼는 것이 자유롭다.

public Slider hpSlider;
public int hp = 100;
public int Hp
{
    get { return hp; }
    set { 
        hp = value;

        onReduceHp();

        if(hp <= 0)
        {
            Die();
        }
    }
}

public delegate void OnReduceHp();
public OnReduceHp onReduceHp;

private void Start()
{
    onReduceHp += SetHpSlider;
    onReduceHp += GameManager.instance.ScoreUp;
}


void SetHpSlider()
{
    hpSlider.value = (float)hp / 100;
    Debug.Log(hp);
}
public class BerserkerZone : MonoBehaviour
{

    private void OnTriggerEnter(Collider other)
    {
        if(other.GetComponent<Monster>() != null)
        {
            other.GetComponent<Monster>().onReduceHp += transform.parent.GetComponent<Player>().BerserkerGageUp;
        }
    }
    private void OnTriggerExit(Collider other)
    {
        if (other.GetComponent<Monster>() != null)
        {
            other.GetComponent<Monster>().onReduceHp -= transform.parent.GetComponent<Player>().BerserkerGageUp;
        }
    }

}

 

위 코드는 트리거 충돌이 일어나는 조건에 따라 델리게이트에 체인을 걸어 쉽게 기능을 추가하고 빼고 있다.

델리게이트는 코드 간의 결합도를 느슨하게 하여 확장성을 더 좋게 할 수 있다.

 

 

이미 내장되어 있는 델리게이트  Action도 있다. 

public delegate void Action();로 유니티 상에서 등록되어 있으므로 따로 델리게이트 만들지 않아도 된다.

using System;

public Action onReduceHP;
//여기서 Action은 이미 델리게이트로 등록되어 있다.
//public delegate void Action(); 이렇게 System namespace에 포함되어 있다.

public Action<float> onDamage;
//매개변수가 있어야 하는 경우 이렇게 public delegate void Action<in T>(T obj);도 정의가 되어 있다.

 

 

리턴 타입을 지정하는 델리게이트도 있다.

//리턴타입이 int
public Func<int> returnInt;

//float 타입 매개변수, int 타입 리턴
public Func<float, int> funcDel;

 

event 키워드 사용 시 해당 클래스 내에서만 사용 가능하다. 단, 체인은 다른 클래스에서도 걸어줄 수 있다.

'개발 > 공부' 카테고리의 다른 글

[C#] 람다식  (0) 2022.06.20
[유니티] 실행 함수 순서 정하기  (0) 2022.06.18
[유니티, C#] 일반화(Generic)  (0) 2022.06.15
[유니티, C#] 확장메서드  (0) 2022.06.15
[유니티] 충돌 검사 짤팁  (0) 2022.06.14