using BehaviorDesigner.Runtime.Tasks; using Cysharp.Threading.Tasks; using Gameplay.BT.Variables; using Gameplay.Unit; using Gameplay.AI; using Framework; public class BTEventMoveTo : Action { public SharedBattleInfo SharedBattleInfo; private GameUnit _owner; private GameUnit _target; private bool needCheck; public override void OnStart() { _owner = GameUnitManager.instance.infightUnits.Search(SharedBattleInfo.Value.ownerID); } public override TaskStatus OnUpdate() { if (_owner == null) return TaskStatus.Failure; // 避开其他AI AvoidOtherUnit(); if (SharedBattleInfo.Value.targetID != Constants.INVALID_UINT_ID && !AIUtils.IsNeedStop(_owner)) { { if (GameUnitManager.instance.infightUnits.Contains(SharedBattleInfo.Value.targetID)) { var target = GameUnitManager.instance.infightUnits.Search(SharedBattleInfo.Value.targetID); if (target != null) AIUtils.CheckAndMove(_owner, target.transData.cellIndex); } } } return TaskStatus.Failure; } private async void AvoidOtherUnit() { if (AIUtils.IsNeedStop(_owner)) return; if (_owner.statusData.isMoveing && !needCheck) { needCheck = true; } if (needCheck && !_owner.statusData.isMoveing && _owner.controlData.targetCellIndex == -1) { needCheck = false; // 随机等待 防止同步 var randomDelay = UnityEngine.Random.Range(0f, 1f); await UniTask.Delay((int)(randomDelay * 1000)); AIUtils.CheckAreaIsOtherEnemyUnit(_owner, SharedBattleInfo.Value.targetID); } } }