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)); } } }