using GCSeries.Core.Input; using System; using UnityEngine; using UnityEngine.EventSystems; namespace QFramework { public class UIClickCondition : ICondition { private Func mCondition; private static SimpleObjectPool mSimpleObjectPool = new SimpleObjectPool(() => new UIClickCondition(), null, 10); private UIClickCondition() { } public GameObject obj = null; string uiPath = string.Empty; public static UIClickCondition Allocate(string uiPath) { var conditionAction = mSimpleObjectPool.Allocate(); conditionAction.ActionID = ActionKit.ID_GENERATOR++; conditionAction.Deinited = false; conditionAction.Reset(); conditionAction.mCondition = conditionAction.Check; conditionAction.uiPath = uiPath; return conditionAction; } public bool Check() { if (obj == null) { #if VR if (uiPath.Contains("UIRoot/")) { uiPath = uiPath.Replace("UIRoot/", "UIRoot/ZCameraRig/ZCanvas/"); } #endif obj = Utility.FindObj(uiPath); } #if !VR if (obj != null && Input.GetMouseButtonUp(0) && EventSystem.current.IsPointerOverGameObject()) { return obj == EventSystem.current.currentSelectedGameObject; } #endif return false; } public bool Paused { get; set; } public bool Deinited { get; set; } public ulong ActionID { get; set; } public ActionStatus Status { get; set; } public void OnStart() { #if VR UIRoot.Instance.transform.Find("ZMouse").GetComponent().OnClick.AddListener(OnClick); UIRoot.Instance.transform.Find("ZStylus").GetComponent().OnClick.AddListener(OnClick); #endif } #if VR private void OnClick(ZPointer arg0, int arg1, GameObject arg2) { if (this.obj != null && this.obj == arg2) { this.Finish(); } } #endif public void OnExecute(float dt) { if (Check()) { this.Finish(); } } public void OnFinish() { } public void Deinit() { if (!Deinited) { #if VR UIRoot.Instance.transform.Find("ZMouse").GetComponent().OnClick.RemoveListener(OnClick); UIRoot.Instance.transform.Find("ZStylus").GetComponent().OnClick.RemoveListener(OnClick); #endif Deinited = true; mCondition = null; obj = null; mSimpleObjectPool.Recycle(this); } } public void Reset() { Paused = false; Status = ActionStatus.NotStart; } } public static class UIClickConditionExtension { public static ISequence UIClickCondition(this ISequence self, string uipath) { return self.Append(QFramework.UIClickCondition.Allocate(uipath)); } } }