/// <summary> /// どういう行動をするか攻撃、移動AIクラスから思考し、決定する。 /// </summary> public async UniTask ThinkAIProcess(Utility.Async.WorkTimeAwaiter timeAwaiter) { // 自分が状態異常で行動できない場合はスキップ // 第一優先として、自分が「特技」「攻撃」ができるか。 // 特技の思考 await ThinkActionStartAsync(); // 特技が使える場合はその処理に進む if (_model.ActionThinkCore.Result != null) { return; } // 攻撃 await _model.AttackAI.ExecuteAsync(this, timeAwaiter); if (_model.AttackAI.CanActable) { return; } // それができない場合、「移動」をする。 await _model.MoveAI.ExecuteAsync(this, timeAwaiter); }
public virtual async UniTask ExecuteAsync(Chara.ICharaController unit, Utility.Async.WorkTimeAwaiter timeAwaiter) { _unit = unit; _tileDataMap = null; _roomData = null; await ExexuteInternalAsync(timeAwaiter); }
public override void PhaseStart() { _argment = Argument as Arg; _timeAwaiter = new Utility.Async.WorkTimeAwaiter(); _timeAwaiter.Setup(0.1f); ThinkAIProcessesAsync().Forget(); }
private List <Chara.ICharaController> _targets = new List <Chara.ICharaController>(); // ターゲット #endregion #region プロパティ #endregion #region コンストラクタ, デストラクタ #endregion #region public, protected 関数 protected override async UniTask ExexuteInternalAsync(Utility.Async.WorkTimeAwaiter timeAwaiter) { // 自分の8方向のマスにターゲットが存在するか // なければもう何もしない if (TryGetAttackTargetPosition(_masterAIData.FirstTarget, out var targetPos)) { // 目的地を取得したターゲットに更新する(部屋から逃げたときに追跡できるように) _unit.Model.MoveAI.SetDestination(targetPos); SetAttackProcess(targetPos); CanActable = true; } }
protected virtual UniTask ExexuteInternalAsync(Utility.Async.WorkTimeAwaiter timeAwaiter) => default(UniTask);