/// <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); } } }
/// <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); } }