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 @@ - - + + + + +