From c9529a1216a7c2b147fdb6e7b2851ae632a52920 Mon Sep 17 00:00:00 2001 From: shenjianxing <”315615051@qq.com“> Date: Thu, 6 Feb 2025 15:17:08 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E9=95=BF=E6=8C=89=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Scripts/Actions/ActionHelper.cs | 11 +- .../Conditions/ObjClickLongCondition.cs | 146 ++++++++++++++++++ .../Conditions/ObjClickLongCondition.cs.meta | 3 + Assets/Scripts/Xml/XmlParser.cs | 36 +++-- Doc/Xml配置文档.xml | 7 +- 5 files changed, 190 insertions(+), 13 deletions(-) create mode 100644 Assets/Scripts/Conditions/ObjClickLongCondition.cs create mode 100644 Assets/Scripts/Conditions/ObjClickLongCondition.cs.meta diff --git a/Assets/Scripts/Actions/ActionHelper.cs b/Assets/Scripts/Actions/ActionHelper.cs index b1ff7e73..ef39f9a8 100644 --- a/Assets/Scripts/Actions/ActionHelper.cs +++ b/Assets/Scripts/Actions/ActionHelper.cs @@ -269,8 +269,15 @@ public class ActionHelper case "UIClick": return UIClickCondition.Allocate(condition.Value); case "ObjClick": - var dict = (XMLTool.DictionaryCondition)condition; - return ObjClickCondition.Allocate(dict.Value, dict.args); + { + var dict = (XMLTool.DictionaryCondition)condition; + return ObjClickCondition.Allocate(dict.Value, dict.args); + } + case "ObjClickLong": + { + var dict = (XMLTool.DictionaryCondition)condition; + return ObjClickLongCondition.Allocate(dict.Value, dict.args); + } case "Input": return InputCondition.Allocate(condition.Value); case "Var": diff --git a/Assets/Scripts/Conditions/ObjClickLongCondition.cs b/Assets/Scripts/Conditions/ObjClickLongCondition.cs new file mode 100644 index 00000000..c8a490d9 --- /dev/null +++ b/Assets/Scripts/Conditions/ObjClickLongCondition.cs @@ -0,0 +1,146 @@ +using System; +using System.Collections.Generic; +using System.IO; +using UnityEngine; +using UnityEngine.EventSystems; + +namespace QFramework +{ + public class ObjClickLongCondition : ICondition + { + + private static SimpleObjectPool mSimpleObjectPool = + new SimpleObjectPool(() => new ObjClickLongCondition(), null, 10); + + private ObjClickLongCondition() { } + public GameObject obj = null; + string path; + string deviceName; + float time; + float curTime; + bool isDown = false; + public static ObjClickLongCondition Allocate(string path, Dictionary datas) + { + var conditionAction = mSimpleObjectPool.Allocate(); + conditionAction.ActionID = ActionKit.ID_GENERATOR++; + conditionAction.Deinited = false; + conditionAction.Reset(); + conditionAction.path = path; + conditionAction.deviceName = datas.ContainsKey("deviceName") ? datas["deviceName"] : null; + if (datas.ContainsKey("time")) + { + float.TryParse(datas["time"], out conditionAction.time); + } + return conditionAction; + } + public bool Check() + { + if (obj == null) + { + if (string.IsNullOrEmpty(deviceName)) + { + obj = Utility.FindObj(path); + } + else + { + obj = DeviceController.Instance.GetDeviceObj(deviceName); + if (obj == null) + { + Debug.LogError($"ûҵ path:{path} deviceName:{deviceName}"); + } + } + } + + // + if (Input.GetMouseButtonDown(0)) + { + OnMouseDown(); + } + + // ɿ + if (Input.GetMouseButtonUp(0)) + { + OnMouseUp(); + } + + if (isDown && EventSystem.current.IsPointerOverGameObject() == false) + { + Vector3 mousePos = Input.mousePosition; + Ray ray = Camera.main.ScreenPointToRay(mousePos); + RaycastHit hit; + if (Physics.Raycast(ray, out hit)) + { + if (obj == hit.collider.gameObject) + { + curTime -= Time.deltaTime; + if (curTime <= 0) + { + return true; + } + } + + } + } + + return false; + } + + public void OnMouseDown() + { + curTime = this.time; + isDown = true; + } + + public void OnMouseUp() + { + isDown = false; + } + + + public bool Paused { get; set; } + public bool Deinited { get; set; } + public ulong ActionID { get; set; } + public ActionStatus Status { get; set; } + public void OnStart() + { + } + + public void OnExecute(float dt) + { + if (Check()) + { + this.Finish(); + } + } + + public void OnFinish() + { + } + + public void Deinit() + { + if (!Deinited) + { + Deinited = true; + obj = null; + path = null; + mSimpleObjectPool.Recycle(this); + } + } + + public void Reset() + { + curTime = 0; + Paused = false; + Status = ActionStatus.NotStart; + } + } + + //public static class ObjClickLongConditionExtension + //{ + // public static ISequence ObjClickLongCondition(this ISequence self, string uipath) + // { + // return self.Append(QFramework.ObjClickLongCondition.Allocate(uipath)); + // } + //} +} \ No newline at end of file diff --git a/Assets/Scripts/Conditions/ObjClickLongCondition.cs.meta b/Assets/Scripts/Conditions/ObjClickLongCondition.cs.meta new file mode 100644 index 00000000..91bfa937 --- /dev/null +++ b/Assets/Scripts/Conditions/ObjClickLongCondition.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 297e67e3bc7868a4cae6623426c359b9 +timeCreated: 1647673104 \ No newline at end of file diff --git a/Assets/Scripts/Xml/XmlParser.cs b/Assets/Scripts/Xml/XmlParser.cs index ab5080b1..ce2a5804 100644 --- a/Assets/Scripts/Xml/XmlParser.cs +++ b/Assets/Scripts/Xml/XmlParser.cs @@ -1163,19 +1163,37 @@ namespace XMLTool switch (type) { case "ObjClick": - var act = new DictionaryCondition(); + { + var act = new DictionaryCondition(); - XAttribute deviceName = action.Attribute("deviceName"); - if (deviceName != null) - { - act.args.Add("deviceName", deviceName.Value); + XAttribute deviceName = action.Attribute("deviceName"); + if (deviceName != null) + { + act.args.Add("deviceName", deviceName.Value); + } + XAttribute isRight = action.Attribute("isRight"); + if (isRight != null) + { + act.args.Add("isRight", isRight.Value); + } + newAction = act; } - XAttribute isRight = action.Attribute("isRight"); - if (isRight != null) + break; + case "ObjClickLong": { - act.args.Add("isRight", isRight.Value); + var act = new DictionaryCondition(); + XAttribute deviceName = action.Attribute("deviceName"); + if (deviceName != null) + { + act.args.Add("deviceName", deviceName.Value); + } + XAttribute time = action.Attribute("time"); + if (time != null) + { + act.args.Add("time", time.Value); + } + newAction = act; } - newAction = act; break; default: newAction = new Condition(); diff --git a/Doc/Xml配置文档.xml b/Doc/Xml配置文档.xml index ddcb472a..03d6ae63 100644 --- a/Doc/Xml配置文档.xml +++ b/Doc/Xml配置文档.xml @@ -104,8 +104,11 @@ - - + + + + +