예제 #1
0
        /// <summary>
        /// [AIUpdate]
        /// Updateフレームに呼ばれるコールバック関数, EndAIFunctionを呼び出す場合引数1が必要
        /// 引数1: 更新識別子
        /// </summary>
        public override void AIUpdate(UpdateIdentifier updateIdentifier)
        {
            if (m_target == null)
            {
#if UNITY_EDITOR
                Debug.LogError("Error!! GoingMarkingPoint->AIUpdate, target == null");
#endif
                EndAIFunction(updateIdentifier);
            }

            if (timer.elapasedTime > m_timeoutSeconds)
            {
                EndAIFunction(updateIdentifier);
            }

            //マーキング実行範囲に入ったか判定する
            var collisions = Physics.OverlapSphere(transform.position, m_overlapRadius, m_overlapLayerMask);

            if (collisions.Length == 0)
            {
                return;
            }

            //該当しているか検索ループ
            foreach (var e in collisions)
            {
                Transform         useTransform      = e.gameObject.transform;
                ProvideMainObject provideMainObject = useTransform.GetComponent <ProvideMainObject>();

                if ((provideMainObject != null &&
                     m_target.GetInstanceID() == provideMainObject.mainObject.GetInstanceID()) ||
                    provideMainObject == null &&
                    m_target.GetInstanceID() == useTransform.GetInstanceID())
                {
                    aiAgent.ForceSpecifyFunction(m_function);
                }
            }
        }
예제 #2
0
        /// <summary>
        /// [IsHitVisibility]
        /// ターゲットが視界にいるか判定する
        /// return: 視界にいると判定した場合true
        /// 引数1: 現在フレーム判定済みでも強制的に行うか
        /// </summary>
        public bool IsHitVisibility(bool isForced = false)
        {
            //既に現在フレーム判定済みならそのまま返す
            if (m_isNowFrameCompleted & !isForced)
            {
                return(m_isResult);
            }

            //フラグ初期化
            m_isResult            = true;
            m_isNowFrameCompleted = true;
            //debug only
#if UNITY_EDITOR
            //ヒットフラグ初期化
            m_dIsHit          = false;
            m_dLoseSightTimer = m_loseSightTimer.elapasedTime;
#endif

            //呼び出しコスト削減
            Vector3 position = transform.position;
            Vector3 raycastCenter, overlapCenter;

            //Center計算
            CalculateCenters(position, out raycastCenter, out overlapCenter);

            //overlap
            var collisions = Physics.OverlapSphere(overlapCenter, m_overlapRadius, m_layerMask);
            //not hit -> return false
            if (collisions.Length == 0)
            {
                m_lookObject = null;
                return(m_isResult = false);
            }

            //使用オブジェクト取得
            GameObject useCollisionObject = SearchUseCollisionObject(collisions);
            Vector3    targetPosition;

            //追跡してたら追跡オブジェクトにしちゃうんだな
            if (m_lookObject != null)
            {
                useCollisionObject = m_lookObject;
                targetPosition     = m_provideMainObject != null ?
                                     m_provideMainObject.mainObject.transform.position : useCollisionObject.transform.position;
            }
            //そうじゃなかったら基準点を探す
            else
            {
                ProvideMainObject provideMainObject = useCollisionObject.GetComponent <ProvideMainObject>();
                targetPosition = provideMainObject != null ?
                                 provideMainObject.mainObject.transform.position : useCollisionObject.transform.position;

                //ここでしか登録できないしとりあえずここで登録しておく
                m_provideMainObject = provideMainObject;
            }

            //自分へのターゲットから方向ベクトル
            Vector3 raycastDirection = (targetPosition - raycastCenter).normalized;

            //高さが設定以上離れている or 距離が設定以上離れている->result = false
            if (Mathf.Abs(position.y - targetPosition.y) > m_heightLimit ||
                (targetPosition - position).sqrMagnitude > distanceVisibility * distanceVisibility)
            {
                m_isResult = false;
            }

            //同位置?
            if (m_isResult && raycastDirection.sqrMagnitude < Mathf.Epsilon)
            {
                //とりあえずHit用にRaycast
                Physics.Raycast(raycastCenter, raycastDirection, out m_raycastHit, m_distance, m_layerMask);

                //debug only
#if UNITY_EDITOR
                //ヒットフラグ = true
                m_dIsHit = true;
#endif
                //見失ってるTimerStart, どちらかというと見つかったらリセットしているて方が近い
                m_loseSightTimer.Start();
                //Look object 登録
                if (m_lookObject == null)
                {
                    m_lookObject = useCollisionObject;
                }
                //フラグ = true
                return(m_isResult = true);
            }

            //Dotで視界角度内にいるか判定, 居ない->result = false
            if (m_isResult && Vector3.Dot(transform.forward, raycastDirection) < m_angleToCosine)
            {
                m_isResult = false;
            }

            //Raycast, ヒットしない->result = false
            if (m_isResult && !Physics.Raycast(raycastCenter, raycastDirection, out m_raycastHit, m_distance, m_layerMask))
            {
                m_isResult = false;
            }

            //Raycastにヒットした物体がTargetの場合ヒットしたとする->result = false
            //この時点で見つけたかが確定する
            if (m_isResult &&
                m_raycastHit.transform.gameObject.layer != useCollisionObject.gameObject.layer)
            {
                m_isResult = false;
            }

            //見つけてたら見失ってるTimerStart
            //どちらかというと見つけたらリセットしているて方が近い
            if (m_isResult)
            {
                m_loseSightTimer.Start();
            }

            //Hit or 前フレーム見つけていたら距離 & 時間判定をとる -> 許容範囲内
            if (m_isResult || (m_isOldFound &&
                               (targetPosition - position).sqrMagnitude < m_loseSightDistance * m_loseSightDistance &&
                               m_loseSightTimer.elapasedTime <= m_timeoutInLoseSight))
            {
                //debug only
#if UNITY_EDITOR
                //ヒットフラグ = true
                m_dIsHit = true;
#endif
                //Look object 登録
                if (m_lookObject == null)
                {
                    m_lookObject = useCollisionObject;
                }
                //フラグ = true
                return(m_isResult = true);
            }
            //見つからんかった
            else
            {
                m_lookObject = null;
                return(m_isResult = false);
            }
        }