示例#1
0
        /// <summary>
        /// プレイヤーを発見した時の処理
        /// プレイヤーを可能な限り追います
        /// </summary>
        /// <exception cref="Exception">プレイヤーが設定されていない時</exception>
        private void foundFunc()
        {
            //プレイヤーが発見されていない時の例外
            if (stateMan.Player == null)
            {
                throw new Exception("this enemy hasn't found player yet.");
            }

            if (!nav.pathPending)
            {
                //プレイヤー方向にレイを飛ばす
                var ray = new Ray(transform.position + new Vector3(0, 1, 0),
                                  stateMan.Player.transform.position - transform.position);
                RaycastHit hit;

                //プレイヤーを見つけたかどうか
                bool foundPlayer = false;

                //プレイヤーを発見できた方向に向かう
                if (Physics.Raycast(ray, out hit, searchRange))
                {
                    if (hit.collider.CompareTag("Player"))
                    {
                        //プレイヤーが視界内にいるなら武器射程までで止まる
                        nav.stoppingDistance = equipMan.getWeaponRange(searchNear);
                        //目標地点を決定
                        nav.destination = stateMan.Player.transform.position;
                        foundPlayer     = true;
                    }

                    //攻撃中でないなら
                    if (stateMan.State != EnemyState.ATTACKING)
                    {
                        //射程内に入った時点で攻撃中にステート変更
                        if (nav.remainingDistance <= equipMan.getWeaponRange(searchNear))
                        {
                            stateMan.State = EnemyState.ATTACKING;
                        }
                    }
                    else
                    {
                        //攻撃中なら、射程外に行くと攻撃中ステートを解除
                        if (nav.remainingDistance >= equipMan.getWeaponRange(searchNear))
                        {
                            stateMan.State = EnemyState.FOUND;
                        }
                    }
                }

                //プレイヤーが見つからなかったら
                if (!foundPlayer)
                {
                    if (nav.remainingDistance >= 0.15f)
                    {
                        if (nav.stoppingDistance >= equipMan.getWeaponRange(searchNear))
                        {
                            //まだ最後に見かけた地点まで到達しておらず、stopDistanceが再設定されていなかったら0.15fまで
                            //射程を踏み越えて見かけた地点まで行く
                            nav.stoppingDistance = searchNear;
                        }
                    }
                    else
                    {
                        //万策尽きたら見失う
                        stateMan.State = EnemyState.FINDING;
                    }
                }
            }
        }