/// <summary> /// [AllocateFunction] /// 新たに実行関数クラスを割り当てる /// </summary> public void AllocateFunction() { //old保存, 初期化 BaseAIFunction oldSave = nowFunction; nowFunction = null; //検索ループ foreach (AITable table in m_aiTables) { //実行条件を満たしている if (table.isPossibleUpdate) { //確率を基に実行関数設定 nowFunction = table.SelectionFunction(); //成功すれば終了側Callback呼び出し, フラグ初期化 if (nowFunction != null) { m_oldFunction = oldSave; m_oldFunction?.AIEnd(nowFunction, false); m_isBeginCallBackCompleted = false; //Beginをまだ呼び出していない break; } } } //念の為null check, nullなら戻す if (nowFunction == null) { #if UNITY_EDITOR Debug.LogError("Error!! AIAgent->AllocateFunction not found function"); #endif nowFunction = oldSave; } }
public override void AIBegin(BaseAIFunction beforeFunction, bool isParallel) { RaycastHit raycastHit; Vector3 targetPosition = Vector3.zero; Vector3 position = transform.position; if (Physics.Raycast(position, m_kamikazeCommand.direction, out raycastHit, m_cRaycastDistance, m_stageLayer)) { targetPosition = raycastHit.point; } else { targetPosition = position + m_kamikazeCommand.direction * m_cRaycastDistance; } if (Physics.Raycast(targetPosition + m_cRaycastUp - m_kamikazeCommand.direction, Vector3.down, out raycastHit, m_cRaycastDistance, m_stageLayer)) { targetPosition = raycastHit.point + Vector3.up; } else { targetPosition += Vector3.down * m_cRaycastDistance; } m_isEnabledNavMesh = navMeshAgent.SetDestination(targetPosition); if (m_isEnabledNavMesh) { SetUpdatePosition(true, false); } }
/// <summary> /// [ParallelSettingFunction] /// 関数クラスを割り込み設定する /// 割り込み設定したクラスは通常実行クラスと並列実行される /// 引数1: 割り込ませる関数 /// 引数2: 単一動作にさせるか否か. trueにすると実行中のものは終了する /// falseにすると別の関数がSingle実行中の場合割り当てられない, default = false /// </summary> public void ParallelSettingFunction(BaseAIFunction settingFunction, bool isSingleAction = false) { //シングル動作中でフラグがシングル動作でない場合は終了 if (m_isParallelSingleActoin & !isSingleAction) { return; } //シングル動作ならリストクリア if (isSingleAction) { foreach (var e in m_parallelFunctions) { e.AIEnd(nowFunction, true); } m_parallelFunctions.Clear(); } //リストに関数クラス追加 m_parallelFunctions.Add(settingFunction); //タイマースタート settingFunction.timer.Start(); //割り込み側のCallback呼び出し settingFunction.AIBegin(nowFunction, true); //シングル動作か否かを保存 m_isParallelSingleActoin = isSingleAction; }
/// <summary> /// [AIEnd] /// 関数が実行登録を解除される際に呼ばれるコールバック関数 /// 引数1: 通常実行→次回実行する関数, 割り込み実行の場合→現在の通常実行関数, 存在しない場合null /// 引数2: 並列関数として実行? /// </summary> public override void AIEnd(BaseAIFunction nextFunction, bool isParallel) { //見つかっていれば移動停止 if (m_target != null) { SetUpdatePosition(false); } }
/// <summary> /// [AIBegin] /// 関数初回実行時に呼ばれるコールバック関数 /// 引数1: 通常実行→終了する関数, 割り込み実行の場合→現在の通常実行関数, 存在しない場合null /// 引数2: 並列関数として実行? /// </summary> public override void AIBegin(BaseAIFunction beforeFunction, bool isParallel) { //視界判定をとる m_visibility.IsHitVisibility(); m_target = m_visibility.lookTarget; //見つかっていれば目標地点を設定 if (m_target != null) { SetUpdatePosition(true); navMeshAgent.destination = m_target.position; } }
/// <summary> /// [FindFunction] /// return: tableNameの要素があり, その中にfunctionNameの要素があればBaseAIFunction, なければnull /// </summary> public BaseAIFunction FindFunction(string tableName, string functionName) { foreach (AITable table in m_aiTables) { if (table.tableName == tableName) { BaseAIFunction result = table.FindFunction(functionName); if (result != null) { return(result); } } } return(null); }
/// <summary> /// [ForceSpecifyFunction] /// 強制的に実行中の関数クラス停止させ、指定したものを実行させる /// 引数1: 実行させるfunction /// </summary> public void ForceSpecifyFunction(BaseAIFunction function) { //無効? if (function == null) { return; } //old保存, 初期化 m_oldFunction = nowFunction; nowFunction = function; //Beginをまだ呼び出していない m_isBeginCallBackCompleted = false; //End Callback m_oldFunction?.AIEnd(nowFunction, false); }
/// <summary> /// [ForceSpecifyFunction] /// 強制的に実行中の関数クラス停止させ、指定したものを実行させる /// 引数1: 実行させるfunction /// </summary> public void ForceSpecifyFunction(BaseAIFunction function) { //無効? if (function == null) { return; } //old保存, 初期化 m_oldFunction = nowFunction; nowFunction = function; //Beginをまだ呼び出していない m_isBeginCallBackCompleted = false; //End Callback m_oldFunction?.AIEnd(nowFunction); //debug only, 関数表示用文字列初期化 #if UNITY_EDITOR m_dNowTable = function.tableName; m_dNowFunction = function.functionName; if (function.aiTable != null) { if (function.aiTable.condition != null) { m_dNowTableCondition = function.aiTable.condition.dConditionName; } else if (function.aiTable.isConditionAlwaysTrueSelf) { m_dNowTableCondition = "Always true"; } else if (function.aiTable.isConditionAlwaysFalseSelf) { m_dNowTableCondition = "Always false"; } else { m_dNowTableCondition = "Not condition"; } } else { m_dNowTableCondition = "Not condition"; } #endif }
/// <summary> /// [AIBegin] /// 関数初回実行時に呼ばれるコールバック関数 /// 引数1: 通常実行→終了する関数, 割り込み実行の場合→現在の通常実行関数, 存在しない場合null /// 引数2: 並列関数として実行? /// </summary> public override void AIBegin(BaseAIFunction beforeFunction, bool isParallel) { m_markTarget = m_thisGoingFunction.markTarget; if (m_markTarget == null) { return; } var message = m_markTarget.GetComponent <MarkingMessage>(); if (message == null) { return; } m_markingObjectInfo = new MarkPointInfo(m_markTarget, message, transform, m_markingRotation); }
/// <summary>[constructor]</summary> TableElement(BaseAIFunction function, float probability) { this.function = function; this.probability = probability; }
/// <summary>[constructor]</summary> TableElement(BaseAIFunction function, string dFunctionName, float probability) { this.function = function; this.probability = probability; this.dFunctionName = dFunctionName; }
/// <summary> /// [AIBegin] /// 関数初回実行時に呼ばれるコールバック関数 /// 引数1: 通常実行→終了する関数, 割り込み実行の場合→現在の通常実行関数, 存在しない場合null /// 引数2: 並列関数として実行? /// </summary> public abstract void AIBegin(BaseAIFunction beforeFunction, bool isParallel);
/// <summary> /// [AIEnd] /// 関数が実行登録を解除される際に呼ばれるコールバック関数 /// 引数1: 通常実行→次回実行する関数, 割り込み実行の場合→現在の通常実行関数, 存在しない場合null /// 引数2: 並列関数として実行? /// </summary> public abstract void AIEnd(BaseAIFunction nextFunction, bool isParallel);
/// <summary> /// [AIBegin] /// 関数初回実行時に呼ばれるコールバック関数 /// 引数1: 通常実行→終了する関数, 割り込み実行の場合→現在の通常実行関数, 存在しない場合null /// </summary> public abstract void AIBegin(BaseAIFunction beforeFunction);
/// <summary> /// [AIEnd] /// 関数が実行登録を解除される際に呼ばれるコールバック関数 /// 引数1: 通常実行→次回実行する関数, 割り込み実行の場合→現在の通常実行関数, 存在しない場合null /// 引数2: 並列関数として実行? /// </summary> public override void AIEnd(BaseAIFunction nextFunction, bool isParallel) { m_markTarget = null; m_markingObjectInfo = null; }
public override void AIEnd(BaseAIFunction nextFunction, bool isParallel) { }
/// <summary> /// [AIEnd] /// 関数が実行登録を解除される際に呼ばれるコールバック関数 /// 引数1: 通常実行→次回実行する関数, 割り込み実行の場合→現在の通常実行関数, 存在しない場合null /// </summary> public abstract void AIEnd(BaseAIFunction nextFunction);
//Startみたいなもん public override void AIBegin(AIComponent.BaseAIFunction beforeFunction, bool isParallel) { }
//Startみたいなもん public override void AIBegin(AIComponent.BaseAIFunction beforeFunction, bool isParallel) { //navMeshAgent.destination が目標地点 navMeshAgent.destination = m_target.position; }
/// <summary> /// [AllocateFunction] /// 新たに実行関数クラスを割り当てる /// </summary> public void AllocateFunction() { //old保存, 初期化 BaseAIFunction oldSave = nowFunction; nowFunction = null; //検索ループ foreach (AITable table in m_aiTables) { //実行条件を満たしている if (table.isPossibleUpdate) { //確率を基に実行関数設定 nowFunction = table.SelectionFunction(); //Errorチェック #if UNITY_EDITOR if (nowFunction == null) { Debug.LogError("Error!! AIAgent->FixedUpdate now function == null"); nowFunction = oldSave; return; } #endif //成功すれば終了側Callback呼び出し, フラグ初期化 if (nowFunction != null) { //debug only, 関数表示用文字列初期化 #if UNITY_EDITOR m_dNowTable = table.tableName; m_dNowFunction = nowFunction.functionName; if (table.condition != null) { m_dNowTableCondition = table.condition.dConditionName; } else if (table.isConditionAlwaysTrueSelf) { m_dNowTableCondition = "Always true"; } else if (table.isConditionAlwaysFalseSelf) { m_dNowTableCondition = "Always false"; } else { m_dNowTableCondition = "Not condition"; } #endif m_oldFunction = oldSave; m_oldFunction?.AIEnd(nowFunction); m_isBeginCallBackCompleted = false; //Beginをまだ呼び出していない break; } } } //念の為null check, nullなら戻す if (nowFunction == null) { #if UNITY_EDITOR Debug.LogError("Error!! AIAgent->AllocateFunction not found function"); #endif nowFunction = oldSave; } }
public override void AIBegin(BaseAIFunction beforeFunction, bool isParallel) { SetUpdatePosition(true); }
//OnDisableみたいなもん public override void AIEnd(AIComponent.BaseAIFunction nextFunction, bool isParallel) { }