본문 바로가기
카테고리 없음

[코딩일기] C# delegate

by mania2321 2024. 6. 25.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{

    // delegate를 활용하면 모든 함수(메소드)들을 한 군데에 넣어서 관리할 수 있다. (예제에서는 chain이라는 delegate에 SetPower와 SetDefence를 넣어서 관리)

    public delegate void ChainFunction(int value);
    // 참고 : delegate는 class다. (class는 ChainFunction과 같이 초록색 글자로 나옴)

    ChainFunction chain;        // class 할당받기

    int power;
    int defence;

    // parameter 값(int value)을 받아서, power 값과 defence 값을 올려보자. 

    public void SetPower(int value)       // power 값 조절할 수 있는 메소드
    {
        power += value;
        print("power의 값이 " + value + "만큼 상승했습니다. 총 power의 값 = " + power);
    }

    public void SetDefence(int value)     // defence 값 조절할 수 있는 메소드
    {
        defence += value;
        print("defence의 값이 " + value + "만큼 상승했습니다. 총 defence의 값 = " + defence);
    }
    
    
    void Start()
    {
        // SetPower(5);       // power 값은 5
        // SetDefence(5);     // defence 값은 5
        // 이런 식으로 함수를 일일이 만들어서 값을 관리하기엔 너무 힘들다... 그래서 delegate라는 클래스를 사용한다. 

        chain += SetPower;       // chain이라는 class에 SetPower 함수를 적용시킴 
        chain += SetDefence;     // chain이라는 class에 SetDefence 함수를 적용시킴
        // 주의! chain = SetPower ==> '='으로 하면 '우항'의 함수만 적용됨.

        // chain -= SetDefence;     // 이걸 넣으면 SetPower만 출력됨.
        // chain -= SetPower;
        if(chain != null)       // 이 조건을 넣지 않으면 오류가 생긴다. 위에 적힌 -= 에 의하면 아무것도 없으므로...(+= 는 항목을 추가, -=는 항목을 제거)
        {
            // 한 번에 호출시키고 싶으면?
            chain(5);       // SetPower와 SetDefence에 5가 반영됨.
        }
    }
}

댓글