본문 바로가기
디지털노마드

챗GPT게임개발63: 다양한 이벤트 처리 방식과 그 동작 예제

by 인텔리노마드라이프 2024. 7. 14.
728x90

안녕하세요. 인텔리원스튜디오(IntelliOneStudio)입니다.

이번 시간에는 이벤트 처리 방식의 다양한 방법과 그 동작 방식을 알아볼까해요.

 

[참고] Unity에 대한 경험이 없었지만 챗GPT를 활용해서 3주만에 개발했어요. 약간의 수정은 있었지만 99% 코딩은 챗GTP가 했어요. 개발에 참고하세요.

* APP Store 에서 다운로드 

https://apps.apple.com/kr/app/%EB%86%8D%EB%B6%80%EC%9D%98-%EA%BF%88/id6479183930

 

‎농부의 꿈

‎오래된 전설이 숨겨져 있는 [농부의 꿈]목장 한구석에서 ‘비밀의 문'과 '마법 책'이 발견되었어요. [변신하는 동물들] 병아리가 합쳐져 닭이 되고, 닭이 합쳐져 고슴도치로 변신하며, 점점 더

apps.apple.com

 

*Google Play 에서 다운로드

https://play.google.com/store/apps/details?id=com.intellione.farmersfirstdream&pcampaignid=web_share

 

농부의 꿈 - Google Play 앱

평화로운 목장에서 신나는 동물 합치기 무료게임 (바람, 뚫어뻥, 밧줄, 무중력 등 매직 아이템 활용해 병아리를 젖소로 키워보세요.)

play.google.com

 

아래와 같이 ChatGPT에게 질문했어요.

 ChatGPT 답변 내용 중 제가 별도로 표시한 파란색 내용을 기준으로 읽으시면 좀 더 이해가 쉽게 될거예요.

 

[질문] 안녕 ChatGPT, 다양한 이벤트 처리 방식에 대해 설명해줄 수 있어? 각각의 방식에 대한 예제 코드와 동작 방식도 알려줘.

[답변]

안녕하세요! 다양한 이벤트 처리 방식에는 여러 가지가 있으며, 각 방식은 고유한 특징과 장단점이 있습니다. 아래에서는 네 가지 주요 이벤트 처리 방식을 설명하고, 각각에 대한 예제와 동작 방식을 설명하겠습니다.

1. Delegates and Events (델리게이트와 이벤트)

이 방식은 C#에서 가장 전통적인 이벤트 처리 방식입니다. 델리게이트는 메서드에 대한 참조를 저장하는 데 사용되며, 이벤트는 델리게이트를 기반으로 하여 특정 작업이 발생했을 때 이를 통보할 수 있도록 합니다.

예제 코드

using System;

public class ObjectClickManager
{
    // 델리게이트 정의
    public delegate void ObjectClicked(string objectName);
    // 이벤트 정의
    public static event ObjectClicked OnObjectClicked;

    public static void TriggerObjectClick(string objectName)
    {
        // 이벤트 호출
        if (OnObjectClicked != null)
        {
            OnObjectClicked(objectName);
        }
    }
}

public class ObjectHandler
{
    public ObjectHandler()
    {
        // 이벤트 구독
        ObjectClickManager.OnObjectClicked += HandleObjectClicked;
    }

    private void HandleObjectClicked(string objectName)
    {
        // 이벤트 처리
        Console.WriteLine("Object clicked: " + objectName);
    }
}

public class Program
{
    public static void Main()
    {
        // 핸들러 인스턴스 생성
        new ObjectHandler();

        // 이벤트 트리거
        ObjectClickManager.TriggerObjectClick("Object1");
        ObjectClickManager.TriggerObjectClick("Object2");
    }
}

 

동작 설명

  1. ObjectClickManager 클래스는 델리게이트와 이벤트를 정의하고, 이벤트를 트리거하는 메서드를 포함합니다.
  2. ObjectHandler 클래스는 이벤트를 구독하고, 이벤트가 발생할 때 실행될 메서드를 정의합니다.
  3. Program 클래스에서 ObjectHandler 인스턴스를 생성하고, ObjectClickManager의 이벤트를 트리거합니다.
  4. 이벤트가 트리거되면, ObjectHandler의 HandleObjectClicked 메서드가 호출됩니다.

2. Action and Func (액션과 펑크)

이 방식은 더 간단하게 델리게이트를 정의할 수 있게 해줍니다. Action은 반환값이 없는 델리게이트를, Func은 반환값이 있는 델리게이트를 정의하는 데 사용됩니다.

예제 코드

using System;

public class ObjectClickManager
{
    // Action 델리게이트 정의
    public static event Action<string> OnObjectClicked;

    public static void TriggerObjectClick(string objectName)
    {
        // 이벤트 호출
        if (OnObjectClicked != null)
        {
            OnObjectClicked(objectName);
        }
    }
}

public class ObjectHandler
{
    public ObjectHandler()
    {
        // 이벤트 구독
        ObjectClickManager.OnObjectClicked += HandleObjectClicked;
    }

    private void HandleObjectClicked(string objectName)
    {
        // 이벤트 처리
        Console.WriteLine("Object clicked: " + objectName);
    }
}

public class Program
{
    public static void Main()
    {
        // 핸들러 인스턴스 생성
        new ObjectHandler();

        // 이벤트 트리거
        ObjectClickManager.TriggerObjectClick("Object1");
        ObjectClickManager.TriggerObjectClick("Object2");
    }
}

 

동작 설명

  1. ObjectClickManager 클래스는 Action 델리게이트를 사용하여 이벤트를 정의하고, 이벤트를 트리거하는 메서드를 포함합니다.
  2. ObjectHandler 클래스는 이벤트를 구독하고, 이벤트가 발생할 때 실행될 메서드를 정의합니다.
  3. Program 클래스에서 ObjectHandler 인스턴스를 생성하고, ObjectClickManager의 이벤트를 트리거합니다.
  4. 이벤트가 트리거되면, ObjectHandler의 HandleObjectClicked 메서드가 호출됩니다.

3. Event Aggregator Pattern (이벤트 애그리게이터 패턴)

이 패턴은 복잡한 이벤트 시스템을 중앙에서 관리하여 느슨한 결합을 유지할 수 있게 합니다. 여러 이벤트와 구독자가 있을 때 유용합니다.


예제 코드

using System;
using System.Collections.Generic;

public class EventAggregator
{
    private static EventAggregator instance;
    public static EventAggregator Instance => instance ?? (instance = new EventAggregator());

    private readonly Dictionary<Type, List<Action<object>>> eventHandlers = new Dictionary<Type, List<Action<object>>>();

    public void Subscribe<T>(Action<object> handler)
    {
        if (!eventHandlers.ContainsKey(typeof(T)))
            eventHandlers[typeof(T)] = new List<Action<object>>();
        eventHandlers[typeof(T)].Add(handler);
    }

    public void Publish<T>(T eventData)
    {
        if (eventHandlers.ContainsKey(typeof(T)))
        {
            foreach (var handler in eventHandlers[typeof(T)])
            {
                handler.Invoke(eventData);
            }
        }
    }
}

public class ObjectClickedEvent
{
    public string ObjectName { get; }

    public ObjectClickedEvent(string objectName)
    {
        ObjectName = objectName;
    }
}

public class ObjectHandler
{
    public ObjectHandler()
    {
        // 이벤트 구독
        EventAggregator.Instance.Subscribe<ObjectClickedEvent>(HandleObjectClicked);
    }

    private void HandleObjectClicked(object eventData)
    {
        var obj = eventData as ObjectClickedEvent;
        if (obj != null)
        {
            // 이벤트 처리
            Console.WriteLine("Object clicked: " + obj.ObjectName);
        }
    }
}

public class Program
{
    public static void Main()
    {
        // 핸들러 인스턴스 생성
        new ObjectHandler();

        // 이벤트 트리거
        EventAggregator.Instance.Publish(new ObjectClickedEvent("Object1"));
        EventAggregator.Instance.Publish(new ObjectClickedEvent("Object2"));
    }
}

 

동작 설명

  1. EventAggregator 클래스는 중앙에서 이벤트를 관리하는 싱글턴 패턴입니다.
  2. ObjectClickedEvent 클래스는 이벤트 데이터를 정의합니다.
  3. ObjectHandler 클래스는 EventAggregator를 통해 이벤트를 구독하고, 이벤트가 발생할 때 실행될 메서드를 정의합니다.
  4. Program 클래스에서 ObjectHandler 인스턴스를 생성하고, EventAggregator를 통해 이벤트를 트리거합니다.
  5. 이벤트가 트리거되면, ObjectHandler의 HandleObjectClicked 메서드가 호출됩니다.

4. UnityEvent (유니티 이벤트)

유니티의 이벤트 시스템을 사용하면 인스펙터에서 이벤트를 설정하고 관리할 수 있습니다.

예제 코드

using UnityEngine;
using UnityEngine.Events;

public class ObjectClickManager : MonoBehaviour
{
    // UnityEvent 정의
    [System.Serializable]
    public class ObjectClickEvent : UnityEvent<string> { }

    public ObjectClickEvent OnObjectClicked;

    public void TriggerObjectClick(string objectName)
    {
        // 이벤트 호출
        if (OnObjectClicked != null)
        {
            OnObjectClicked.Invoke(objectName);
        }
    }
}

public class ObjectHandler : MonoBehaviour
{
    public ObjectClickManager clickManager;

    private void OnEnable()
    {
        // 이벤트 구독
        if (clickManager != null)
        {
            clickManager.OnObjectClicked.AddListener(HandleObjectClicked);
        }
    }

    private void OnDisable()
    {
        // 이벤트 구독 해제
        if (clickManager != null)
        {
            clickManager.OnObjectClicked.RemoveListener(HandleObjectClicked);
        }
    }

    private void HandleObjectClicked(string objectName)
    {
        // 이벤트 처리
        Debug.Log("Object clicked: " + objectName);
    }
}

 

동작 설명

  1. ObjectClickManager 클래스는 UnityEvent를 정의하고, 이벤트를 트리거하는 메서드를 포함합니다.
  2. ObjectHandler 클래스는 UnityEvent를 통해 이벤트를 구독하고, 이벤트가 발생할 때 실행될 메서드를 정의합니다.
  3. 인스펙터에서 ObjectClickManager의 OnObjectClicked 이벤트에 ObjectHandler의 HandleObjectClicked 메서드를 연결할 수 있습니다.
  4. 이벤트가 트리거되면, ObjectHandler의 HandleObjectClicked 메서드가 호출됩니다.

 

가장 많이 사용하는 방식이 궁금했어요

4가지 이벤트 처리 방식 중 가장 많이 사용하는 방식이 궁금했어요.

[질문] 현재 가장 많이 사용하는 이벤트 처리 방식은 무엇일까?

[답변]

현재 가장 많이 사용하는 이벤트 처리 방식은 프로젝트의 규모와 성격에 따라 다릅니다. 하지만 다음과 같은 경향이 있습니다:

  1. 작은 규모의 프로젝트: Action과 Func을 사용한 간단한 델리게이트 방식이 많이 사용됩니다. 이 방식은 설정이 간단하고 코드가 깔끔하며, 유지보수가 용이하기 때문입니다.
  2. 중간 규모의 프로젝트: 전통적인 Delegates와 Events 방식이 여전히 많이 사용됩니다. 이 방식은 강력한 타입 체크와 명확한 이벤트 흐름을 제공하여 코드의 안정성을 높입니다.
  3. 대규모 프로젝트: Event Aggregator Pattern이 많이 사용됩니다. 이 패턴은 이벤트를 중앙에서 관리하여 모듈 간의 결합을 느슨하게 하고, 확장성과 유지보수성을 높여줍니다.
  4. 유니티 프로젝트: UnityEvent가 인스펙터에서 직관적으로 설정 가능하기 때문에 많이 사용됩니다. 특히, 유니티의 에디터 기능을 적극 활용하는 프로젝트에서 유용합니다.

결론적으로, 현재 가장 많이 사용하는 이벤트 처리 방식은 프로젝트의 요구사항과 개발 환경에 따라 달라질 수 있습니다. 각 방식의 장단점을 고려하여 적절한 방식을 선택하는 것이 중요합니다.

 

내용을 정리해볼까요?

간단히 지금까지 다룬 이벤트 처리 방식을 요약해달라고 했어요.

[질문] 지금까지 이야기한 내용을 요약해줄래?

 

[답변]

요약

  • Delegates and Events: 전통적인 이벤트 처리 방식으로, 이해하기 쉽고 단순하지만 이벤트 관리가 번거로울 수 있습니다.
  • Action and Func: 델리게이트를 더 간단하게 정의할 수 있지만, 유연성이 떨어질 수 있습니다.
  • Event Aggregator Pattern: 복잡한 이벤트 시스템을 중앙에서 관리하여 느슨한 결합을 유지할 수 있지만, 구현이 복잡할 수 있습니다.
  • UnityEvent: 유니티 인스펙터에서 직관적으로 이벤트를 설정할 수 있어 유연하지만, 성능 오버헤드가 있을 수 있습니다.

각 방식은 특정 시나리오에 더 적합할 수 있으며, 프로젝트의 요구사항에 따라 적절한 방식을 선택하는 것이 중요합니다.

 

오늘은 ChatGPT를 통해 이벤트 처리 방식의 다양한 방법과 그 동작 방식을 알아봤어요.

 

오늘도 활기찬 하루되세요.

 

지금까지, 언제나 성장하는 인텔리원스튜디오(IntelliOneStudio)입니다.

감사합니다.

728x90