using BehaviorDesigner.Runtime.Tasks; using Gameplay.BT.Variables; using Gameplay.Unit; using Gameplay.AI; using Framework; public class BTDefendMoveTo : Action { public SharedBattleInfo SharedBattleInfo; private GameUnit _owner; private GameUnit _target; private uint _lastTarget; private AIUtils.AvoidanceContext avoidContext; public override void OnStart() { _owner = GameUnitManager.instance.infightUnits.Search(SharedBattleInfo.Value.ownerID); } public override TaskStatus OnUpdate() { if (_owner == null) return TaskStatus.Failure; // 避开其他AI AIUtils.TryAvoidOtherUnit(_owner, ref avoidContext, SharedBattleInfo.Value.targetID); if (SharedBattleInfo.Value.targetID != Constants.INVALID_UINT_ID) { // 超出守卫范围 if (AIUtils.CheckDistanceIsOver(_owner)) { SharedBattleInfo.Value.targetID = Constants.INVALID_UINT_ID; return TaskStatus.Failure; } if (_owner.controlData.targetEnemy == null && !AIUtils.IsNeedStop(_owner)) { if (GameUnitManager.instance.infightUnits.Contains(SharedBattleInfo.Value.targetID)) { var target = GameUnitManager.instance.infightUnits.Search(SharedBattleInfo.Value.targetID); if (target != null) { _owner.controlData.targetEnemy = target; AIUtils.CheckAndMove(_owner, target.transData.cellIndex); } } } if (_owner.controlData.targetEnemy != null && _owner.controlData.targetEnemy.GetID() != SharedBattleInfo.Value.targetID && !AIUtils.IsNeedStop(_owner)) { if (GameUnitManager.instance.infightUnits.Contains(SharedBattleInfo.Value.targetID)) { var target = GameUnitManager.instance.infightUnits.Search(SharedBattleInfo.Value.targetID); if (target != null) { _owner.controlData.targetEnemy = target; AIUtils.CheckAndMove(_owner, target.transData.cellIndex); } } } return TaskStatus.Running; } return TaskStatus.Failure; } public override void OnEnd() { } }