1. ExpBar를 UIBar 로 변경해서 UIButton과 같이 여러곳에서 공용으로 사용할 수 있게 변경 2. EventBus 를 만들어서 Button같이 자기 스스로 동작을 시작할 수 있는 오브젝트들 말고 수동적인 오브젝트들이 값을 받는 방식을 관리하게 설정 - PlayerController, UIManager, UIBar, EventBus를 연결함 3. Events 아래에 Player의 이벤트에 연관된 코드를 PlayerEvents 로 만들어서 관리함 - 경험치 전달 양식이 여기 존재 - 체력바나 마나바 같은 양식도 여기서 만들 예정
47 lines
1.2 KiB
C#
47 lines
1.2 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
|
|
public class EventBus
|
|
{
|
|
private static Dictionary<Type, Delegate> s_event = new();
|
|
|
|
public static void Subscribe<T>(Action<T> listener)
|
|
{
|
|
Type eventType = typeof(T);
|
|
if (s_event.TryGetValue(eventType, out var exisitingDelegate))
|
|
{
|
|
s_event[eventType] = Delegate.Combine(exisitingDelegate, listener);
|
|
}
|
|
else
|
|
{
|
|
s_event[eventType] = listener;
|
|
}
|
|
}
|
|
|
|
public static void Unsubscribe<T>(Action<T> listener)
|
|
{
|
|
Type eventType = typeof(T);
|
|
if (s_event.TryGetValue(eventType, out var existingDelegate))
|
|
{
|
|
var newDelegate = Delegate.Remove(existingDelegate, listener);
|
|
if (newDelegate == null)
|
|
{
|
|
s_event.Remove(eventType);
|
|
}
|
|
else
|
|
{
|
|
s_event[eventType] = newDelegate;
|
|
}
|
|
}
|
|
}
|
|
|
|
public static void Raise<T>(T eventArgs)
|
|
{
|
|
if (s_event.TryGetValue(typeof(T), out var exisingDelegate))
|
|
{
|
|
(exisingDelegate as Action<T>)?.Invoke(eventArgs);
|
|
}
|
|
}
|
|
|
|
}
|