Delegate ์์์ด๋ ์ ์ฒด ์์ ์ค ์ผ๋ถ๋ฅผ ๋๊ตฐ๊ฐ๋ฅผ ๋์ ํด ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ํํ๋ฅผ ๋งํ๋ค.
๋ ๋ค๋ฅธ ํํ์ ์์์ผ๋ก C# ์ ๋๋ฆญ๊ณผ Action ๋๋ Action<T>๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ด ์๋ค.
์์์ ์ฌ์ฉํ๋ ์ฃผ์ํ ๋ ๊ฐ์ ํจํด์ ์ค์ ๊ฐ๋ฅ๋ฉ์๋(Configurable method)ํจํด๊ณผ
์์(delegation) ํจํด์ด๋ค.
1. ์ค์ ๊ฐ๋ฅ ๋ฉ์๋ ํจํด
์ผ์ด๋ ํจ์์ ์ผ๋ถ๋ฅผ ๋ค๋ฅธ ๋ฉ์๋๋ก ์ ๋ฌํด ์์ ์ ์๋ฃํ๋๋ฐ ์ฌ์ฉํ๋ ํจํด์ด๋ค.
์ด ํจํด์ ๊ณ ์ ํ ๋ฐฉ์์ ๊ฐ์ง ๊ฐ๋ณ ์ฝ๋๊ฐ ๊ณตํต๋ ์์ ์ ์ํํ ๋ ์ฌ์ฉํ๋ค.
์๋ฅผ ๋ค๋ฉด ๊ฑท๊ธฐ, ๋ฐ๊ธฐ, ํ์ ๋ฑ์ด ์ด์ ํด๋นํ๋ค.
์ด ๋ชจ๋ ์์ ์ ์บ๋ฆญํฐ์ ๊ธฐ๋ณธ ํ์๊ฐ ๋ ์ ์๋ค.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DeleTest : MonoBehaviour
{
//์์ ๋ฉ์๋ ์๊ทธ๋์ฒ ์ ์
delegate void RobotAction();
//์์์ ์ํ ํ๋ผ์ด๋น ์์ฑ
RobotAction myRobotAction;
private void Start()
{
//์์์ ์ํ ๊ธฐ๋ณธ ๋ฉ์๋ ์ค์
myRobotAction = RobotWalk;
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.W)) myRobotAction = RobotWalk;//์์ ๋ฉ์๋๋ฅผ ๊ฑท๊ธฐ๋ก ์ค์
if (Input.GetKeyDown(KeyCode.R)) myRobotAction = RobotRun;//์์ ๋ฉ์๋๋ฅผ ๋ฐ๊ธฐ๋ก ์ค์
//์
๋ฐ์ดํธ ๋ ์ ํ๋ ์์์ ์คํ
myRobotAction();
}
void RobotWalk()
{
Debug.Log("๋ ๋.. ๋ ๋.. ๊ฑท๋๋ค.. ๋ก๋ณดํธ..");
}
void RobotRun()
{
Debug.Log("๋๋ ๋๋ ๋ด๋ค ๋ก๋ด..");
}
}
2. ์์ ํจํด
์์ ํจํด์ ๋ฉ์๋๊ฐ ํฌํผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํธ์ถํ๋ ์ํฉ์์ ์ฌ์ฉ๋๋ค.
์์ฒญํ ์์ ์ด ์๋ฃ๋๋ฉด ๋ค์ ๋ฉ์ธ ํจ์๋ก ๋์์จ๋ค.
์น์์ ์๋ฃ๋ฅผ ๋ค์ด๋ก๋ํ ๋ ์ด ํจํด์ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
๋ค์ด๋ก๋๊ฐ ๋๋๋ฉด ๋ฐ์ ๋ด์ฉ์ ๊ฐ์ง๊ณ ํน์ ํ ํ์ ์ฒ๋ฆฌ๋ฅผ ์งํํ๋ ํํ์ด๋ค.
(์ฝ๋ ์๋ต)
3. ํฉ์ฑ ์์
๋ค์์ ํจ์๋ฅผ ํ๋์ ์์์ ์ง์ ํ ์ ์๋ค.
์ด ๊ธฐ๋ฅ์ ๋ค์์ ๊ณต์ฉ ํจ์๋ฅผ ์ฐ๊ฒฐํด ์คํํ๋ ค๊ณ ํ ๋ ๋งค์ฐ ์ ์ฉํ๋ค.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DeleTest : MonoBehaviour
{
//WorkerManager์์
delegate void MyDelegateHook();
MyDelegateHook ActionTodo;
public string WorkerType = "Peon";
//์์ํ ๋ ์์ปค์๊ฒ ์์
์ ํ ๋นํ๋ค
void Start()
{
//์ง์์ ํ ์ผ์ด ๋ง๋ค
if(WorkerType == "Peon")
{
ActionTodo += DoJob1;
ActionTodo += DoJob2;
}
//๊ทธ ์ธ ๋๋จธ์ง๋ ๋ค๋ฅธ ์ผ์ ํ๋ค
else
{
ActionTodo += DoJob3;
}
}
//์
๋ฐ์ดํธ์์ ActionToDo์ ์ง์ ๋ ์ผ์ ์ํํ๋ค
void Update()
{
ActionTodo();
}
void DoJob1()
{
Debug.Log("์ผ์ ๊ฒํ ");
}
void DoJob2()
{
Debug.Log("์๋ฅ์ ์ถ");
}
void DoJob3()
{
Debug.Log("๋ชฐ๋ ๋ชจ๋ฐ์ผ๊ฒ์!");
}
}
'Unity > Unity(C#์ค๊ธ)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ์ฅ๋ฉ์๋ (0) | 2022.01.13 |
---|---|
๋ค์ํ๊ฒ ์์ฑํ ์ ์๋ ๋๋ค์ (0) | 2022.01.12 |
์ด๋ฒคํธ (0) | 2021.12.26 |
์ ๋ํฐ Reflection ์ฌ์ฉํ์ฌ ํ ํด๋์ค๋ฅผ ์ปดํฌ๋ํธ๋ก ๊ฐ์ ธ์ค๊ธฐ, ํ ํด๋์ค ์ธ์คํด์ค์ ์ ๊ทผํ๊ธฐ (0) | 2021.12.15 |