【AI】相关

main
zhangaotian 2024-11-04 15:24:11 +08:00
parent 4e780bb471
commit 0e088a28e9
19 changed files with 302 additions and 252 deletions

View File

@ -1,3 +1,4 @@
using System;
using Framework;
using Gameplay.Area;
using Gameplay.Unit;
@ -27,7 +28,7 @@ namespace Gameplay.AI
for (var i = 0; i < inSightEnemies.Count; i++)
{
var enemy = inSightEnemies[i];
if (enemy == null)
if (enemy == null || enemy.statusData.isDead)
{
continue;
}
@ -66,6 +67,62 @@ namespace Gameplay.AI
return nearestEnemy;
}
}
public static GameUnit FindNearestEnemyInShootRange(GameUnit owner)
{
if (owner == null) return null;
var map = LevelManager.Instance.CurrentLevel.Map;
if (map == null) return null;
inSightEnemies.Clear();
inSightDistanceList.Clear();
GameUnitManager.instance.characterManager.SearchEnemies(owner, inSightEnemies);
var ownerCellIndex = owner.transData?.cellIndex;
for (var i = 0; i < inSightEnemies.Count; i++)
{
var enemy = inSightEnemies[i];
if (enemy == null)
{
continue;
}
var enemyCellIndex = enemy.transData?.cellIndex;
if (!ownerCellIndex.HasValue || !enemyCellIndex.HasValue)
{
continue;
}
var distance = MapUtils.Distance(map, ownerCellIndex.Value, enemyCellIndex.Value);
if (distance <= owner.fightData.normalAttackDistance)
{
inSightDistanceList.Add(enemy, distance);
}
}
if (inSightDistanceList.Count <= 0)
{
return null;
}
else
{
owner.statusData.isAttackActive = true;
var minDistance = float.MaxValue;
GameUnit nearestEnemy = null;
foreach (var pair in inSightDistanceList)
{
if (minDistance > pair.Value)
{
minDistance = pair.Value;
nearestEnemy = pair.Key;
}
}
return nearestEnemy;
}
}
private static List<GameUnit> enemies = new List<GameUnit>(16);
private static List<GameUnit> inAttackEnemies = new List<GameUnit>(16);
@ -232,55 +289,71 @@ namespace Gameplay.AI
return nearestPoint;
}
public static int GetPatrolPointIndexFromVector2Int(Map map, int patrolIndex, List<PatrolInfo> patrolInfos)
{
if (map == null || patrolIndex >= patrolInfos.Count) return -1;
var patrolInfo = patrolInfos[patrolIndex];
if (patrolInfo == null) return -1;
return map.BlockPosition2TGSCellIndex(patrolInfo.patrolPoint);
}
public static bool IsNeedStop(GameUnit owner)
{
return owner.statusData.isOnVehicle || owner.statusData.isChaos || owner.statusData.isStun
|| owner.statusData.isLockPos || owner.statusData.isRetreat;
|| owner.statusData.isLockPos || owner.statusData.isRetreat || owner.statusData.isDead;
}
public static bool AINeedStopUpdate(Level.Level level)
{
if (level == null) return false;
return level.IsPreparing() || level.IsEnd() || Math.Abs(level.GetSpeed() - 0f) < 0.01f;
}
// 激活AI攻击
public static void ActiveAIAttack(GameUnit owner)
{
if (owner == null) return;
if (owner.statusData.isAttackActive) return;
var map = LevelManager.Instance.CurrentLevel.Map;
if (map == null) return;
var tempInSightEnemies = new List<GameUnit>();
GameUnitManager.instance.characterManager.SearchEnemies(owner, tempInSightEnemies);
if (tempInSightEnemies.Count <= 0) return;
var ownerCellIndex = owner.transData?.cellIndex;
for (var i = 0; i < inSightEnemies.Count; i++)
if (owner.controlData.targetEnemy!=null)
{
var enemy = inSightEnemies[i];
if (enemy == null)
{
continue;
}
var enemyCellIndex = enemy.transData?.cellIndex;
if (!ownerCellIndex.HasValue || !enemyCellIndex.HasValue)
{
continue;
}
var distance = MapUtils.Distance(map, ownerCellIndex.Value, enemyCellIndex.Value);
if (distance <= owner.fightData.findEnemyRange)
owner.statusData.isAttackActive = true;
}
else
{
var target = FindNearestEnemyInShootRange(owner);
if (target != null)
{
owner.controlData.targetEnemy = target;
owner.statusData.isAttackActive = true;
return;
}
}
}
public static bool MoveTo(GameUnit owner, int cellIndex, bool cancelFollow = true)
{
if (owner == null || cellIndex == -1) return false;
var map = LevelManager.Instance.CurrentLevel.Map;
if (map == null) return false;
var mapData = map.MapData;
if (mapData == null) return false;
var blockData = map.MapData.GetBlockData(cellIndex).GetTerrainTypeProperty();
if (blockData == null) return false;
if (!blockData.selectable) return false;
owner.MoveTo(cellIndex, cancelFollow);
return true;
}
/// <summary>
/// AI检查并移动
/// AI 移动向敌人并检查
/// </summary>
public static void CheckAndMove(GameUnit owner, int cellIndex, bool cancelFollow = true)
{
if (owner == null || cellIndex == -1) return;
//if (owner.statusData.isMoveing) return;
owner.MoveTo(cellIndex, cancelFollow);
// DebugUtil.LogError("开始向:{0}移动", cellIndex);
if (!MoveTo(owner, cellIndex, cancelFollow)) return;
if (owner.gameunitType != EGameUnitType.Character
&& owner.gameunitType != EGameUnitType.Vehicle) return;

View File

@ -1,9 +1,9 @@
using BehaviorDesigner.Runtime.Tasks;
using Gameplay.AI;
using Gameplay.BT.Variables;
using Gameplay.Common;
using Gameplay.Level;
using Gameplay.Unit;
using Gameplay.AI;
using Gameplay;
namespace Code.Scripts.Gameplay.BT.Task
{
@ -11,40 +11,47 @@ namespace Code.Scripts.Gameplay.BT.Task
{
public SharedBattleInfo SharedBattleInfo;
private int _TargetCellIndex;
private int _targetCellIndex;
private int _lastTargetPointIndex;
private GameUnit _owner;
private Map _map;
private Level _level;
public override void OnStart()
{
_owner = GameUnitManager.instance.infightUnits.Search(SharedBattleInfo.Value.ownerId);
_level = LevelManager.Instance.CurrentLevel;
if (_level != null)
_map = _level.Map;
// 回到离自己最近的巡逻点
if (SharedBattleInfo.Value.PartolPointIndex == -1)
{
SharedBattleInfo.Value.PartolPointIndex =
AIUtils.FindNearestPointInPatrolInfo(_owner, SharedBattleInfo.Value.PatrolInfos);
_TargetCellIndex = LevelManager.Instance.CurrentLevel.Map.BlockPosition2TGSCellIndex(SharedBattleInfo
.Value.PatrolInfos[SharedBattleInfo.Value.PartolPointIndex].patrolPoint);
SharedBattleInfo.Value.PartolPointIndex = AIUtils.FindNearestPointInPatrolInfo(_owner, SharedBattleInfo.Value.PatrolInfos);
_lastTargetPointIndex = -1;
}
}
public override TaskStatus OnUpdate()
{
if (SharedBattleInfo.Value.PartolPointIndex != _lastTargetPointIndex && !AIUtils.IsNeedStop(_owner))
if (AIUtils.AINeedStopUpdate(_level)) return TaskStatus.Running;
if (!_owner.statusData.isMoveing && SharedBattleInfo.Value.PartolPointIndex != _lastTargetPointIndex && !AIUtils.IsNeedStop(_owner))
{
_lastTargetPointIndex = SharedBattleInfo.Value.PartolPointIndex;
_TargetCellIndex = LevelManager.Instance.CurrentLevel.Map.BlockPosition2TGSCellIndex(SharedBattleInfo
.Value.PatrolInfos[SharedBattleInfo.Value.PartolPointIndex].patrolPoint);
AIUtils.CheckAndMove(_owner, _TargetCellIndex, false);
_targetCellIndex =
AIUtils.GetPatrolPointIndexFromVector2Int(_map, SharedBattleInfo.Value.PartolPointIndex, SharedBattleInfo.Value.PatrolInfos);
AIUtils.MoveTo(_owner, _targetCellIndex, false);
return TaskStatus.Running;
}
if (_owner.transData.cellIndex == _TargetCellIndex)
if (_owner.transData.cellIndex == _targetCellIndex)
return TaskStatus.Success;
if (!_owner.statusData.isMoveing) // 没有移动表示路径错误,被控制,被阻挡,需要重新设置移动
_lastTargetPointIndex = -1;
/*if (!_owner.statusData.isMoveing) // 没有移动表示路径错误,被控制,被阻挡,需要重新设置移动
_lastTargetPointIndex = -1;*/
return TaskStatus.Running;
}

View File

@ -1,26 +1,26 @@
using BehaviorDesigner.Runtime.Tasks;
using Framework;
using Gameplay.AI;
using Gameplay.BT.Variables;
using Gameplay.Character;
using Gameplay.Common;
using Gameplay.Level;
using Gameplay.Unit;
using Gameplay.AI;
using Framework;
namespace Code.Scripts.Gameplay.BT.Conditional
{
/// <summary>
/// 是否受到攻击 不需要判断是否为同一目标 需要一直后退
/// </summary>
public class BTBeingAttacked : BehaviorDesigner.Runtime.Tasks.Conditional
{
public SharedBattleInfo SharedBattleInfo;
public bool _isBeingAttacked;
private bool _isBeingAttacked;
private bool _isRegistered;
private GameUnit _owner;
private GameUnit _target;
public override void OnStart()
{
if (!_isRegistered)
{
EventManager.Instance.Register<EventDataGetDamaged>(EventManager.EventName.INFIGHT_GET_DAMAGED_FOR_AI, OnDamaged);
@ -40,6 +40,7 @@ namespace Code.Scripts.Gameplay.BT.Conditional
_owner.statusData.isAttackActive = true;
if (data.sender != null)
{
// 如果收到多个攻击 选择最近的攻击目标
_target = _target != null
? _target = AIUtils.GetNearestGameUnit(data.owner, data.sender, _target)
: _target = data.sender;
@ -52,16 +53,34 @@ namespace Code.Scripts.Gameplay.BT.Conditional
public override TaskStatus OnUpdate()
{
if (_isBeingAttacked && SharedBattleInfo.Value.theChosenOneId != Constants.INVALID_UINT_ID
&& SharedBattleInfo.Value.AIName == LevelData.AIType.FallBackAI)
AIUtils.ActiveAIAttack(_owner);
// _owner.controlData.targetEnemy 外部判断
if (SharedBattleInfo.Value.AIName == LevelData.AIType.FallBackIntensifyAI)
{
return TaskStatus.Success;
// 被攻击但攻击对象不在视野内
if (_isBeingAttacked && _owner.controlData.targetEnemy == null)
{
_isBeingAttacked = false;
return TaskStatus.Success;
}
// 被攻击但敌人在攻击范围内
if (_isBeingAttacked && _owner.controlData.targetEnemy != null)
{
_isBeingAttacked = false;
return TaskStatus.Running;
}
}
if (_isBeingAttacked && SharedBattleInfo.Value.theChosenOneId != Constants.INVALID_UINT_ID
&& SharedBattleInfo.Value.AIName == LevelData.AIType.FallBackIntensifyAI)
if (_isBeingAttacked && SharedBattleInfo.Value.AIName == LevelData.AIType.FallBackAI)
{
return AIUtils.FindEnemiesInAttackDistance(_owner).Contains(_target) ? TaskStatus.Running : TaskStatus.Success;
if (SharedBattleInfo.Value.theChosenOneId != Constants.INVALID_UINT_ID)
{
_isBeingAttacked = false;
return TaskStatus.Success;
}
}
return TaskStatus.Running;
}
@ -72,6 +91,7 @@ namespace Code.Scripts.Gameplay.BT.Conditional
EventManager.Instance.Unregister<EventDataGetDamaged>(EventManager.EventName.INFIGHT_GET_DAMAGED_FOR_AI, OnDamaged);
_isRegistered = false;
}
_isBeingAttacked = false;
}

View File

@ -1,61 +1,33 @@
using BehaviorDesigner.Runtime.Tasks;
using Framework;
using Gameplay.AI;
using Gameplay.BT.Variables;
using Gameplay.Common;
using Gameplay.Level;
using Gameplay.Unit;
using Framework;
namespace Code.Scripts.Gameplay.BT.Conditional
{
/// <summary>
///
/// </summary>
public class BTChainTrigger : BehaviorDesigner.Runtime.Tasks.Conditional
{
public SharedBattleInfo SharedBattleInfo;
private GameUnit _owner;
private uint _lastTarget;
public override void OnStart()
{
_owner = GameUnitManager.instance.infightUnits.Search(SharedBattleInfo.Value.ownerId);
}
public override TaskStatus OnUpdate()
{
if (_owner != null && SharedBattleInfo.Value.AttachAIName == LevelData.AttachAIType.ChainAI
&& _owner.controlData.followUnit == null
&& _owner.controlData.targetEnemy == null)
if (_owner != null && SharedBattleInfo.Value.AttachAIName == LevelData.AttachAIType.ChainAI &&
SharedBattleInfo.Value.theChosenOneId != Constants.INVALID_UINT_ID)
{
var enemy = AIUtils.FindNearestEnemyInSightDistance(_owner);
if (enemy != null)
{
SharedBattleInfo.Value.theChosenOneId = enemy.GetID();
return TaskStatus.Success;
}
else
{
return TaskStatus.Failure;
}
return TaskStatus.Success;
}
else if (_owner != null && SharedBattleInfo.Value.AttachAIName == LevelData.AttachAIType.ChainAI
&& (_owner.controlData.followUnit != null || _owner.controlData.targetEnemy != null))
{
if (_owner.controlData.targetEnemy != null)
{
SharedBattleInfo.Value.theChosenOneId = _owner.controlData.targetEnemy.GetID();
return TaskStatus.Success;
}
if (_owner.controlData.followUnit != null)
{
SharedBattleInfo.Value.theChosenOneId = _owner.controlData.followUnit.GetID();
return TaskStatus.Success;
}
}
return TaskStatus.Failure;
}
}
}

View File

@ -1,27 +1,24 @@
using BehaviorDesigner.Runtime.Tasks;
using Framework;
using Gameplay.BT.Variables;
using Gameplay.Unit;
using Framework;
namespace Code.Scripts.Gameplay.AI.Conditional
{
/// <summary>
/// 检测是否激活
/// 检测是否激活连锁组触发
/// </summary>
public class BTCheckAIGroup : BehaviorDesigner.Runtime.Tasks.Conditional
{
public SharedBattleInfo SharedBattleInfo;
private GameUnit _owner;
public override void OnStart()
{
_owner = GameUnitManager.instance.infightUnits.Search(SharedBattleInfo.Value.ownerId);
}
public override TaskStatus OnUpdate()
{
if (SharedBattleInfo.Value.groupInfo.Count > 0 &&
SharedBattleInfo.Value.theChosenOneId != Constants.INVALID_UINT_ID)
// 有所属组且目标不为空
if (SharedBattleInfo.Value.groupInfo.Count > 0 && SharedBattleInfo.Value.theChosenOneId != Constants.INVALID_UINT_ID)
{
return TaskStatus.Success;
}

View File

@ -1,6 +1,6 @@
using BehaviorDesigner.Runtime.Tasks;
using Gameplay.BT.Variables;
using Gameplay.Level;
using BehaviorDesigner.Runtime.Tasks;
namespace Code.Scripts.Gameplay.BT.Conditional
{
@ -10,9 +10,9 @@ namespace Code.Scripts.Gameplay.BT.Conditional
public override TaskStatus OnUpdate()
{
return SharedBattleInfo.Value.AIName == LevelData.AIType.FallBackAI
return SharedBattleInfo.Value.AIName is LevelData.AIType.FallBackAI or LevelData.AIType.FallBackIntensifyAI
? TaskStatus.Success
: TaskStatus.Failure;
}
}
}
}

View File

@ -1,19 +0,0 @@
using BehaviorDesigner.Runtime.Tasks;
using Gameplay.BT.Variables;
using Gameplay.Level;
namespace Code.Scripts.Gameplay.BT.Conditional
{
public class BTFallBackIntensifyAI : BehaviorDesigner.Runtime.Tasks.Conditional
{
public SharedBattleInfo SharedBattleInfo;
public override TaskStatus OnUpdate()
{
return SharedBattleInfo.Value.AIName == LevelData.AIType.FallBackIntensifyAI
? TaskStatus.Success
: TaskStatus.Failure;
}
}
}

View File

@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: f44399cb3d4c06945a7238ce1fcaf114
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,11 +1,14 @@
using BehaviorDesigner.Runtime.Tasks;
using Gameplay.BT.Variables;
using Framework;
using Gameplay.Character;
using Gameplay.Unit;
using Framework;
namespace Code.Scripts.Gameplay.BT.Conditional
{
/// <summary>
/// 接受连锁召唤事件
/// </summary>
public class BTHasReceivdCalled : BehaviorDesigner.Runtime.Tasks.Conditional
{
public SharedBattleInfo SharedBattleInfo;
@ -19,8 +22,7 @@ namespace Code.Scripts.Gameplay.BT.Conditional
_owner = GameUnitManager.instance.infightUnits.Search(SharedBattleInfo.Value.ownerId);
if (!_isRegistered)
{
EventManager.Instance.Register<EventDataSpecialAI>(EventManager.EventName.INFIGHT_CHARACTER_AI_CHAIN,
OnSpecialTriggerChanged);
EventManager.Instance.Register<EventDataSpecialAI>(EventManager.EventName.INFIGHT_CHARACTER_AI_CHAIN, OnSpecialTriggerChanged);
_isRegistered = true;
_isChainCall = false;
}
@ -28,17 +30,18 @@ namespace Code.Scripts.Gameplay.BT.Conditional
private void OnSpecialTriggerChanged(EventDataSpecialAI chainAIData)
{
if (chainAIData.friendsInOwnerSight.Contains(_owner))
if (chainAIData.friendsInOwnerSight.Contains(_owner) && chainAIData.owner != _owner)
{
_owner.statusData.isAttackActive = true;
_isChainCall = true;
SharedBattleInfo.Value.theChosenOneId = chainAIData.target;
// DebugUtil.LogError("AI {0} ,已经被连锁召唤,召唤者是:{1}, 目标是:{2}", _owner.GetID(), chainAIData.owner.GetID(), chainAIData.target);
}
}
public override TaskStatus OnUpdate()
{
if ( /*SharedBattleInfo.Value.AttachAIName != LevelData.AttachAIType.ChainAI &&*/ _isChainCall)
if (_isChainCall)
{
return TaskStatus.Success;
}

View File

@ -1,9 +1,12 @@
using BehaviorDesigner.Runtime.Tasks;
using Framework;
using Gameplay.BT.Variables;
using Gameplay.Character;
using Gameplay.Unit;
using Framework;
/// <summary>
/// 接受连锁触发事件
/// </summary>
public class BTHasReceivdGroupCalled : Conditional
{
@ -17,8 +20,7 @@ public class BTHasReceivdGroupCalled : Conditional
_owner = GameUnitManager.instance.infightUnits.Search(SharedBattleInfo.Value.ownerId);
if (!_isRegistered)
{
EventManager.Instance.Register<EventDataSpecialAI>(EventManager.EventName.INFIGHT_CHARACTER_AI_GROUPCHAIN,
OnGroupChain);
EventManager.Instance.Register<EventDataSpecialAI>(EventManager.EventName.INFIGHT_CHARACTER_AI_GROUPCHAIN, OnGroupChain);
_isRegistered = true;
_isChainCall = false;
}
@ -28,12 +30,12 @@ public class BTHasReceivdGroupCalled : Conditional
{
foreach (var group in SharedBattleInfo.Value.groupInfo)
{
if (chainAIData.groups.Contains(group))
if (chainAIData.groups.Contains(group) && chainAIData.owner != _owner)
{
_owner.statusData.isAttackActive = true;
_isChainCall = true;
SharedBattleInfo.Value.theChosenOneId = chainAIData.target;
//DebugUtil.LogError("AI {0} ,已经被指定组触发,目标是:{1}", _owner.GetID(), SharedBattleInfo.Value.theChosenOneId);
// DebugUtil.LogError("AI {0} ,已经被指定组触发,目标是:{1}", _owner.GetID(), SharedBattleInfo.Value.theChosenOneId);
}
}
}

View File

@ -1,10 +1,9 @@
using BehaviorDesigner.Runtime.Tasks;
using Framework;
using Gameplay.AI;
using Gameplay.BT.Variables;
using Gameplay.Character;
using Gameplay.Level;
using Gameplay.Unit;
using Gameplay.AI;
using Framework;
namespace Code.Scripts.Gameplay.BT.Conditional
{
@ -14,7 +13,6 @@ namespace Code.Scripts.Gameplay.BT.Conditional
private bool _isBeingAttacked;
private bool _isRegistered;
private GameUnit _owner;
private Level _level;
private GameUnit _target;
public override void OnStart()
@ -27,16 +25,15 @@ namespace Code.Scripts.Gameplay.BT.Conditional
_isBeingAttacked = false;
}
_level = LevelManager.Instance.CurrentLevel;
_owner = GameUnitManager.instance.infightUnits.Search(SharedBattleInfo.Value.ownerId);
}
private void OnDamaged(EventDataGetDamaged data)
{
//data.sender 发送受伤的角色 data.owner 受到伤害的角色
if (data.owner.GetID() == _owner.GetID())
{
_isBeingAttacked = true;
_owner.statusData.isAttackActive = true;
if (data.sender != null)
{
_target = _target != null
@ -44,55 +41,59 @@ namespace Code.Scripts.Gameplay.BT.Conditional
: _target = data.sender;
_target = AIUtils.GetNearestGameUnit(data.owner, data.sender, _target);
SharedBattleInfo.Value.theChosenOneId = _target.GetID();
_owner.statusData.isAttackActive = true;
// DebugUtil.LogG($"BT harmed by: {data.sender?.GetID()} ,But Target is {_target.GetID()}, owner: {_owner?.GetID()}");
}
}
}
public override TaskStatus OnUpdate()
{
if (_owner == null) return TaskStatus.Running;
AIUtils.ActiveAIAttack(_owner);
if (_isBeingAttacked || _owner.statusData.isAttackActive)
// 有目标敌人
if (_owner.statusData.isAttackActive && _owner.controlData.targetEnemy != null)
{
if (SharedBattleInfo.Value.theChosenOneId != Constants.INVALID_UINT_ID)
{
return TaskStatus.Success;
}
_target = _owner.controlData.targetEnemy;
SharedBattleInfo.Value.theChosenOneId = _owner.controlData.targetEnemy.GetID();
return TaskStatus.Success;
}
if (_owner != null && _level != null
&& _owner.controlData.followUnit == null
&& _owner.controlData.targetEnemy == null)
// 被攻击或被召唤
if (_owner.statusData.isAttackActive && SharedBattleInfo.Value.theChosenOneId != Constants.INVALID_UINT_ID)
{
if (GameUnitManager.instance.infightUnits.Contains(SharedBattleInfo.Value.theChosenOneId))
{
var enemy = GameUnitManager.instance.infightUnits.Search(SharedBattleInfo.Value.theChosenOneId);
if (enemy != null && !enemy.statusData.isDead)
{
_target = enemy;
return TaskStatus.Success;
}
}
else
{
SharedBattleInfo.Value.theChosenOneId = Constants.INVALID_UINT_ID;
}
}
// 如果目标都为空 寻找敌人
if (_owner.controlData.targetEnemy == null && _owner.controlData.followUnit == null)
{
var enemy = AIUtils.FindNearestEnemyInSightDistance(_owner);
if (enemy != null)
{
_target = enemy;
SharedBattleInfo.Value.theChosenOneId = enemy.GetID();
return TaskStatus.Success;
}
if (SharedBattleInfo.Value.theChosenOneId != Constants.INVALID_UINT_ID) return TaskStatus.Running;
SharedBattleInfo.Value.theChosenOneId = Constants.INVALID_UINT_ID;
return TaskStatus.Failure;
}
if (_owner != null && _level != null
&& (_owner.controlData.followUnit != null ||
_owner.controlData.targetEnemy != null))
{
if (_owner.controlData.targetEnemy != null && _owner.statusData.isAttackActive)
{
SharedBattleInfo.Value.theChosenOneId = _owner.controlData.targetEnemy.GetID();
return TaskStatus.Success;
}
/*if (_owner.controlData.followUnit != null && _owner.statusData.isAttackActive)
{
SharedBattleInfo.Value.theChosenOneId = _owner.controlData.followUnit.GetID();
return TaskStatus.Success;
}*/
}
return TaskStatus.Running;
}

View File

@ -15,21 +15,26 @@ namespace Code.Scripts.Gameplay.BT.Task
public override void OnStart()
{
_owner = GameUnitManager.instance.infightUnits.Search(SharedBattleInfo.Value.ownerId);
if (_owner != null)
{
DebugUtil.Log("BT move away start, owner: {0}", _owner?.GetID());
}
}
public override TaskStatus OnUpdate()
{
if (SharedBattleInfo.Value.theChosenOneId != Constants.INVALID_UINT_ID && !AIUtils.IsNeedStop(_owner))
if (_owner != null && SharedBattleInfo.Value.theChosenOneId != Constants.INVALID_UINT_ID && !AIUtils.IsNeedStop(_owner))
{
var unit = GameUnitManager.instance.infightUnits.Search(SharedBattleInfo.Value.theChosenOneId);
if (unit != null)
_owner?.MoveAway(unit);
// DebugUtil.LogG($"BT move away update success, owner: {_owner?.GetID()}, target: {SharedBattleInfo.Value.theChosenOneId}");
if (GameUnitManager.instance.infightUnits.Contains(SharedBattleInfo.Value.theChosenOneId))
{
var enemy = GameUnitManager.instance.infightUnits.Search(SharedBattleInfo.Value.theChosenOneId);
if (enemy != null && !enemy.statusData.isDead)
{
if (_owner.MoveAway(enemy))
SharedBattleInfo.Value.theChosenOneId = Constants.INVALID_UINT_ID;
}
}
else
{
SharedBattleInfo.Value.theChosenOneId = Constants.INVALID_UINT_ID;
}
}
return TaskStatus.Success;

View File

@ -1,24 +1,22 @@
using BehaviorDesigner.Runtime.Tasks;
using Framework;
using Gameplay.AI;
using Gameplay.BT.Variables;
using Gameplay.Character;
using Gameplay.Unit;
using Gameplay.AI;
using Framework;
namespace Code.Scripts.Gameplay.BT.Task
{
public class BTMoveTo : Action
{
public SharedBattleInfo SharedBattleInfo;
private GameUnit _owner;
private GameUnit _target;
private uint _lastTarget;
private bool _isRegistered;
private bool _isBeingAttacked;
private GameUnit _target;
public override void OnStart()
{
if (!_isRegistered)
@ -30,17 +28,12 @@ namespace Code.Scripts.Gameplay.BT.Task
}
_owner = GameUnitManager.instance.infightUnits.Search(SharedBattleInfo.Value.ownerId);
if (_owner != null)
{
// DebugUtil.Log("BT move to start, owner: {0}", _owner?.GetID());
}
}
private void OnDamaged(EventDataGetDamaged data)
{
//data.sender 发送受伤的角色 data.owner 受到伤害的角色
if (data.owner.GetID() == _owner.GetID())
/*if (data.owner.GetID() == _owner.GetID())
{
_isBeingAttacked = true;
if (data.sender != null)
@ -51,9 +44,8 @@ namespace Code.Scripts.Gameplay.BT.Task
_target = AIUtils.GetNearestGameUnit(data.owner, data.sender, _target);
SharedBattleInfo.Value.theChosenOneId = _target.GetID();
_owner.statusData.isAttackActive = true;
// DebugUtil.LogG($"BT harmed by: {data.sender?.GetID()} ,But Target is {_target.GetID()}, owner: {_owner?.GetID()}");
}
}
}*/
}
public override TaskStatus OnUpdate()
@ -71,15 +63,14 @@ namespace Code.Scripts.Gameplay.BT.Task
}
}
if (_owner?.controlData.targetEnemy == null/* && _owner?.controlData.followUnit == null*/)
if (_owner?.controlData.targetEnemy == null)
{
_lastTarget = Constants.INVALID_UINT_ID;
}
return TaskStatus.Running;
}
return TaskStatus.Failure;
}

View File

@ -1,27 +1,27 @@
using BehaviorDesigner.Runtime.Tasks;
using Gameplay.AI;
using Gameplay.BT.Variables;
using Gameplay.Character;
using Gameplay.Level;
using Gameplay.Unit;
using Gameplay.AI;
namespace Code.Scripts.Gameplay.BT.Task
{
public class BTMoveToBornPosition : Action
{
public SharedBattleInfo SharedBattleInfo;
private GameUnit _owner;
private int _bornCellIndex;
private GameUnit _owner;
public override void OnStart()
{
_owner = GameUnitManager.instance.infightUnits.Search(SharedBattleInfo.Value.ownerId);
if (_owner != null)
_bornCellIndex =
LevelManager.Instance.CurrentLevel.Map.BlockPosition2TGSCellIndex(_owner.unitLevelData
.BornPosition);
SharedBattleInfo.Value.PartolPointIndex = -1;
// 如果需要巡逻 返回
if (SharedBattleInfo.Value.PatrolInfos.Count > 0)
return;
_owner = GameUnitManager.instance.infightUnits.Search(SharedBattleInfo.Value.ownerId);
var map = LevelManager.Instance.CurrentLevel.Map;
if (_owner != null && map != null)
_bornCellIndex = map.BlockPosition2TGSCellIndex(_owner.unitLevelData.BornPosition);
}
public override TaskStatus OnUpdate()
@ -33,7 +33,7 @@ namespace Code.Scripts.Gameplay.BT.Task
if (_owner.transData.cellIndex != _bornCellIndex && !AIUtils.IsNeedStop(_owner))
{
AIUtils.CheckAndMove(_owner, _bornCellIndex);
AIUtils.MoveTo(_owner, _bornCellIndex);
}
return TaskStatus.Running;

View File

@ -1,20 +1,24 @@
using BehaviorDesigner.Runtime.Tasks;
using Framework;
using Gameplay.AI;
using Gameplay.BT.Variables;
using Gameplay.Character;
using Gameplay.Unit;
using Gameplay.AI;
using Framework;
namespace Code.Scripts.Gameplay.AI.Task
{
/// <summary>
/// 发送连锁触发反应
/// 召唤连锁组内的友军
/// </summary>
public class BTSendChainActive : Action
{
public SharedBattleInfo SharedBattleInfo;
private GameUnit _owner;
private uint _target;
/// <summary>
/// 上一个目标
/// </summary>
private uint _lastTarget;
public override void OnStart()
{
@ -23,10 +27,9 @@ namespace Code.Scripts.Gameplay.AI.Task
public override TaskStatus OnUpdate()
{
if (_owner != null && SharedBattleInfo.Value.theChosenOneId != Constants.INVALID_UINT_ID &&
_target != SharedBattleInfo.Value.theChosenOneId)
if (_owner != null && SharedBattleInfo.Value.theChosenOneId != Constants.INVALID_UINT_ID && _lastTarget != SharedBattleInfo.Value.theChosenOneId)
{
_target = SharedBattleInfo.Value.theChosenOneId;
_lastTarget = SharedBattleInfo.Value.theChosenOneId;
EventManager.Instance.Send(EventManager.EventName.INFIGHT_CHARACTER_AI_GROUPCHAIN,
new EventDataSpecialAI
{
@ -35,7 +38,7 @@ namespace Code.Scripts.Gameplay.AI.Task
target = SharedBattleInfo.Value.theChosenOneId,
groups = SharedBattleInfo.Value.groupInfo,
});
//DebugUtil.LogError("AI :{0} 发送了组连锁事件,目标是:{1}", _owner.GetID(), SharedBattleInfo.Value.theChosenOneId);
// DebugUtil.LogError("AI :{0} 发送了组连锁事件,目标是:{1}", _owner.GetID(), SharedBattleInfo.Value.theChosenOneId);
return TaskStatus.Running;
}

View File

@ -1,13 +1,15 @@
using BehaviorDesigner.Runtime.Tasks;
using Framework;
using Gameplay.AI;
using Gameplay.BT.Variables;
using Gameplay.Character;
using Gameplay.Common;
using Gameplay.Unit;
using Gameplay.AI;
using Framework;
namespace Code.Scripts.Gameplay.BT.Task
{
/// <summary>
/// 召唤视野里面的友军
/// </summary>
public class BTSendChainCall : Action
{
public SharedBattleInfo SharedBattleInfo;
@ -31,6 +33,7 @@ namespace Code.Scripts.Gameplay.BT.Task
friendsInOwnerSight = AIUtils.FindFriendsInSightDistance(_owner),
target = SharedBattleInfo.Value.theChosenOneId
});
// DebugUtil.LogError("AI :{0} 发送了召唤视野内友军事件,目标是:{1}", _owner.GetID(), SharedBattleInfo.Value.theChosenOneId);
return TaskStatus.Running;
}
return TaskStatus.Failure;

View File

@ -1,9 +1,8 @@
using BehaviorDesigner.Runtime.Tasks;
using Gameplay.AI;
using Gameplay.BT.Variables;
using Gameplay.Common;
using Gameplay.Unit;
using UnityEngine;
using Gameplay.AI;
namespace Code.Scripts.Gameplay.BT.Task
{
@ -28,9 +27,7 @@ namespace Code.Scripts.Gameplay.BT.Task
waitTime = SharedBattleInfo.Value.PatrolInfos[SharedBattleInfo.Value.PartolPointIndex].waitTime;
waitDuration = waitTime;
}
public override TaskStatus OnUpdate()
{
// The task is done waiting if the time waitDuration has elapsed since the task was started.

View File

@ -648,20 +648,29 @@ namespace Gameplay.Unit
{
}
public void MoveAway(GameUnit unit)
public bool MoveAway(GameUnit unit)
{
if (unit == null) return;
if (unit == null) return false;
Vector2Int targetPos;
var map = LevelManager.Instance.CurrentLevel.Map;
if (map == null) return false;
var mapData = map.MapData;
if (mapData == null) return false;
map.WorldPosition2BlockPosition(unit.Node.GetPosition(), out targetPos);
var selfPos = map.TGSCellIndex2BlockPosition(transData.cellIndex);
selfPos.x = Math.Clamp((selfPos.x - targetPos.x) > 0 ? selfPos.x + 1 : selfPos.x - 1, 0, map.MapData.Height - 1);
selfPos.y = Math.Clamp((selfPos.y - targetPos.y) > 0 ? selfPos.y + 1 : selfPos.y - 1, 0, map.MapData.Width - 1);
var index = map.BlockPosition2TGSCellIndex(selfPos);
var blockData = map.MapData.GetBlockData(index).GetTerrainTypeProperty();
if(blockData ==null) return false;
// 保证后退格子有效
if(map.MapData.GetBlockData(index).GetTerrainTypeProperty().selectable)
if (blockData.selectable)
{
MoveTo(map.BlockPosition2TGSCellIndex(selfPos), true);
return true;
}
return false;
}
public void MoveTo(GameUnit unit)

View File

@ -33,25 +33,22 @@ MonoBehaviour:
Chain Trigger","Instant":true,"SharedBattleInfoSharedBattleInfo":{"Type":"Gameplay.BT.Variables.SharedBattleInfo","Name":"battleInfo","IsShared":true,"BattleInfomValue":{"UInt32ownerId":0,"UInt32theChosenOneId":0,"AITypeAIName":"BasicAI","AttachAITypeAttachAIName":"None","List`1PatrolInfos":[],"Int32PartolPointIndex":0,"List`1groupInfo":[],"BooleanAutoFight":true}}},{"Type":"BehaviorDesigner.Runtime.Tasks.Wait","NodeData":{"Offset":"(16.2412872,520.2404)"},"ID":20,"Name":"Wait","Instant":true,"SharedFloatwaitTime":{"Type":"BehaviorDesigner.Runtime.SharedFloat","Name":null,"SinglemValue":0.5},"SharedBoolrandomWait":{"Type":"BehaviorDesigner.Runtime.SharedBool","Name":null,"BooleanmValue":false},"SharedFloatrandomWaitMin":{"Type":"BehaviorDesigner.Runtime.SharedFloat","Name":null,"SinglemValue":1},"SharedFloatrandomWaitMax":{"Type":"BehaviorDesigner.Runtime.SharedFloat","Name":null,"SinglemValue":1}},{"Type":"Code.Scripts.Gameplay.BT.Task.BTSendChainCall","NodeData":{"Offset":"(183.150192,511.999725)"},"ID":21,"Name":"BT
Send Chain Call","Instant":true,"SharedBattleInfoSharedBattleInfo":{"Type":"Gameplay.BT.Variables.SharedBattleInfo","Name":"battleInfo","IsShared":true,"BattleInfomValue":{"UInt32ownerId":0,"UInt32theChosenOneId":0,"AITypeAIName":"BasicAI","AttachAITypeAttachAIName":"None","List`1PatrolInfos":[],"Int32PartolPointIndex":0,"List`1groupInfo":[],"BooleanAutoFight":true}}}]},{"Type":"BehaviorDesigner.Runtime.Tasks.Sequence","NodeData":{"Offset":"(-220.0161,201.977249)"},"ID":22,"Name":"Sequence","Instant":true,"AbortTypeabortType":"Both","Children":[{"Type":"Code.Scripts.Gameplay.BT.Conditional.BTBehavioralTrigger","NodeData":{"Offset":"(-65.82873,282.6978)"},"ID":23,"Name":"BT
Behavioral Trigger","Instant":true,"SharedBattleInfoSharedBattleInfo":{"Type":"Gameplay.BT.Variables.SharedBattleInfo","Name":"battleInfo","IsShared":true,"BattleInfomValue":{"UInt32ownerId":0,"UInt32theChosenOneId":0,"AITypeAIName":"BasicAI","AttachAITypeAttachAIName":"None","List`1PatrolInfos":[],"Int32PartolPointIndex":0,"List`1groupInfo":[],"BooleanAutoFight":true}}},{"Type":"Code.Scripts.Gameplay.BT.Task.BTMoveTo","NodeData":{"Offset":"(68.87425,279.4636)"},"ID":24,"Name":"BT
Move To","Instant":true,"SharedBattleInfoSharedBattleInfo":{"Type":"Gameplay.BT.Variables.SharedBattleInfo","Name":"battleInfo","IsShared":true,"BattleInfomValue":{"UInt32ownerId":0,"UInt32theChosenOneId":0,"AITypeAIName":"BasicAI","AttachAITypeAttachAIName":"None","List`1PatrolInfos":[],"Int32PartolPointIndex":0,"List`1groupInfo":[],"BooleanAutoFight":true}}}]},{"Type":"BehaviorDesigner.Runtime.Tasks.Sequence","NodeData":{"Offset":"(187.5299,182.307663)"},"ID":25,"Name":"Sequence","Instant":true,"AbortTypeabortType":"Both","Children":[{"Type":"Code.Scripts.Gameplay.BT.Conditional.BTFallBackIntensifyAI","NodeData":{"Offset":"(-206.7258,150.0616)"},"ID":26,"Name":"BT
Fall Back Intensify AI","Instant":true,"SharedBattleInfoSharedBattleInfo":{"Type":"Gameplay.BT.Variables.SharedBattleInfo","Name":"battleInfo","IsShared":true,"BattleInfomValue":{"UInt32ownerId":0,"UInt32theChosenOneId":0,"AITypeAIName":"BasicAI","AttachAITypeAttachAIName":"None","List`1PatrolInfos":[],"Int32PartolPointIndex":0,"List`1groupInfo":[],"BooleanAutoFight":true}}},{"Type":"Code.Scripts.Gameplay.BT.Conditional.BTBeingAttacked","NodeData":{"Offset":"(-96.52779,245.833344)"},"ID":27,"Name":"BT
Being Attacked","Instant":true,"SharedBattleInfoSharedBattleInfo":{"Type":"Gameplay.BT.Variables.SharedBattleInfo","Name":"battleInfo","IsShared":true,"BattleInfomValue":{"UInt32ownerId":0,"UInt32theChosenOneId":0,"AITypeAIName":"BasicAI","AttachAITypeAttachAIName":"None","List`1PatrolInfos":[],"Int32PartolPointIndex":0,"List`1groupInfo":[],"BooleanAutoFight":true}},"Boolean_isBeingAttacked":false},{"Type":"Code.Scripts.Gameplay.BT.Task.BTMoveAway","NodeData":{"Offset":"(-12.3610706,353.472229)"},"ID":28,"Name":"BT
Move Away","Instant":true,"SharedBattleInfoSharedBattleInfo":{"Type":"Gameplay.BT.Variables.SharedBattleInfo","Name":"battleInfo","IsShared":true,"BattleInfomValue":{"UInt32ownerId":0,"UInt32theChosenOneId":0,"AITypeAIName":"BasicAI","AttachAITypeAttachAIName":"None","List`1PatrolInfos":[],"Int32PartolPointIndex":0,"List`1groupInfo":[],"BooleanAutoFight":true}}},{"Type":"BehaviorDesigner.Runtime.Tasks.Idle","NodeData":{"Offset":"(66.25058,448.333984)"},"ID":29,"Name":"Idle","Instant":true}]},{"Type":"BehaviorDesigner.Runtime.Tasks.Sequence","NodeData":{"Offset":"(432.352173,187.717072)"},"ID":30,"Name":"Sequence","Instant":true,"AbortTypeabortType":"Both","Children":[{"Type":"Code.Scripts.Gameplay.BT.Conditional.BTFallBackAI","NodeData":{"Offset":"(-90.9525146,165.148987)"},"ID":31,"Name":"BT
Fall Back AI","Instant":true,"SharedBattleInfoSharedBattleInfo":{"Type":"Gameplay.BT.Variables.SharedBattleInfo","Name":"battleInfo","IsShared":true,"BattleInfomValue":{"UInt32ownerId":0,"UInt32theChosenOneId":0,"AITypeAIName":"BasicAI","AttachAITypeAttachAIName":"None","List`1PatrolInfos":[],"Int32PartolPointIndex":0,"List`1groupInfo":[],"BooleanAutoFight":true}}},{"Type":"Code.Scripts.Gameplay.BT.Conditional.BTBeingAttacked","NodeData":{"Offset":"(5.87202263,252.1221)"},"ID":32,"Name":"BT
Being Attacked","Instant":true,"SharedBattleInfoSharedBattleInfo":{"Type":"Gameplay.BT.Variables.SharedBattleInfo","Name":"battleInfo","IsShared":true,"BattleInfomValue":{"UInt32ownerId":0,"UInt32theChosenOneId":0,"AITypeAIName":"BasicAI","AttachAITypeAttachAIName":"None","List`1PatrolInfos":[],"Int32PartolPointIndex":0,"List`1groupInfo":[],"BooleanAutoFight":true}},"Boolean_isBeingAttacked":false},{"Type":"Code.Scripts.Gameplay.BT.Task.BTMoveAway","NodeData":{"Offset":"(94.99995,336.25)"},"ID":33,"Name":"BT
Move Away","Instant":true,"SharedBattleInfoSharedBattleInfo":{"Type":"Gameplay.BT.Variables.SharedBattleInfo","Name":"battleInfo","IsShared":true,"BattleInfomValue":{"UInt32ownerId":0,"UInt32theChosenOneId":0,"AITypeAIName":"BasicAI","AttachAITypeAttachAIName":"None","List`1PatrolInfos":[],"Int32PartolPointIndex":0,"List`1groupInfo":[],"BooleanAutoFight":true}}},{"Type":"BehaviorDesigner.Runtime.Tasks.Idle","NodeData":{"Offset":"(188.125,430)"},"ID":34,"Name":"Idle","Instant":true}]},{"Type":"BehaviorDesigner.Runtime.Tasks.Sequence","NodeData":{"Offset":"(913.214539,214.582657)"},"ID":35,"Name":"Sequence","Instant":true,"AbortTypeabortType":"LowerPriority","Children":[{"Type":"Code.Scripts.Gameplay.BT.Conditional.BTBasicAI","NodeData":{"Offset":"(-133.994186,176.258942)"},"ID":36,"Name":"BT
Basic AI","Instant":true,"SharedBattleInfoSharedBattleInfo":{"Type":"Gameplay.BT.Variables.SharedBattleInfo","Name":"battleInfo","IsShared":true,"BattleInfomValue":{"UInt32ownerId":0,"UInt32theChosenOneId":0,"AITypeAIName":"BasicAI","AttachAITypeAttachAIName":"None","List`1PatrolInfos":[],"Int32PartolPointIndex":0,"List`1groupInfo":[],"BooleanAutoFight":true}}},{"Type":"BehaviorDesigner.Runtime.Tasks.Selector","NodeData":{"Offset":"(113.974785,169.93251)"},"ID":37,"Name":"Selector","Instant":true,"AbortTypeabortType":"None","Children":[{"Type":"BehaviorDesigner.Runtime.Tasks.Sequence","NodeData":{"Offset":"(-181.1063,144.5812)"},"ID":38,"Name":"Sequence","Instant":true,"AbortTypeabortType":"Both","Children":[{"Type":"Code.Scripts.Gameplay.BT.Conditional.BTWithinSight","NodeData":{"Offset":"(-74.29743,179.094315)"},"ID":39,"Name":"BT
Within Sight","Instant":true,"SharedBattleInfoSharedBattleInfo":{"Type":"Gameplay.BT.Variables.SharedBattleInfo","Name":"battleInfo","IsShared":true,"BattleInfomValue":{"UInt32ownerId":0,"UInt32theChosenOneId":0,"AITypeAIName":"BasicAI","AttachAITypeAttachAIName":"None","List`1PatrolInfos":[],"Int32PartolPointIndex":0,"List`1groupInfo":[],"BooleanAutoFight":true}}},{"Type":"Code.Scripts.Gameplay.BT.Task.BTMoveTo","NodeData":{"Offset":"(42.1891174,182.105179)"},"ID":40,"Name":"BT
Move To","Instant":true,"SharedBattleInfoSharedBattleInfo":{"Type":"Gameplay.BT.Variables.SharedBattleInfo","Name":"battleInfo","IsShared":true,"BattleInfomValue":{"UInt32ownerId":0,"UInt32theChosenOneId":0,"AITypeAIName":"BasicAI","AttachAITypeAttachAIName":"None","List`1PatrolInfos":[],"Int32PartolPointIndex":0,"List`1groupInfo":[],"BooleanAutoFight":true}}}]},{"Type":"BehaviorDesigner.Runtime.Tasks.Selector","NodeData":{"Offset":"(91.40203,204.546509)"},"ID":41,"Name":"Selector","Instant":true,"AbortTypeabortType":"None","Children":[{"Type":"Code.Scripts.Gameplay.BT.Task.BTMoveToBornPosition","NodeData":{"Offset":"(-135.7143,361.428528)"},"ID":42,"Name":"BT
Move To Born Position","Instant":true,"SharedBattleInfoSharedBattleInfo":{"Type":"Gameplay.BT.Variables.SharedBattleInfo","Name":"battleInfo","IsShared":true,"BattleInfomValue":{"UInt32ownerId":0,"UInt32theChosenOneId":0,"AITypeAIName":"BasicAI","AttachAITypeAttachAIName":"None","List`1PatrolInfos":[],"Int32PartolPointIndex":0,"List`1groupInfo":[],"BooleanAutoFight":true}}},{"Type":"BehaviorDesigner.Runtime.Tasks.Sequence","NodeData":{"Offset":"(153.360779,209.639236)"},"ID":43,"Name":"Sequence","Instant":true,"AbortTypeabortType":"Both","Children":[{"Type":"Code.Scripts.Gameplay.BT.Task.BTBeginPatrol","NodeData":{"Offset":"(-115.262772,152.146027)"},"ID":44,"Name":"BT
Begin Patrol","Instant":true,"SharedBattleInfoSharedBattleInfo":{"Type":"Gameplay.BT.Variables.SharedBattleInfo","Name":"battleInfo","IsShared":true,"BattleInfomValue":{"UInt32ownerId":0,"UInt32theChosenOneId":0,"AITypeAIName":"BasicAI","AttachAITypeAttachAIName":"None","List`1PatrolInfos":[],"Int32PartolPointIndex":0,"List`1groupInfo":[],"BooleanAutoFight":true}}},{"Type":"Code.Scripts.Gameplay.BT.Task.BTWait","NodeData":{"Offset":"(4.930951,149.435211)"},"ID":45,"Name":"BT
Wait","Instant":true,"SharedBattleInfoSharedBattleInfo":{"Type":"Gameplay.BT.Variables.SharedBattleInfo","Name":"battleInfo","IsShared":true,"BattleInfomValue":{"UInt32ownerId":0,"UInt32theChosenOneId":0,"AITypeAIName":"BasicAI","AttachAITypeAttachAIName":"None","List`1PatrolInfos":[],"Int32PartolPointIndex":0,"List`1groupInfo":[],"BooleanAutoFight":true}}},{"Type":"BehaviorDesigner.Runtime.Tasks.Idle","NodeData":{"Offset":"(113.01944,153.541183)"},"ID":46,"Name":"Idle","Instant":true}]}]}]}]},{"Type":"BehaviorDesigner.Runtime.Tasks.Sequence","NodeData":{"Offset":"(1544.63989,164.145813)"},"ID":47,"Name":"Sequence","Instant":true,"AbortTypeabortType":"LowerPriority","Children":[{"Type":"Code.Scripts.Gameplay.BT.Conditional.BTOutflankAI","NodeData":{"Offset":"(-235.951584,205.394287)"},"ID":48,"Name":"BT
Outflank AI","Instant":true,"SharedBattleInfoSharedBattleInfo":{"Type":"Gameplay.BT.Variables.SharedBattleInfo","Name":"battleInfo","IsShared":true,"BattleInfomValue":{"UInt32ownerId":0,"UInt32theChosenOneId":0,"AITypeAIName":"BasicAI","AttachAITypeAttachAIName":"None","List`1PatrolInfos":[],"Int32PartolPointIndex":0,"List`1groupInfo":[],"BooleanAutoFight":true}}},{"Type":"BehaviorDesigner.Runtime.Tasks.Selector","NodeData":{"Offset":"(1.84604836,200)"},"ID":49,"Name":"Selector","Instant":true,"AbortTypeabortType":"None","Children":[{"Type":"BehaviorDesigner.Runtime.Tasks.Sequence","NodeData":{"Offset":"(-80,140)"},"ID":50,"Name":"Sequence","Instant":true,"AbortTypeabortType":"Both","Children":[{"Type":"Code.Scripts.Gameplay.BT.Conditional.BTWithinSight","NodeData":{"Offset":"(-177.201324,135.280273)"},"ID":51,"Name":"BT
Within Sight","Instant":true,"SharedBattleInfoSharedBattleInfo":{"Type":"Gameplay.BT.Variables.SharedBattleInfo","Name":"battleInfo","IsShared":true,"BattleInfomValue":{"UInt32ownerId":0,"UInt32theChosenOneId":0,"AITypeAIName":"BasicAI","AttachAITypeAttachAIName":"None","List`1PatrolInfos":[],"Int32PartolPointIndex":0,"List`1groupInfo":[],"BooleanAutoFight":true}}},{"Type":"BTMoveAroundTo","NodeData":{"Offset":"(-9.982029,146.914551)"},"ID":52,"Name":"BT
Move Around To","Instant":true,"SharedBattleInfoSharedBattleInfo":{"Type":"Gameplay.BT.Variables.SharedBattleInfo","Name":"battleInfo","IsShared":true,"BattleInfomValue":{"UInt32ownerId":0,"UInt32theChosenOneId":0,"AITypeAIName":"BasicAI","AttachAITypeAttachAIName":"None","List`1PatrolInfos":[],"Int32PartolPointIndex":0,"List`1groupInfo":[],"BooleanAutoFight":true}},"EMoveDirectionMoveDirection":"Clockwise"},{"Type":"BehaviorDesigner.Runtime.Tasks.Idle","NodeData":{"Offset":"(120.713676,150.000092)"},"ID":53,"Name":"Idle","Instant":true}]},{"Type":"BehaviorDesigner.Runtime.Tasks.Selector","NodeData":{"Offset":"(256.249664,170.000046)"},"ID":54,"Name":"Selector","Instant":true,"AbortTypeabortType":"None","Children":[{"Type":"Code.Scripts.Gameplay.BT.Task.BTMoveToBornPosition","NodeData":{"Offset":"(-140,360)"},"ID":55,"Name":"BT
Move To Born Position","Instant":true,"SharedBattleInfoSharedBattleInfo":{"Type":"Gameplay.BT.Variables.SharedBattleInfo","Name":"battleInfo","IsShared":true,"BattleInfomValue":{"UInt32ownerId":0,"UInt32theChosenOneId":0,"AITypeAIName":"BasicAI","AttachAITypeAttachAIName":"None","List`1PatrolInfos":[],"Int32PartolPointIndex":0,"List`1groupInfo":[],"BooleanAutoFight":true}}},{"Type":"BehaviorDesigner.Runtime.Tasks.Sequence","NodeData":{"Offset":"(150,210)"},"ID":56,"Name":"Sequence","Instant":true,"AbortTypeabortType":"Both","Children":[{"Type":"Code.Scripts.Gameplay.BT.Task.BTBeginPatrol","NodeData":{"Offset":"(-120,150)"},"ID":57,"Name":"BT
Begin Patrol","Instant":true,"SharedBattleInfoSharedBattleInfo":{"Type":"Gameplay.BT.Variables.SharedBattleInfo","Name":"battleInfo","IsShared":true,"BattleInfomValue":{"UInt32ownerId":0,"UInt32theChosenOneId":0,"AITypeAIName":"BasicAI","AttachAITypeAttachAIName":"None","List`1PatrolInfos":[],"Int32PartolPointIndex":0,"List`1groupInfo":[],"BooleanAutoFight":true}}},{"Type":"Code.Scripts.Gameplay.BT.Task.BTWait","NodeData":{"Offset":"(0,150)"},"ID":58,"Name":"BT
Wait","Instant":true,"SharedBattleInfoSharedBattleInfo":{"Type":"Gameplay.BT.Variables.SharedBattleInfo","Name":"battleInfo","IsShared":true,"BattleInfomValue":{"UInt32ownerId":0,"UInt32theChosenOneId":0,"AITypeAIName":"BasicAI","AttachAITypeAttachAIName":"None","List`1PatrolInfos":[],"Int32PartolPointIndex":0,"List`1groupInfo":[],"BooleanAutoFight":true}}},{"Type":"BehaviorDesigner.Runtime.Tasks.Idle","NodeData":{"Offset":"(110,150)"},"ID":59,"Name":"Idle","Instant":true}]}]}]}]}]}]},{"Type":"BehaviorDesigner.Runtime.Tasks.Idle","NodeData":{"Offset":"(178.075836,160.9367)"},"ID":60,"Name":"Idle","Instant":true}]},"Variables":[{"Type":"Gameplay.BT.Variables.SharedBattleInfo","Name":"battleInfo","IsShared":true,"BattleInfomValue":{"UInt32ownerId":0,"UInt32theChosenOneId":0,"AITypeAIName":"BasicAI","AttachAITypeAttachAIName":"None","List`1PatrolInfos":[],"Int32PartolPointIndex":0,"List`1groupInfo":[],"BooleanAutoFight":true}}]}'
Move To","Instant":true,"SharedBattleInfoSharedBattleInfo":{"Type":"Gameplay.BT.Variables.SharedBattleInfo","Name":"battleInfo","IsShared":true,"BattleInfomValue":{"UInt32ownerId":0,"UInt32theChosenOneId":0,"AITypeAIName":"BasicAI","AttachAITypeAttachAIName":"None","List`1PatrolInfos":[],"Int32PartolPointIndex":0,"List`1groupInfo":[],"BooleanAutoFight":true}}}]},{"Type":"BehaviorDesigner.Runtime.Tasks.Sequence","NodeData":{"Offset":"(265.006226,182.307663)"},"ID":25,"Name":"Sequence","Instant":true,"AbortTypeabortType":"Both","Children":[{"Type":"Code.Scripts.Gameplay.BT.Conditional.BTFallBackAI","NodeData":{"Offset":"(-225.229767,152.529572)"},"ID":26,"Name":"BT
Fall Back AI","Instant":true,"SharedBattleInfoSharedBattleInfo":{"Type":"Gameplay.BT.Variables.SharedBattleInfo","Name":"battleInfo","IsShared":true,"BattleInfomValue":{"UInt32ownerId":0,"UInt32theChosenOneId":0,"AITypeAIName":"BasicAI","AttachAITypeAttachAIName":"None","List`1PatrolInfos":[],"Int32PartolPointIndex":0,"List`1groupInfo":[],"BooleanAutoFight":true}}},{"Type":"Code.Scripts.Gameplay.BT.Conditional.BTBeingAttacked","NodeData":{"Offset":"(-96.52779,245.833344)"},"ID":27,"Name":"BT
Being Attacked","Instant":true,"SharedBattleInfoSharedBattleInfo":{"Type":"Gameplay.BT.Variables.SharedBattleInfo","Name":"battleInfo","IsShared":true,"BattleInfomValue":{"UInt32ownerId":0,"UInt32theChosenOneId":0,"AITypeAIName":"BasicAI","AttachAITypeAttachAIName":"None","List`1PatrolInfos":[],"Int32PartolPointIndex":0,"List`1groupInfo":[],"BooleanAutoFight":true}}},{"Type":"Code.Scripts.Gameplay.BT.Task.BTMoveAway","NodeData":{"Offset":"(-12.3610706,353.472229)"},"ID":28,"Name":"BT
Move Away","Instant":true,"SharedBattleInfoSharedBattleInfo":{"Type":"Gameplay.BT.Variables.SharedBattleInfo","Name":"battleInfo","IsShared":true,"BattleInfomValue":{"UInt32ownerId":0,"UInt32theChosenOneId":0,"AITypeAIName":"BasicAI","AttachAITypeAttachAIName":"None","List`1PatrolInfos":[],"Int32PartolPointIndex":0,"List`1groupInfo":[],"BooleanAutoFight":true}}},{"Type":"BehaviorDesigner.Runtime.Tasks.Idle","NodeData":{"Offset":"(66.25058,448.333984)"},"ID":29,"Name":"Idle","Instant":true}]},{"Type":"BehaviorDesigner.Runtime.Tasks.Sequence","NodeData":{"Offset":"(680.7856,214.582657)"},"ID":30,"Name":"Sequence","Instant":true,"AbortTypeabortType":"LowerPriority","Children":[{"Type":"Code.Scripts.Gameplay.BT.Conditional.BTBasicAI","NodeData":{"Offset":"(-133.994186,176.258942)"},"ID":31,"Name":"BT
Basic AI","Instant":true,"SharedBattleInfoSharedBattleInfo":{"Type":"Gameplay.BT.Variables.SharedBattleInfo","Name":"battleInfo","IsShared":true,"BattleInfomValue":{"UInt32ownerId":0,"UInt32theChosenOneId":0,"AITypeAIName":"BasicAI","AttachAITypeAttachAIName":"None","List`1PatrolInfos":[],"Int32PartolPointIndex":0,"List`1groupInfo":[],"BooleanAutoFight":true}}},{"Type":"BehaviorDesigner.Runtime.Tasks.Selector","NodeData":{"Offset":"(113.974785,169.93251)"},"ID":32,"Name":"Selector","Instant":true,"AbortTypeabortType":"None","Children":[{"Type":"BehaviorDesigner.Runtime.Tasks.Sequence","NodeData":{"Offset":"(-181.1063,144.5812)"},"ID":33,"Name":"Sequence","Instant":true,"AbortTypeabortType":"Both","Children":[{"Type":"Code.Scripts.Gameplay.BT.Conditional.BTWithinSight","NodeData":{"Offset":"(-74.29743,179.094315)"},"ID":34,"Name":"BT
Within Sight","Instant":true,"SharedBattleInfoSharedBattleInfo":{"Type":"Gameplay.BT.Variables.SharedBattleInfo","Name":"battleInfo","IsShared":true,"BattleInfomValue":{"UInt32ownerId":0,"UInt32theChosenOneId":0,"AITypeAIName":"BasicAI","AttachAITypeAttachAIName":"None","List`1PatrolInfos":[],"Int32PartolPointIndex":0,"List`1groupInfo":[],"BooleanAutoFight":true}}},{"Type":"Code.Scripts.Gameplay.BT.Task.BTMoveTo","NodeData":{"Offset":"(42.1891174,182.105179)"},"ID":35,"Name":"BT
Move To","Instant":true,"SharedBattleInfoSharedBattleInfo":{"Type":"Gameplay.BT.Variables.SharedBattleInfo","Name":"battleInfo","IsShared":true,"BattleInfomValue":{"UInt32ownerId":0,"UInt32theChosenOneId":0,"AITypeAIName":"BasicAI","AttachAITypeAttachAIName":"None","List`1PatrolInfos":[],"Int32PartolPointIndex":0,"List`1groupInfo":[],"BooleanAutoFight":true}}}]},{"Type":"BehaviorDesigner.Runtime.Tasks.Selector","NodeData":{"Offset":"(91.40203,204.546509)"},"ID":36,"Name":"Selector","Instant":true,"AbortTypeabortType":"None","Children":[{"Type":"Code.Scripts.Gameplay.BT.Task.BTMoveToBornPosition","NodeData":{"Offset":"(-135.7143,361.428528)"},"ID":37,"Name":"BT
Move To Born Position","Instant":true,"SharedBattleInfoSharedBattleInfo":{"Type":"Gameplay.BT.Variables.SharedBattleInfo","Name":"battleInfo","IsShared":true,"BattleInfomValue":{"UInt32ownerId":0,"UInt32theChosenOneId":0,"AITypeAIName":"BasicAI","AttachAITypeAttachAIName":"None","List`1PatrolInfos":[],"Int32PartolPointIndex":0,"List`1groupInfo":[],"BooleanAutoFight":true}}},{"Type":"BehaviorDesigner.Runtime.Tasks.Sequence","NodeData":{"Offset":"(153.360779,209.639236)"},"ID":38,"Name":"Sequence","Instant":true,"AbortTypeabortType":"Both","Children":[{"Type":"Code.Scripts.Gameplay.BT.Task.BTBeginPatrol","NodeData":{"Offset":"(-115.262772,152.146027)"},"ID":39,"Name":"BT
Begin Patrol","Instant":true,"SharedBattleInfoSharedBattleInfo":{"Type":"Gameplay.BT.Variables.SharedBattleInfo","Name":"battleInfo","IsShared":true,"BattleInfomValue":{"UInt32ownerId":0,"UInt32theChosenOneId":0,"AITypeAIName":"BasicAI","AttachAITypeAttachAIName":"None","List`1PatrolInfos":[],"Int32PartolPointIndex":0,"List`1groupInfo":[],"BooleanAutoFight":true}}},{"Type":"Code.Scripts.Gameplay.BT.Task.BTWait","NodeData":{"Offset":"(4.930951,149.435211)"},"ID":40,"Name":"BT
Wait","Instant":true,"SharedBattleInfoSharedBattleInfo":{"Type":"Gameplay.BT.Variables.SharedBattleInfo","Name":"battleInfo","IsShared":true,"BattleInfomValue":{"UInt32ownerId":0,"UInt32theChosenOneId":0,"AITypeAIName":"BasicAI","AttachAITypeAttachAIName":"None","List`1PatrolInfos":[],"Int32PartolPointIndex":0,"List`1groupInfo":[],"BooleanAutoFight":true}}},{"Type":"BehaviorDesigner.Runtime.Tasks.Idle","NodeData":{"Offset":"(113.01944,153.541183)"},"ID":41,"Name":"Idle","Instant":true}]}]}]}]},{"Type":"BehaviorDesigner.Runtime.Tasks.Sequence","NodeData":{"Offset":"(1389.68774,164.145813)"},"ID":42,"Name":"Sequence","Instant":true,"AbortTypeabortType":"LowerPriority","Children":[{"Type":"Code.Scripts.Gameplay.BT.Conditional.BTOutflankAI","NodeData":{"Offset":"(-235.951584,205.394287)"},"ID":43,"Name":"BT
Outflank AI","Instant":true,"SharedBattleInfoSharedBattleInfo":{"Type":"Gameplay.BT.Variables.SharedBattleInfo","Name":"battleInfo","IsShared":true,"BattleInfomValue":{"UInt32ownerId":0,"UInt32theChosenOneId":0,"AITypeAIName":"BasicAI","AttachAITypeAttachAIName":"None","List`1PatrolInfos":[],"Int32PartolPointIndex":0,"List`1groupInfo":[],"BooleanAutoFight":true}}},{"Type":"BehaviorDesigner.Runtime.Tasks.Selector","NodeData":{"Offset":"(1.84604836,200)"},"ID":44,"Name":"Selector","Instant":true,"AbortTypeabortType":"None","Children":[{"Type":"BehaviorDesigner.Runtime.Tasks.Sequence","NodeData":{"Offset":"(-80,140)"},"ID":45,"Name":"Sequence","Instant":true,"AbortTypeabortType":"Both","Children":[{"Type":"Code.Scripts.Gameplay.BT.Conditional.BTWithinSight","NodeData":{"Offset":"(-177.201324,135.280273)"},"ID":46,"Name":"BT
Within Sight","Instant":true,"SharedBattleInfoSharedBattleInfo":{"Type":"Gameplay.BT.Variables.SharedBattleInfo","Name":"battleInfo","IsShared":true,"BattleInfomValue":{"UInt32ownerId":0,"UInt32theChosenOneId":0,"AITypeAIName":"BasicAI","AttachAITypeAttachAIName":"None","List`1PatrolInfos":[],"Int32PartolPointIndex":0,"List`1groupInfo":[],"BooleanAutoFight":true}}},{"Type":"BTMoveAroundTo","NodeData":{"Offset":"(-9.982029,146.914551)"},"ID":47,"Name":"BT
Move Around To","Instant":true,"SharedBattleInfoSharedBattleInfo":{"Type":"Gameplay.BT.Variables.SharedBattleInfo","Name":"battleInfo","IsShared":true,"BattleInfomValue":{"UInt32ownerId":0,"UInt32theChosenOneId":0,"AITypeAIName":"BasicAI","AttachAITypeAttachAIName":"None","List`1PatrolInfos":[],"Int32PartolPointIndex":0,"List`1groupInfo":[],"BooleanAutoFight":true}},"EMoveDirectionMoveDirection":"Clockwise"},{"Type":"BehaviorDesigner.Runtime.Tasks.Idle","NodeData":{"Offset":"(120.713676,150.000092)"},"ID":48,"Name":"Idle","Instant":true}]},{"Type":"BehaviorDesigner.Runtime.Tasks.Selector","NodeData":{"Offset":"(256.249664,170.000046)"},"ID":49,"Name":"Selector","Instant":true,"AbortTypeabortType":"None","Children":[{"Type":"Code.Scripts.Gameplay.BT.Task.BTMoveToBornPosition","NodeData":{"Offset":"(-140,360)"},"ID":50,"Name":"BT
Move To Born Position","Instant":true,"SharedBattleInfoSharedBattleInfo":{"Type":"Gameplay.BT.Variables.SharedBattleInfo","Name":"battleInfo","IsShared":true,"BattleInfomValue":{"UInt32ownerId":0,"UInt32theChosenOneId":0,"AITypeAIName":"BasicAI","AttachAITypeAttachAIName":"None","List`1PatrolInfos":[],"Int32PartolPointIndex":0,"List`1groupInfo":[],"BooleanAutoFight":true}}},{"Type":"BehaviorDesigner.Runtime.Tasks.Sequence","NodeData":{"Offset":"(150,210)"},"ID":51,"Name":"Sequence","Instant":true,"AbortTypeabortType":"Both","Children":[{"Type":"Code.Scripts.Gameplay.BT.Task.BTBeginPatrol","NodeData":{"Offset":"(-120,150)"},"ID":52,"Name":"BT
Begin Patrol","Instant":true,"SharedBattleInfoSharedBattleInfo":{"Type":"Gameplay.BT.Variables.SharedBattleInfo","Name":"battleInfo","IsShared":true,"BattleInfomValue":{"UInt32ownerId":0,"UInt32theChosenOneId":0,"AITypeAIName":"BasicAI","AttachAITypeAttachAIName":"None","List`1PatrolInfos":[],"Int32PartolPointIndex":0,"List`1groupInfo":[],"BooleanAutoFight":true}}},{"Type":"Code.Scripts.Gameplay.BT.Task.BTWait","NodeData":{"Offset":"(0,150)"},"ID":53,"Name":"BT
Wait","Instant":true,"SharedBattleInfoSharedBattleInfo":{"Type":"Gameplay.BT.Variables.SharedBattleInfo","Name":"battleInfo","IsShared":true,"BattleInfomValue":{"UInt32ownerId":0,"UInt32theChosenOneId":0,"AITypeAIName":"BasicAI","AttachAITypeAttachAIName":"None","List`1PatrolInfos":[],"Int32PartolPointIndex":0,"List`1groupInfo":[],"BooleanAutoFight":true}}},{"Type":"BehaviorDesigner.Runtime.Tasks.Idle","NodeData":{"Offset":"(110,150)"},"ID":54,"Name":"Idle","Instant":true}]}]}]}]}]}]},{"Type":"BehaviorDesigner.Runtime.Tasks.Idle","NodeData":{"Offset":"(178.075836,160.9367)"},"ID":55,"Name":"Idle","Instant":true}]},"Variables":[{"Type":"Gameplay.BT.Variables.SharedBattleInfo","Name":"battleInfo","IsShared":true,"BattleInfomValue":{"UInt32ownerId":0,"UInt32theChosenOneId":0,"AITypeAIName":"BasicAI","AttachAITypeAttachAIName":"None","List`1PatrolInfos":[],"Int32PartolPointIndex":0,"List`1groupInfo":[],"BooleanAutoFight":true}}]}'
fieldSerializationData:
typeName: []
fieldNameHash: