<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는 타 스크립트에서의 함수까지 관리 감독할 수 있다.
댓글