Skip to content

Instantly share code, notes, and snippets.

@jackyli-work
Created February 29, 2020 07:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jackyli-work/bd28db0bdd0535bbc95b428870000356 to your computer and use it in GitHub Desktop.
Save jackyli-work/bd28db0bdd0535bbc95b428870000356 to your computer and use it in GitHub Desktop.
escapeButton
using System.Collections.Generic;
using JFun.Framework;
using JFun.Gameplay.MessageSystem;
using UnityEngine;
namespace JFun.Gameplay.CreateWorld.UI
{
public class EscapeButtonController
{
private List<UIInputEventHelper> _escapeButtonList = new List<UIInputEventHelper>();
private bool _isWaiting = false;
public EscapeButtonController(UIInputEventHelper escapeButton)
{
AddEscapeButton(escapeButton);
MessageManager.AddListener<UIInputEventHelper>(MessageCmd.EscapeButtonOpen, AddEscapeButton);
MessageManager.AddListener<UIInputEventHelper, float>(MessageCmd.EscapeButtonClose, RemoveEscapeButton);
}
public void Dispose()
{
if (MessageManager.HaveListener(MessageCmd.EscapeButtonOpen))
{
MessageManager.RemoveListener<UIInputEventHelper>(MessageCmd.EscapeButtonOpen, AddEscapeButton);
}
if (MessageManager.HaveListener(MessageCmd.EscapeButtonClose))
{
MessageManager.RemoveListener<UIInputEventHelper, float>(MessageCmd.EscapeButtonClose, RemoveEscapeButton);
}
_escapeButtonList.Clear();
_escapeButtonList = null;
}
private void AddEscapeButton(UIInputEventHelper escapeButton)
{
if (escapeButton == null)
{
return;
}
if (_escapeButtonList.Count > 0)
{
UIInputEventHelper lastButton = _escapeButtonList[_escapeButtonList.Count - 1];
if (lastButton != null)
{
lastButton.IsEscapeActive = false;
}
}
_escapeButtonList.Add(escapeButton);
escapeButton.IsEscapeActive = !_isWaiting;
}
private void RemoveEscapeButton(UIInputEventHelper escapeButton, float delaySecs)
{
if (escapeButton == null)
{
return;
}
int index = _escapeButtonList.FindIndex(data => { return ReferenceEquals(data, escapeButton); });
if (index < 0)
{
return;
}
bool isLast = (index == _escapeButtonList.Count - 1);
escapeButton.IsEscapeActive = false;
if (delaySecs < 0f)
{
_escapeButtonList.Remove(escapeButton);
}
if (!isLast || _isWaiting)
{
return;
}
_isWaiting = true;
float delay = Mathf.Max(delaySecs, 0f);
if (Singleton.Helper != null)
{
DelayDoHelper.DelayDoAction(ActiveLast, delay);
}
}
private void ActiveLast()
{
if (_escapeButtonList == null)
{
return;
}
for (int i = _escapeButtonList.Count - 1; i >= 0; i--)
{
UIInputEventHelper lastButton = _escapeButtonList[i];
if (lastButton != null)
{
_isWaiting = false;
lastButton.IsEscapeActive = true;
break;
}
_escapeButtonList.RemoveAt(i);
}
if (_escapeButtonList.Count <= 0)
{
Dispose();
return;
}
}
}
}
using JFun.Gameplay.MessageSystem;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;
namespace JFun.Gameplay.CreateWorld.UI
{
public class UIInputEventHelper : MonoBehaviour
{
public KeyCode InputKey;
public float EscapeDelaySecs = 1f;
public UnityEvent Callback;
private Button _escapeButton;
private bool? _lastActive = null;
public bool IsEscapeActive { get; set; }
public void SetEscapeActive(bool isActive)
{
if (isActive)
{
if (_lastActive.HasValue)
{
if (_lastActive.Value && MessageManager.HaveListener(MessageCmd.EscapeButtonInactive))
{
MessageManager.RemoveListener(MessageCmd.EscapeButtonInactive, null);
}
_lastActive = null;
}
}
else
{
if (!_lastActive.HasValue)
{
_lastActive = !MessageManager.HaveListener(MessageCmd.EscapeButtonInactive);
if (_lastActive.Value)
{
MessageManager.AddListener(MessageCmd.EscapeButtonInactive, null);
}
}
}
}
private void OnEnable()
{
if (InputKey != KeyCode.Escape)
{
return;
}
if (EscapeDelaySecs < 0f)
{
if (!MessageManager.HaveListener(MessageCmd.EscapeButtonInactive))
{
MessageManager.AddListener(MessageCmd.EscapeButtonInactive, null);
}
return;
}
_escapeButton = GetComponent<Button>();
if (MessageManager.HaveListener(MessageCmd.EscapeButtonOpen))
{
MessageManager.Broadcast<UIInputEventHelper>(MessageCmd.EscapeButtonOpen, this);
}
else
{
new EscapeButtonController(this);
}
}
private void OnDisable()
{
if (InputKey != KeyCode.Escape)
{
return;
}
if ((EscapeDelaySecs < 0f) &&
(MessageManager.HaveListener(MessageCmd.EscapeButtonInactive)))
{
MessageManager.RemoveListener(MessageCmd.EscapeButtonInactive, null);
return;
}
if (MessageManager.HaveListener(MessageCmd.EscapeButtonClose))
{
MessageManager.Broadcast(MessageCmd.EscapeButtonClose, this, -1f);
}
}
private void Start()
{
if (InputKey == KeyCode.None)
{
enabled = false;
}
}
private void Update()
{
if (Input.GetKeyDown(InputKey) &&
(InputKey != KeyCode.Escape) &&
(Callback != null))
{
Callback.Invoke();
return;
}
if (Input.GetKeyDown(KeyCode.Escape) && IsEscapeActive)
{
if (MessageManager.HaveListener(MessageCmd.EscapeButtonInactive))
{
return;
}
if (MessageManager.HaveListener(MessageCmd.EscapeButtonClose))
{
MessageManager.Broadcast(MessageCmd.EscapeButtonClose, this, EscapeDelaySecs);
}
if (_escapeButton)
{
_escapeButton.onClick.Invoke();
}
Callback.Invoke();
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment