Ui 기본 구조 추가
This commit is contained in:
parent
689a4fe095
commit
35dfe1a080
26
Assets/_DDD/_Scripts/GameUi/BaseUi.cs
Normal file
26
Assets/_DDD/_Scripts/GameUi/BaseUi.cs
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace DDD
|
||||||
|
{
|
||||||
|
public abstract class BaseUi : MonoBehaviour
|
||||||
|
{
|
||||||
|
public virtual bool IsBlockingTime => false;
|
||||||
|
public virtual bool IsOpen => gameObject.activeSelf;
|
||||||
|
|
||||||
|
protected virtual void Start()
|
||||||
|
{
|
||||||
|
TryRegister();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual void OnDestroy()
|
||||||
|
{
|
||||||
|
TryUnregister();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual void TryRegister() { }
|
||||||
|
protected virtual void TryUnregister() { }
|
||||||
|
|
||||||
|
public virtual void Open() => gameObject.SetActive(true);
|
||||||
|
public virtual void Close() => gameObject.SetActive(false);
|
||||||
|
}
|
||||||
|
}
|
51
Assets/_DDD/_Scripts/GameUi/FadeUi.cs
Normal file
51
Assets/_DDD/_Scripts/GameUi/FadeUi.cs
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
using DG.Tweening;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace DDD
|
||||||
|
{
|
||||||
|
public class FadeUi : MonoBehaviour, IEventHandler<FadeInEvent>, IEventHandler<FadeOutEvent>
|
||||||
|
{
|
||||||
|
private CanvasGroup _canvasGroup;
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
_canvasGroup = GetComponent<CanvasGroup>();
|
||||||
|
|
||||||
|
_canvasGroup.alpha = 0f;
|
||||||
|
_canvasGroup.gameObject.SetActive(false);
|
||||||
|
|
||||||
|
EventBus.Register<FadeInEvent>(this);
|
||||||
|
EventBus.Register<FadeOutEvent>(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDestroy()
|
||||||
|
{
|
||||||
|
EventBus.Unregister<FadeInEvent>(this);
|
||||||
|
EventBus.Unregister<FadeOutEvent>(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async void Invoke(FadeInEvent evt)
|
||||||
|
{
|
||||||
|
await _canvasGroup.DOFade(0f, evt.Duration)
|
||||||
|
.SetUpdate(true)
|
||||||
|
.AsyncWaitForCompletion();
|
||||||
|
|
||||||
|
_canvasGroup.blocksRaycasts = false;
|
||||||
|
_canvasGroup.gameObject.SetActive(false);
|
||||||
|
|
||||||
|
evt.CompletionSource.SetResult(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async void Invoke(FadeOutEvent evt)
|
||||||
|
{
|
||||||
|
_canvasGroup.gameObject.SetActive(true);
|
||||||
|
_canvasGroup.blocksRaycasts = true;
|
||||||
|
|
||||||
|
await _canvasGroup.DOFade(1f, evt.Duration)
|
||||||
|
.SetUpdate(true)
|
||||||
|
.AsyncWaitForCompletion();
|
||||||
|
|
||||||
|
evt.CompletionSource.SetResult(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
68
Assets/_DDD/_Scripts/GameUi/GlobalMessageUi.cs
Normal file
68
Assets/_DDD/_Scripts/GameUi/GlobalMessageUi.cs
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using DG.Tweening;
|
||||||
|
using TMPro;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace DDD
|
||||||
|
{
|
||||||
|
public class GlobalMessageUi : BaseUi, IEventHandler<ShowGlobalMessageEvent>
|
||||||
|
{
|
||||||
|
private CanvasGroup _canvasGroup;
|
||||||
|
private TextMeshProUGUI _messageText;
|
||||||
|
private Tween _fadeTween;
|
||||||
|
|
||||||
|
private readonly Queue<ShowGlobalMessageEvent> _messageQueue = new();
|
||||||
|
private bool _isDisplayingMessage = false;
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
_canvasGroup = GetComponent<CanvasGroup>();
|
||||||
|
_messageText = GetComponentInChildren<TextMeshProUGUI>();
|
||||||
|
|
||||||
|
_canvasGroup.alpha = 0;
|
||||||
|
_messageText.text = null;
|
||||||
|
|
||||||
|
EventBus.Register(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnDestroy()
|
||||||
|
{
|
||||||
|
base.OnDestroy();
|
||||||
|
|
||||||
|
EventBus.Unregister(this);
|
||||||
|
_fadeTween?.Kill();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Invoke(ShowGlobalMessageEvent evt)
|
||||||
|
{
|
||||||
|
_messageQueue.Enqueue(evt);
|
||||||
|
TryDisplayNext();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void TryDisplayNext()
|
||||||
|
{
|
||||||
|
if (_isDisplayingMessage || _messageQueue.Count == 0) return;
|
||||||
|
|
||||||
|
var evt = _messageQueue.Dequeue();
|
||||||
|
_isDisplayingMessage = true;
|
||||||
|
|
||||||
|
_messageText.text = LocalizationManager.GetString(TableName.Global_Message, evt.NewMessageKey);
|
||||||
|
Open();
|
||||||
|
|
||||||
|
_fadeTween?.Kill();
|
||||||
|
_fadeTween = DOTween.Sequence()
|
||||||
|
.Append(_canvasGroup.DOFade(1f, evt.FadeDuration))
|
||||||
|
.AppendInterval(evt.ShowDuration)
|
||||||
|
.Append(_canvasGroup.DOFade(0f, evt.FadeDuration))
|
||||||
|
.OnComplete(() =>
|
||||||
|
{
|
||||||
|
Close();
|
||||||
|
_fadeTween = null;
|
||||||
|
_isDisplayingMessage = false;
|
||||||
|
|
||||||
|
// 다음 메시지 처리
|
||||||
|
TryDisplayNext();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
7
Assets/_DDD/_Scripts/GameUi/PopupUi.cs
Normal file
7
Assets/_DDD/_Scripts/GameUi/PopupUi.cs
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
namespace DDD
|
||||||
|
{
|
||||||
|
public class PopupUi : BaseUi
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
7
Assets/_DDD/_Scripts/GameUi/ScreenUi.cs
Normal file
7
Assets/_DDD/_Scripts/GameUi/ScreenUi.cs
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
namespace DDD
|
||||||
|
{
|
||||||
|
public class ScreenUi : BaseUi
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
140
Assets/_DDD/_Scripts/GameUi/UiManager.cs
Normal file
140
Assets/_DDD/_Scripts/GameUi/UiManager.cs
Normal file
@ -0,0 +1,140 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace DDD
|
||||||
|
{
|
||||||
|
public class UiManager : Singleton<UiManager>, IManager, IEventHandler<OpenScreenUiEvent>, IEventHandler<CloseScreenUiEvent>,
|
||||||
|
IEventHandler<OpenPopupUiEvent>, IEventHandler<ClosePopupUiEvent>
|
||||||
|
{
|
||||||
|
private readonly Dictionary<Type, ScreenUi> _screenUIs = new();
|
||||||
|
private readonly Dictionary<Type, PopupUi> _popupUIs = new();
|
||||||
|
|
||||||
|
private readonly object _uiPauseRequester = new();
|
||||||
|
|
||||||
|
public void PreInit()
|
||||||
|
{
|
||||||
|
EventBus.Register<OpenScreenUiEvent>(this);
|
||||||
|
EventBus.Register<CloseScreenUiEvent>(this);
|
||||||
|
EventBus.Register<OpenPopupUiEvent>(this);
|
||||||
|
EventBus.Register<ClosePopupUiEvent>(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task Init()
|
||||||
|
{
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void PostInit()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDestroy()
|
||||||
|
{
|
||||||
|
EventBus.Unregister<OpenScreenUiEvent>(this);
|
||||||
|
EventBus.Unregister<CloseScreenUiEvent>(this);
|
||||||
|
EventBus.Unregister<OpenPopupUiEvent>(this);
|
||||||
|
EventBus.Unregister<ClosePopupUiEvent>(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RegisterScreenUI(ScreenUi ui)
|
||||||
|
{
|
||||||
|
var type = ui.GetType();
|
||||||
|
_screenUIs.TryAdd(type, ui);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UnregisterScreenUI(ScreenUi ui)
|
||||||
|
{
|
||||||
|
var type = ui.GetType();
|
||||||
|
if (_screenUIs.TryGetValue(type, out var value) && value == ui)
|
||||||
|
{
|
||||||
|
_screenUIs.Remove(type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RegisterPopupUI(PopupUi ui)
|
||||||
|
{
|
||||||
|
var type = ui.GetType();
|
||||||
|
_popupUIs.TryAdd(type, ui);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UnregisterPopupUI(PopupUi ui)
|
||||||
|
{
|
||||||
|
var type = ui.GetType();
|
||||||
|
if (_popupUIs.TryGetValue(type, out var registered) && registered == ui)
|
||||||
|
{
|
||||||
|
_popupUIs.Remove(type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CloseAllScreenUIs()
|
||||||
|
{
|
||||||
|
foreach (var screen in _screenUIs.Values)
|
||||||
|
{
|
||||||
|
if (screen.IsOpen)
|
||||||
|
{
|
||||||
|
screen.Close();
|
||||||
|
|
||||||
|
if (screen.IsBlockingTime)
|
||||||
|
{
|
||||||
|
EventBus.Broadcast(new TimeScaleChangeEvent(_uiPauseRequester, 1f));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Invoke(OpenScreenUiEvent evt)
|
||||||
|
{
|
||||||
|
if (_screenUIs.TryGetValue(evt.UiType, out var screen))
|
||||||
|
{
|
||||||
|
CloseAllScreenUIs();
|
||||||
|
screen.Open();
|
||||||
|
|
||||||
|
if (screen.IsBlockingTime)
|
||||||
|
{
|
||||||
|
EventBus.Broadcast(new TimeScaleChangeEvent(screen, 0f));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Invoke(CloseScreenUiEvent evt)
|
||||||
|
{
|
||||||
|
if (_screenUIs.TryGetValue(evt.UiType, out var screen))
|
||||||
|
{
|
||||||
|
screen.Close();
|
||||||
|
|
||||||
|
if (screen.IsBlockingTime)
|
||||||
|
{
|
||||||
|
EventBus.Broadcast(new TimeScaleChangeEvent(screen, 1f));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Invoke(OpenPopupUiEvent evt)
|
||||||
|
{
|
||||||
|
if (_popupUIs.TryGetValue(evt.UiType, out var popup))
|
||||||
|
{
|
||||||
|
popup.Open();
|
||||||
|
|
||||||
|
if (popup.IsBlockingTime)
|
||||||
|
{
|
||||||
|
EventBus.Broadcast(new TimeScaleChangeEvent(popup, 0f));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Invoke(ClosePopupUiEvent evt)
|
||||||
|
{
|
||||||
|
if (_screenUIs.TryGetValue(evt.UiType, out var popUp))
|
||||||
|
{
|
||||||
|
popUp.Close();
|
||||||
|
|
||||||
|
if (popUp.IsBlockingTime)
|
||||||
|
{
|
||||||
|
EventBus.Broadcast(new TimeScaleChangeEvent(popUp, 1f));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user