From 1a10ee747defd7387b23d7ecf0a67e042319a711 Mon Sep 17 00:00:00 2001 From: shenjianxing <”315615051@qq.com“> Date: Mon, 19 May 2025 15:34:58 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=B7=9D=E7=A6=BB=E5=88=A4?= =?UTF-8?q?=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Scripts/Actions/ActionHelper.cs | 5 + .../Scripts/Conditions/DistanceCondition.cs | 95 +++++++++++++++++++ .../Conditions/DistanceCondition.cs.meta | 11 +++ Assets/Scripts/Xml/XmlParser.cs | 16 ++++ Data/App.xml | 6 +- Doc/Xml配置文档.xml | 5 + 6 files changed, 135 insertions(+), 3 deletions(-) create mode 100644 Assets/Scripts/Conditions/DistanceCondition.cs create mode 100644 Assets/Scripts/Conditions/DistanceCondition.cs.meta diff --git a/Assets/Scripts/Actions/ActionHelper.cs b/Assets/Scripts/Actions/ActionHelper.cs index 0229c169..fef6d73d 100644 --- a/Assets/Scripts/Actions/ActionHelper.cs +++ b/Assets/Scripts/Actions/ActionHelper.cs @@ -342,6 +342,11 @@ public class ActionHelper var dict = (XMLTool.DictionaryCondition)condition; return HasDeviceCondition.Allocate(dict.args); } + case "Distance": + { + var dict = (XMLTool.DictionaryCondition)condition; + return DistanceCondition.Allocate(condition.Value, dict.args); + } } } return null; diff --git a/Assets/Scripts/Conditions/DistanceCondition.cs b/Assets/Scripts/Conditions/DistanceCondition.cs new file mode 100644 index 00000000..7dc98aa0 --- /dev/null +++ b/Assets/Scripts/Conditions/DistanceCondition.cs @@ -0,0 +1,95 @@ +using System; +using System.Collections.Generic; +using System.IO; +using UnityEngine; +using UnityEngine.EventSystems; + +namespace QFramework +{ + public class DistanceCondition : ICondition + { + + private static SimpleObjectPool mSimpleObjectPool = + new SimpleObjectPool(() => new DistanceCondition(), null, 10); + + private DistanceCondition() { } + public GameObject obj = null; + float value = 0; + Vector3 targetPos = Vector3.zero; + bool ignoreY = false; + public static DistanceCondition Allocate(string value, Dictionary datas) + { + var conditionAction = mSimpleObjectPool.Allocate(); + conditionAction.ActionID = ActionKit.ID_GENERATOR++; + conditionAction.Deinited = false; + conditionAction.Reset(); + float.TryParse(value, out conditionAction.value); + if (datas.ContainsKey("targetPos")) + { + conditionAction.targetPos = Utility.GetVector3FromStrArray(datas["targetPos"]); + } + if (datas.ContainsKey("ignoreY")) + { + if (bool.TryParse(datas["ignoreY"], out conditionAction.ignoreY) == false) + { + conditionAction.ignoreY = false; + } + } + return conditionAction; + } + public bool Check() + { + + Vector3 self = FreeCameraController.instance.transform.position; + if (ignoreY) + { + self.y = targetPos.y; + } + + return Vector3.Distance(self, targetPos) <= value; + } + 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; + mSimpleObjectPool.Recycle(this); + } + } + + public void Reset() + { + Paused = false; + Status = ActionStatus.NotStart; + } + } + + public static class DistanceConditionExtension + { + public static ISequence DistanceCondition(this ISequence self, string value,Dictionary datas) + { + return self.Append(QFramework.DistanceCondition.Allocate(value, datas)); + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Conditions/DistanceCondition.cs.meta b/Assets/Scripts/Conditions/DistanceCondition.cs.meta new file mode 100644 index 00000000..0c3cfb6e --- /dev/null +++ b/Assets/Scripts/Conditions/DistanceCondition.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c8bdcde7925b9534494a18a7b803043e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Xml/XmlParser.cs b/Assets/Scripts/Xml/XmlParser.cs index 32370328..c08e4666 100644 --- a/Assets/Scripts/Xml/XmlParser.cs +++ b/Assets/Scripts/Xml/XmlParser.cs @@ -1819,6 +1819,22 @@ namespace XMLTool newAction = act; } break; + case "Distance": + { + var act = new DictionaryCondition(); + XAttribute targetPos = action.Attribute("targetPos"); + if (targetPos != null) + { + act.args.Add("targetPos", targetPos.Value); + } + XAttribute ignoreY = action.Attribute("ignoreY"); + if (ignoreY != null) + { + act.args.Add("ignoreY", ignoreY.Value); + } + newAction = act; + } + break; default: newAction = new Condition(); break; diff --git a/Data/App.xml b/Data/App.xml index 7aee75bc..3b226c14 100644 --- a/Data/App.xml +++ b/Data/App.xml @@ -22,7 +22,7 @@ - + @@ -35,14 +35,14 @@ - + - + diff --git a/Doc/Xml配置文档.xml b/Doc/Xml配置文档.xml index 2b5ee592..60524773 100644 --- a/Doc/Xml配置文档.xml +++ b/Doc/Xml配置文档.xml @@ -176,6 +176,11 @@ + + + + +