예제 #1
0
        /// <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;
            }
        }
예제 #2
0
        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);
            }
        }
예제 #3
0
        /// <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;
        }
예제 #4
0
 /// <summary>
 /// [AIEnd]
 /// 関数が実行登録を解除される際に呼ばれるコールバック関数
 /// 引数1: 通常実行→次回実行する関数, 割り込み実行の場合→現在の通常実行関数, 存在しない場合null
 /// 引数2: 並列関数として実行?
 /// </summary>
 public override void AIEnd(BaseAIFunction nextFunction, bool isParallel)
 {
     //見つかっていれば移動停止
     if (m_target != null)
     {
         SetUpdatePosition(false);
     }
 }
예제 #5
0
        /// <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;
            }
        }
예제 #6
0
 /// <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);
 }
예제 #7
0
        /// <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);
        }
예제 #8
0
        /// <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
        }
예제 #9
0
        /// <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);
        }
예제 #10
0
 /// <summary>[constructor]</summary>
 TableElement(BaseAIFunction function, float probability)
 {
     this.function    = function;
     this.probability = probability;
 }
예제 #11
0
 /// <summary>[constructor]</summary>
 TableElement(BaseAIFunction function, string dFunctionName, float probability)
 {
     this.function      = function;
     this.probability   = probability;
     this.dFunctionName = dFunctionName;
 }
예제 #12
0
 /// <summary>
 /// [AIBegin]
 /// 関数初回実行時に呼ばれるコールバック関数
 /// 引数1: 通常実行→終了する関数, 割り込み実行の場合→現在の通常実行関数, 存在しない場合null
 /// 引数2: 並列関数として実行?
 /// </summary>
 public abstract void AIBegin(BaseAIFunction beforeFunction, bool isParallel);
예제 #13
0
 /// <summary>
 /// [AIEnd]
 /// 関数が実行登録を解除される際に呼ばれるコールバック関数
 /// 引数1: 通常実行→次回実行する関数, 割り込み実行の場合→現在の通常実行関数, 存在しない場合null
 /// 引数2: 並列関数として実行?
 /// </summary>
 public abstract void AIEnd(BaseAIFunction nextFunction, bool isParallel);
예제 #14
0
 /// <summary>
 /// [AIBegin]
 /// 関数初回実行時に呼ばれるコールバック関数
 /// 引数1: 通常実行→終了する関数, 割り込み実行の場合→現在の通常実行関数, 存在しない場合null
 /// </summary>
 public abstract void AIBegin(BaseAIFunction beforeFunction);
예제 #15
0
 /// <summary>
 /// [AIEnd]
 /// 関数が実行登録を解除される際に呼ばれるコールバック関数
 /// 引数1: 通常実行→次回実行する関数, 割り込み実行の場合→現在の通常実行関数, 存在しない場合null
 /// 引数2: 並列関数として実行?
 /// </summary>
 public override void AIEnd(BaseAIFunction nextFunction, bool isParallel)
 {
     m_markTarget        = null;
     m_markingObjectInfo = null;
 }
예제 #16
0
 public override void AIEnd(BaseAIFunction nextFunction, bool isParallel)
 {
 }
예제 #17
0
 /// <summary>
 /// [AIEnd]
 /// 関数が実行登録を解除される際に呼ばれるコールバック関数
 /// 引数1: 通常実行→次回実行する関数, 割り込み実行の場合→現在の通常実行関数, 存在しない場合null
 /// </summary>
 public abstract void AIEnd(BaseAIFunction nextFunction);
예제 #18
0
 //Startみたいなもん
 public override void AIBegin(AIComponent.BaseAIFunction beforeFunction, bool isParallel)
 {
 }
예제 #19
0
 //Startみたいなもん
 public override void AIBegin(AIComponent.BaseAIFunction beforeFunction, bool isParallel)
 {
     //navMeshAgent.destination が目標地点
     navMeshAgent.destination = m_target.position;
 }
예제 #20
0
        /// <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;
            }
        }
예제 #21
0
 public override void AIBegin(BaseAIFunction beforeFunction, bool isParallel)
 {
     SetUpdatePosition(true);
 }
예제 #22
0
 //OnDisableみたいなもん
 public override void AIEnd(AIComponent.BaseAIFunction nextFunction, bool isParallel)
 {
 }