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

[코딩일기] C# event (delegate와 연관 있음)

by mania2321 2024. 6. 25.

<Test 스크립트>

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과 같이 초록색 글자로 나옴)
    public static event ChainFunction OnStart;      // static으로 접근했기 떄문에 다른 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()
    {
        OnStart += SetPower;  
        OnStart += SetDefence;
    }

    private void OnDisable()
    {
        OnStart(5);
    }
}

<Test2 스크립트>

using JetBrains.Annotations;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test2 : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        Test.OnStart += Abc;        // Test 스크립트에 있던 OnStart에 Abc 추가됨.
                                    // 고로, OnStart에는 Test 스크립트에 있던 SetPower함수, SetDefence함수 그리고 Test2에 있는 Abc함수를 포함하게 되는 것이다.
    }

    public void Abc(int value) // 여기서 int value를 하는 이유는, Test스크립트에서 만들었던 class인 ChainFunction이 int value로 만들었기 때문. 그러므로 연관된 class는 형식을 일치시켜 줘야됨.
                               // Test 스크립트에 있던 OnStart에 추가시킬거다.
    {
        print(value + "값이 증가하였습니다.");
    }
}

// - 정리 -
// 일반 delegate는 하나의 스크립트 안에 있는 함수를 모두 관리 감독할 수 있고,
// 그 delegate를 받아서 사용하는 event는 타 스크립트에서의 함수까지 관리 감독할 수 있다. 

댓글