using System;
using System.Collections;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.UI;
[RequireComponent(typeof(Button))]
public class KeyCodeEvent : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IPointerExitHandler
{
public bool isWaitingForKey = false;
public Action<AnimatorEnum> action;
public AnimatorEnum KeyCodeName = AnimatorEnum.None;
public KeyCode CurrentKeyCode = KeyCode.None;
private Button _currentButton;
private bool IsHold = false;
private bool isPlaying = true;
[SerializeField]
public UnityEvent OnHold;
[SerializeField]
public UnityEvent OnRelease;
[SerializeField]
public UnityEvent OnExit;
private void Awake()
{
_currentButton = this.GetComponent<Button>();
_tipsText = this.transform.GetChild(0).GetComponent<Text>();
if (PlayerPrefs.HasKey(KeyCodeName.ToString()))
{
CurrentKeyCode = (KeyCode)Enum.Parse(typeof(KeyCode), PlayerPrefs.GetString(KeyCodeName.ToString()));
_tipsText.text = CurrentKeyCode.ToString();
}
else
{
CurrentKeyCode = KeyCode.None;
_tipsText.text = "未设置快捷键";
}
}
private void Start()
{
_currentButton.onClick.AddListener(() =>
{
DemoState.Invoke(KeyCodeName.ToString());
isWaitingForKey = true;
_tipsText.text = "请输入按键";
});
}
private void Update()
{
if (isPlaying)
{
if (Input.GetKeyDown(CurrentKeyCode))
{
DemoState?.Invoke(KeyCodeName.ToString());
}
}
}
private void OnGUI()
{
if (isWaitingForKey)
{
isPlaying = false;
Event KeyCodeOverrideEvent = Event.current;
if (KeyCodeOverrideEvent.isKey)
{
PlayerPrefs.SetString(KeyCodeName.ToString(), KeyCodeOverrideEvent.keyCode.ToString());
CurrentKeyCode = (KeyCode)Enum.Parse(typeof(KeyCode), PlayerPrefs.GetString(KeyCodeName.ToString()));
//_tipsText.text = CurrentKeyCode.ToString();
StartCoroutine(WaitUpdate());
isWaitingForKey = false;
}
}
}
private IEnumerator WaitUpdate()
{
yield return new WaitForEndOfFrame();
isPlaying = true;
}
public void OnPointerDown(PointerEventData eventData)
{
if (eventData.button != PointerEventData.InputButton.Left)
return;
IsHold = true;
OnHold?.Invoke();
}
public void OnPointerExit(PointerEventData eventData)
{
if (!IsHold)
return;
OnExit?.Invoke();
IsHold = false;
}
public void OnPointerUp(PointerEventData eventData)
{
if (!IsHold)
return;
OnRelease.Invoke();
IsHold = false;
}
}
Unity开发_自定义虚拟键盘
最新推荐文章于 2023-09-26 11:15:08 发布