본문 바로가기
개발/Unity

유니티 C# Dictionary와 delegate를 이용한 함수 포인터

by 피로물든딸기 2022. 3. 18.
반응형

Unity 전체 링크

 

C, C++에서의 함수 포인터를 C#에서는 delegate를 이용한다.

 

심플 이벤트 핸들러에서 event 변경에 따라 함수를 실행하고 싶다고 하자.

함수 포인터를 사용하지 않는다면 CURRENT_EVENT를 if/else로 매번 처리해서 이벤트를 실행해야 한다.

    string currentEvent
    {
        set
        {
            if (CURRENT_EVENT == value) return;

            CURRENT_EVENT = value;

            if (CURRENT_EVENT == "이벤트 시작") startEvent();
            else if (CURRENT_EVENT == "이벤트 종료") endEvent();
            /* ... */
        }
        get
        {
            return CURRENT_EVENT;
        }
    }

 

Dictionary와 delegate를 이용해 위의 코드를 더 간단히 만들어보자.


delegate를 하나 선언하고, string을 key로 delegate를 value로 하는 Dictionary를 선언한다.

    delegate void eventFunc();
    Dictionary<string, eventFunc> eventDictionary = new Dictionary<string, eventFunc>();

 

스크립트가 실행되면 Add 메서드로 eventDictionary에 이벤트를 추가한다.

    void startEvent()
    {
        Debug.Log("이벤트가 시작되었습니다.");
    }

    void endEvent()
    {
        Debug.Log("이벤트가 종료되었습니다.");
    }

    private void Start()
    {        
        eventDictionary.Add("이벤트 시작", startEvent);
        eventDictionary.Add("이벤트 종료", endEvent);
    }

 

프로퍼티에서는 ContainsKey 메서드를 이용하여 key가 존재하는 경우, value에 해당하는 delegate실행한다.

    string currentEvent
    {
        set
        {
            if (CURRENT_EVENT == value) return;

            CURRENT_EVENT = value;

            if (eventDictionary.ContainsKey(CURRENT_EVENT)) eventDictionary[CURRENT_EVENT]();
        }
        get
        {
            return CURRENT_EVENT;
        }
    }

 

이제 새로운 EVENT가 추가되더라도 Start에 Add로 등록해주기만 하면 모든 이벤트를 처리할 수 있다.

최종 코드는 아래와 같다.

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

public class SimpleEventHandler : MonoBehaviour
{
    delegate void eventFunc();
    Dictionary<string, eventFunc> eventDictionary = new Dictionary<string, eventFunc>();

    string EVENT = "";
    string CURRENT_EVENT = "";
   
    string currentEvent
    {
        set
        {
            if (CURRENT_EVENT == value) return;

            CURRENT_EVENT = value;

            if (eventDictionary.ContainsKey(CURRENT_EVENT)) eventDictionary[CURRENT_EVENT]();
        }
        get
        {
            return CURRENT_EVENT;
        }
    }

    private void OnMouseDown()
    {
        EVENT = "이벤트 시작";
    }

    private void OnMouseUp()
    {
        EVENT = "이벤트 종료";
    }

    void startEvent()
    {
        Debug.Log("이벤트가 시작되었습니다.");
    }

    void endEvent()
    {
        Debug.Log("이벤트가 종료되었습니다.");
    }

    private void Start()
    {        
        eventDictionary.Add("이벤트 시작", startEvent);
        eventDictionary.Add("이벤트 종료", endEvent);
    }

    void Update()
    {
        currentEvent = EVENT;   
    }
}

 

이벤트가 정상 실행되는 것을 알 수 있다.

 

Unity Plus:

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Unity Pro:

 

Unity Pro

The complete solutions for professionals to create and operate.

unity.com

 

Unity 프리미엄 학습:

 

Unity Learn

Advance your Unity skills with live sessions and over 750 hours of on-demand learning content designed for creators at every skill level.

unity.com

반응형

댓글