Пример #1
0
 /// <summary>
 /// 風エフェクトの制御
 /// </summary>
 /// <param name="mode">ゲームモード</param>
 /// <param name="activeFlag">風の有効状態</param>
 /// <param name="index">風の方位番号</param>
 private void WindEffectControl(PlayState.GameMode mode, bool activeFlag, int index)
 {
     if (activeFlag)
     {
         if (mode != PlayState.GameMode.Pause)
         {
             if (windEffect[index].isPlaying == false)
             {
                 windEffect[index].Play();
             }
         }
         else
         {
             if (windEffect[index].isPlaying)
             {
                 windEffect[index].Pause();
             }
         }
     }
     else
     {
         if (windEffect[index].isStopped == false)
         {
             windEffect[index].Stop();
         }
     }
 }
Пример #2
0
 void Start()
 {
     //初期化
     startCameraFlg = true;
     XZangle        = fAngle;
     CameraDis      = lookMode ? CameraDisP: CameraDisS;
     MouseCheck     = true;
     gameMode       = PlayState.playState.gameMode;
 }
Пример #3
0
    // Update is called once per frame
    void Update()
    {
        gameMode = GetGameMode();

        SetPlayerGameState();

        SetEnemyGameState();

        CheckEnemyState();

        // 落雷できるかチェック
        if (enemy != null)
        {
            IsCanLightningStrike = enemy.ElectricEnemies != null && enemy.ElectricEnemies.Count > 0;
        }
        else
        {
            IsCanLightningStrike = false;
        }

        GetLightningStrikePoint();

        CheckElectricDamage();
    }
Пример #4
0
    private void Update()
    {
        try
        {
            gameMode = PlayState.playState.gameMode;
        }
        catch
        {
            gameMode = PlayState.GameMode.Play;
        }

        if (waterHi != null)
        {
            // 足場が移動できる範囲を取得
            Ray        ray = new Ray(transform.position, Vector3.down);
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit, 200f, groundLayerMask))
            {
                minPosition = hit.point + Vector3.up * boxCollider.size.y * 0.5f;
            }
            else
            {
                minPosition = new Vector3(transform.position.x, boxCollider.size.y * 0.5f, transform.position.z);
            }

            waterPosition = new Vector3(transform.position.x, waterHi.max - (boxCollider.size.y * 0.5f - 0.06f), transform.position.z);

            ray = new Ray(transform.position, Vector3.up);
            if (Physics.Raycast(ray, out hit, 200f, groundLayerMask))
            {
                maxPosition = hit.point + Vector3.down * boxCollider.size.y * 0.5f;
            }
            else
            {
                maxPosition = new Vector3(transform.position.x, StageMake.LoadStageData.stageSize.y + boxCollider.size.y * 0.5f, transform.position.z);
            }

            isLock = gameMode == PlayState.GameMode.RotationPot;
            isFall = PlayState.playState.IsFallBox && isLock;


            if (isFall)
            {
                Vector3 target = minPosition.y > waterPosition.y ? minPosition : waterPosition;
                if (Vector3.Distance(transform.position, target) > 0.1f)
                {
                    if (gameMode != PlayState.GameMode.Pause)
                    {
                        transform.position = Vector3.MoveTowards(transform.position, target, 5.0f * Time.deltaTime);
                    }
                }
                else
                {
                    isFall             = false;
                    transform.position = target;
                }
            }
            else
            {
                if (isLock == false)
                {
                    if (minPosition.y + (boxCollider.size.y * 0.5f - 0.06f) > waterHi.max)
                    {
                        transform.position = minPosition;
                    }
                    else if (maxPosition.y + (boxCollider.size.y * 0.5f - 0.06f) < waterHi.max)
                    {
                        transform.position = maxPosition;
                    }
                    else
                    {
                        transform.position = new Vector3(transform.position.x, waterHi.max - (boxCollider.size.y * 0.5f - 0.06f), transform.position.z);
                    }
                }
            }
        }
        else
        {
            try
            {
                waterHi = Progress.progress.waterHi;
            }catch
            {
            }
        }

        isInWater = waterHi != null && transform.position.y < waterHi.max;
    }
Пример #5
0
    private void LateUpdate()
    {
        //カメラの移動可能なゲームモード&アメフラシの演出中ではない
        if ((PlayState.playState.gameMode == PlayState.GameMode.Play || PlayState.playState.gameMode == PlayState.GameMode.StartEf || PlayState.playState.gameMode == PlayState.GameMode.ClearFront) || rainPotChange)
        {
            //注視点変更アニメーション中
            if (lookAnimeTime > 0)
            {
                transform.position = Vector3.Lerp(animePos, (new Vector3(Mathf.Cos(XZangle * Mathf.Deg2Rad) * Mathf.Cos(Yangle * Mathf.Deg2Rad), Mathf.Sin(Yangle * Mathf.Deg2Rad) + newLookHi, Mathf.Sin(XZangle * Mathf.Deg2Rad) * Mathf.Cos(Yangle * Mathf.Deg2Rad)) * (!lookMode ? CameraDisS : CameraDisP)) + lookObj, 1 - (lookAnimeTime / changeTime));
            }
            else
            {
                //注視点がプレイヤー
                if (lookMode)
                {
                    //カメラがステージに埋まっているかどうかの処理
                    if (Physics.OverlapSphere((new Vector3(Mathf.Cos(XZangle * Mathf.Deg2Rad) * Mathf.Cos(Yangle * Mathf.Deg2Rad), Mathf.Sin(Yangle * Mathf.Deg2Rad) + newLookHi, Mathf.Sin(XZangle * Mathf.Deg2Rad) * Mathf.Cos(Yangle * Mathf.Deg2Rad)) * CameraDis) + lookObj, sphereCollider.radius, layerMask).Length == 0)
                    {
                        endCameraPos = CameraDis;
                    }
                    else
                    {
                        Ray        ray = new Ray(PlayerTransform.position + new Vector3(0, LookHiSet, 0), Vector3.Normalize(transform.position - (PlayerTransform.position + new Vector3(0, LookHiSet, 0))));
                        RaycastHit hit;
                        if (Physics.SphereCast(ray, sphereCollider.radius, out hit, CameraDis, layerMask) && CameraColFlg)
                        {
                            endCameraPos = Vector3.Distance(hit.point, PlayerTransform.position + new Vector3(0, LookHiSet, 0));
                        }
                        else
                        {
                            endCameraPos = CameraDis;
                        }
                    }
                }
                else
                {
                    endCameraPos = CameraDis;
                }

                //座標移動
                transform.position = (new Vector3(Mathf.Cos(XZangle * Mathf.Deg2Rad) * Mathf.Cos(Yangle * Mathf.Deg2Rad), Mathf.Sin(Yangle * Mathf.Deg2Rad) + newLookHi, Mathf.Sin(XZangle * Mathf.Deg2Rad) * Mathf.Cos(Yangle * Mathf.Deg2Rad)) * endCameraPos) + lookObj;
            }

            //角度変更
            transform.localEulerAngles = new Vector3(Yangle, -XZangle - 90, 0);
        }
        else if (GameEndFlg)
        {
            if (EndAfterTime < GameEndEfSpan)
            {
                transform.position = Vector3.Lerp(
                    transformToGameEnd,
                    (new Vector3(Mathf.Cos(XZangle * Mathf.Deg2Rad) * Mathf.Cos(Yangle * Mathf.Deg2Rad), Mathf.Sin(Yangle * Mathf.Deg2Rad) + newLookHi, Mathf.Sin(XZangle * Mathf.Deg2Rad) * Mathf.Cos(Yangle * Mathf.Deg2Rad)) * GameEndDis) + PlayerTransform.position + new Vector3(0, LookHiSet, 0),
                    (EndAfterTime / GameEndEfSpan)
                    );
                EndAfterTime += Time.deltaTime;
            }
        }



        //ゲームの終了を検知するシーケンサー
        if (gameMode != PlayState.playState.gameMode)
        {
            if (PlayState.playState.gameMode == PlayState.GameMode.GameOver || PlayState.playState.gameMode == PlayState.GameMode.Clear)
            {
                //ゲーム終了後の演出開始時の処理
                //
                if (PlayState.playState.gameMode == PlayState.GameMode.Clear)
                {
                    animator.SetBool("Set", true);
                }
                else
                {
                    GameEndFlg = true;
                }
                EndAfterTime       = 0;
                transformToGameEnd = transform.position;
                if (lookAnimeTime > 0)
                {
                    disToGameEnd = !lookMode ? CameraDisS : CameraDisP;
                }
                else
                {
                    disToGameEnd = endCameraPos;
                }
            }
            if (PlayState.playState.gameMode == PlayState.GameMode.Thunder)
            {
                kari   = false;
                lotDis = endCameraPos;
                lotPos = PlayerTransform.position;
                lotYAn = Yangle;
                //Debug.Log(lotPos);
                LightningStrikeAction = ChaMs.LightningStrikePoint.transform.position;
            }
            gameMode = PlayState.playState.gameMode;
        }
        if (PlayState.playState.gameMode == PlayState.GameMode.Thunder)
        {
            float   dis   = 0;
            float   Ttime = PlayState.playState.ThunderTime;
            int     brea;
            float   neoY = 0;
            Vector3 trg  = Vector3.zero;
            if (Ttime > 4f)
            {
                brea = 1;
            }
            else if (Ttime > 1f)
            {
                brea = 2;
            }
            else
            {
                brea = 3;
            }

            switch (brea)
            {
            case 1:
                trg  = Vector3.Lerp(lotPos, LightningStrikeAction, (5 - Ttime));
                dis  = Mathf.Lerp(lotDis, Tdis, (5 - Ttime));
                neoY = Mathf.Lerp(lotYAn, 30, (5 - Ttime));
                break;

            case 2:
                if (!kari)
                {
                    kari = true;
                    ChaMs.LightningStrikeAction();
                }
                trg  = Vector3.Lerp(lotPos, LightningStrikeAction, 1);
                dis  = Mathf.Lerp(lotDis, Tdis, 1);
                neoY = Mathf.Lerp(lotYAn, 30, 1);
                break;

            case 3:
                trg  = Vector3.Lerp(LightningStrikeAction, lotPos, (1 - Ttime));
                dis  = Mathf.Lerp(Tdis, lotDis, 1 - Ttime);
                neoY = Mathf.Lerp(30, lotYAn, (1 - Ttime));
                break;
            }

            //Debug.Log(neoY);
            transform.position = (
                new Vector3
                    (Mathf.Cos(XZangle * Mathf.Deg2Rad) * Mathf.Cos(neoY * Mathf.Deg2Rad),
                    Mathf.Sin(neoY * Mathf.Deg2Rad) + newLookHi,
                    Mathf.Sin(XZangle * Mathf.Deg2Rad) * Mathf.Cos(neoY * Mathf.Deg2Rad))
                * dis) + trg + new Vector3(0, LookHiSet, 0);
            transform.localEulerAngles = new Vector3(neoY, -XZangle - 90, 0);
        }
    }
Пример #6
0
    /// <summary>
    /// プレイヤーの移動処理
    /// </summary>
    private void PlayerMove(bool fixedUpdate)
    {
        if (connectPlayState)
        {
            mode = PlayState.playState.gameMode;
        }
        else
        {
            mode = PlayState.GameMode.Play;
        }

        if (mode == PlayState.GameMode.Play)
        {
            bool  input;
            float inputSpeed = (Mathf.Abs(inputX) + Mathf.Abs(inputZ)) * 0.5f < 0.5f ? Mathf.Abs(inputX) + Mathf.Abs(inputZ) : 1.0f;

            // 一方通行の崖を利用する際に実行
            if (CliffFlag)
            {
                foreach (var wall in hiddenWalls)
                {
                    wall.enabled = false;
                }
                input = false;
            }
            else
            {
                float delta = fixedUpdate ? Time.fixedDeltaTime : Time.deltaTime;

                // 移動方向
                Vector3 moveDirection = Vector3.zero;

                // 入力の最低許容値
                float inputMin = 0.1f;
                input = (Mathf.Abs(inputX) > inputMin || Mathf.Abs(inputZ) > inputMin) && dontInput == false;

                if (input)
                {
                    // カメラの向いている方向を取得
                    Vector3 cameraForward = Vector3.Scale(PlayerCamera.transform.forward == Vector3.up ? -PlayerCamera.transform.up : PlayerCamera.transform.forward == Vector3.down ? PlayerCamera.transform.up : PlayerCamera.transform.forward, new Vector3(1, 0, 1)).normalized;

                    // プレイヤーカメラ起点の入力方向
                    Vector3 direction = cameraForward * inputZ + PlayerCamera.transform.right * inputX;

                    // 入力方向を向く処理
                    Quaternion rot = Quaternion.LookRotation(direction, Vector3.up);
                    rot = Quaternion.Slerp(transform.rotation, rot, 7.5f * delta);
                    transform.rotation = rot;

                    // 移動方向の決定
                    float vec = Mathf.Abs(inputX) >= Mathf.Abs(inputZ) ? inputZ / inputX : inputX / inputZ;
                    vec           = 1.0f / Mathf.Sqrt(1.0f + vec * vec);
                    moveDirection = direction * vec;

                    // 床にRayを飛ばして斜面の角度を取得
                    Ray        ground = new Ray(new Vector3(transform.position.x, PlayerPositionY, transform.position.z), Vector3.down);
                    RaycastHit hit;
                    if (Physics.Raycast(ground, out hit, rayLength, layerMask))
                    {
                        var     nomal = hit.normal;
                        Vector3 dir   = moveDirection - Vector3.Dot(moveDirection, nomal) * nomal;
                        moveDirection = dir.normalized;
                    }

                    // プレイヤーの移動先の算出
                    float speed = inWater ? playerWaterSpeed : playerSpeed;
                    if (speedTime < maxSpeedTime)
                    {
                        speedTime += delta;
                    }
                    else
                    {
                        speedTime = maxSpeedTime;
                    }
                    moveDirection *= speed * delta * inputSpeed * curve.Evaluate(speedTime / maxSpeedTime);
                }
                else
                {
                    speedTime = 0;
                }

                // プレイヤーを移動させる
                moveDirection.y -= gravity * delta;
                character.Move(moveDirection);

                // プレイヤーのY座標の位置情報を更新
                PlayerPositionY = transform.position.y + character.center.y;

                // 透明な壁の設置
                if (input)
                {
                    SetHiddenWall();
                }

                // 水中フラグの設定
                if (StageWater != null)
                {
                    inWater    = PlayerPositionY < StageWater.max;
                    UnderWater = PlayerPositionY + character.height * 0.5f < StageWater.max;
                }
                else
                {
                    inWater    = false;
                    UnderWater = false;
                }

                // AnimationEventの設定
                if (animeEvent != null)
                {
                    animeEvent.WaterStep      = inWater;
                    animeEvent.PlayerPosition = transform.position;
                }
            }

            // アニメーション実行
            if (playerAnimator != null)
            {
                playerAnimator.enabled = true;
                playerAnimator.SetBool("wate", input);
                playerAnimator.SetFloat("speed", inWater ? (inputSpeed * curve.Evaluate(speedTime / maxSpeedTime)) / (playerSpeed / playerWaterSpeed) : inputSpeed * curve.Evaluate(speedTime / maxSpeedTime));
            }
        }
        else
        {
            // アニメーションの停止
            if (playerAnimator != null)
            {
                if (mode == PlayState.GameMode.StartEf || mode == PlayState.GameMode.Stop)
                {
                    playerAnimator.enabled = true;
                }
                else
                {
                    playerAnimator.enabled = false;
                }
            }
        }
    }
Пример #7
0
    /// <summary>
    /// 敵の移動処理
    /// </summary>
    /// <param name="fixedUpdate"></param>
    private void EnemyMove(bool fixedUpdate)
    {
        float delta = fixedUpdate ? Time.fixedDeltaTime : Time.deltaTime;

        if (connectPlayState)
        {
            mode = PlayState.playState.gameMode;
        }

        inWater = stageWater != null && transform.position.y + enemy.radius < stageWater.max;

        if (mode == PlayState.GameMode.Play && standby)
        {
            int nextLocation;
            if (finishOneLoop)
            {
                nextLocation = location - 1 < 0 ? moveType == EnemyMoveType.Lap ? moveSchedule.Length - 1 : location + 1 : location - 1;
            }
            else
            {
                nextLocation = location + 1 >= moveSchedule.Length ? moveType == EnemyMoveType.Lap ? 0 : location - 1 : location + 1;
            }
            Vector3 nextPos = moveSchedule[nextLocation];
            Vector3 forward = (nextPos - transform.position).normalized;

            // プレイヤーと接触しているかをチェック
            RaycastHit hit;
            if (Physics.BoxCast(new Vector3(transform.position.x, transform.position.y - enemy.radius * enemySize, transform.position.z), new Vector3(enemy.radius * enemySize * 1.25f, enemy.radius * enemySize, enemy.radius * enemySize * 1.25f), Vector3.up, out hit, Quaternion.Euler(Vector3.zero), 1.0f, playerLayer))
            {
                // プレイヤーと接触している場合はプレイヤーの方向を向く処理を実行
                if (player == null)
                {
                    player = hit.transform.gameObject.GetComponent <PlayerType2>();
                }
                player.HitEnemy(RotateAnimation(transform.gameObject, (new Vector3(hit.transform.position.x, 0, hit.transform.position.z) - new Vector3(transform.position.x, 0, transform.position.z)).normalized, rotatePower * delta * 2.5f, false));
            }
            else
            {
                switch (step)
                {
                case 0:
                    transform.position = moveSchedule[location];
                    if (Vector3.Distance(transform.position, moveSchedule[nextLocation]) < 0.1f)
                    {
                        step = -5;
                    }
                    stepEnd = true;
                    break;

                case 1:
                    stepEnd = Wait(time, lateTime);
                    time   += delta;
                    break;

                case 2:
                    stepEnd = RotateAnimation(transform.gameObject, forward, rotatePower * delta, false);
                    break;

                case 3:
                    stepEnd = Wait(time, lateTime);
                    time   += delta;
                    break;

                case 4:
                    if (transform.rotation == Quaternion.LookRotation(forward))
                    {
                        float vec = Mathf.Abs(forward.x) >= Mathf.Abs(forward.z) ? forward.z / forward.x : forward.x / forward.z;
                        vec = 1.0f / Mathf.Sqrt(1.0f + vec * vec);
                        float speed = inWater ? enemyWaterSpeed : enemySpeed;
                        transform.position += forward * speed * delta * vec;
                        if (Vector3.Distance(transform.position, nextPos) < 0.1f)
                        {
                            stepEnd = true;
                        }
                    }
                    else
                    {
                        step = 2;
                    }
                    break;

                default:
                    step = 0;
                    if (finishOneLoop)
                    {
                        location--;
                        if (moveType == EnemyMoveType.Lap)
                        {
                            if (location < 0)
                            {
                                location = moveSchedule.Length - 1;
                            }
                        }
                        else
                        {
                            if (location < 1)
                            {
                                finishOneLoop = false;
                            }
                        }
                    }
                    else
                    {
                        location++;
                        if (moveType == EnemyMoveType.Lap)
                        {
                            if (location >= moveSchedule.Length)
                            {
                                location = 0;
                            }
                        }
                        else
                        {
                            if (location >= moveSchedule.Length - 1)
                            {
                                finishOneLoop = true;
                            }
                        }
                    }
                    return;
                }

                if (stepEnd)
                {
                    stepEnd = false;
                    step++;
                    time = 0;
                }
            }

            // 足音の再生
            if (enemyAnime != null)
            {
                enemyAnime.enabled = true;
                animationTime     += delta;
                if (animationTime >= animationSpeed)
                {
                    animationTime = 0;
                    SoundManager.soundManager.PlaySe3D("EnemyMove", transform.position, 0.5f);
                }
            }
        }
        else
        {
            // アニメーションの停止
            if (enemyAnime != null)
            {
                if (mode == PlayState.GameMode.StartEf || mode == PlayState.GameMode.Stop)
                {
                    enemyAnime.enabled = true;
                }
                else
                {
                    enemyAnime.enabled = false;
                }
            }
        }
    }
Пример #8
0
    /// <summary>
    /// 風を出す処理
    /// </summary>
    private void ShotWind()
    {
        try
        {
            gameMode = PlayState.playState.gameMode;
        }
        catch
        {
            gameMode = PlayState.GameMode.Play;
        }

        // このオブジェクトが水中に存在するかをチェック
        float waterPos;

        try
        {
            waterPos = Progress.progress.waterHi.max;
        }
        catch
        {
            waterPos = 0;
        }

        bool inWater = waterPos > transform.position.y;

        if (gameMode == PlayState.GameMode.Play)
        {
            upHeight   = 0;
            downHeight = 0;

            if (inWater == false)
            {
                // 対象オブジェクトに風が当たったかをチェック
                if (forward)
                {
                    CreateWind(transform.forward, 0);
                }

                if (back)
                {
                    CreateWind(-transform.forward, 1);
                }

                if (right)
                {
                    CreateWind(transform.right, 2);
                }

                if (left)
                {
                    CreateWind(-transform.right, 3);
                }
            }

            if ((upHeight > 0 || downHeight > 0) && inWater == false)
            {
                float   center      = (upHeight - downHeight) * 0.5f;
                float   totalHeight = upHeight + downHeight + 1;
                Vector3 localUp     = transform.InverseTransformDirection(Vector3.up).normalized;

                Vector3 boxSize   = new Vector3(Mathf.Abs(localUp.x) < 1 ? 1 : totalHeight, Mathf.Abs(localUp.y) < 1 ? 1 : totalHeight, Mathf.Abs(localUp.z) < 1 ? 1 : totalHeight);
                Vector3 boxCenter = new Vector3(Mathf.Abs(localUp.x) < 1 ? 0 : localUp.x * center, Mathf.Abs(localUp.y) < 1 ? 0 : localUp.y * center, Mathf.Abs(localUp.z) < 1 ? 0 : localUp.z * center);

                boxCollider.center = boxCenter;
                boxCollider.size   = boxSize;
            }
            else
            {
                boxCollider.center = Vector3.zero;
                boxCollider.size   = Vector3.one;
            }
        }
        WindEffectControl(gameMode, forward && inWater == false, 0);
        WindEffectControl(gameMode, back && inWater == false, 1);
        WindEffectControl(gameMode, right && inWater == false, 2);
        WindEffectControl(gameMode, left && inWater == false, 3);
    }
Пример #9
0
    /// <summary>
    /// プレイヤーの移動処理
    /// </summary>
    private void PlayerMove(bool fixedUpdate)
    {
        bool isAccess;

        try
        {
            mode     = PlayState.playState.gameMode;
            isAccess = true;
        }
        catch
        {
            isAccess = false;
        }

        if (isAccess)
        {
            mode = PlayState.playState.gameMode;
        }

        // カメラの向いている方向を取得
        Vector3 cameraForward = Vector3.Scale(PlayerCamera.transform.forward == Vector3.up ? -PlayerCamera.transform.up : PlayerCamera.transform.forward == Vector3.down ? PlayerCamera.transform.up : PlayerCamera.transform.forward, new Vector3(1, 0, 1)).normalized;

        // カメラから見た入力方向を取得
        Vector3 direction = cameraForward * inputZ + PlayerCamera.transform.right * inputX;

        float delta = fixedUpdate ? Time.fixedDeltaTime : Time.deltaTime;

        if (mode != PlayState.GameMode.Pause)
        {
            bool  input;
            float inputSpeed = Mathf.Sqrt((inputX * inputX) + (inputZ * inputZ));

            // NavMeshの更新
            if (mode == PlayState.GameMode.Rain)
            {
                navMeshFlag = true;
                specialMove = true;
                playerAgent.updatePosition = false;
                playerRigid.isKinematic    = false;
            }
            else
            {
                // ナビメッシュの更新をかける
                if (navMeshFlag)
                {
                    navMeshFlag = false;
                    UpdateNavMesh();
                }

                // アメフラシ起動またはジャンプの動作が終了したら座標を更新する
                if (specialMove && CliffFlag == false)
                {
                    specialMove = false;
                    playerAgent.Warp(transform.position);
                    playerAgent.updatePosition = true;
                    playerRigid.isKinematic    = true;
                }
            }

            // 一方通行の崖を利用する際に実行
            if (CliffFlag)
            {
                specialMove = true;
                playerAgent.updatePosition = false;
                input = false;
            }
            else
            {
                // 移動方向
                Vector3 moveDirection = Vector3.zero;

                // 入力の最低許容値
                float inputMin = 0.1f;
                input = (Mathf.Abs(inputX) > inputMin || Mathf.Abs(inputZ) > inputMin) && mode == PlayState.GameMode.Play && dontInput == false;

                if (input)
                {
                    // 入力方向を向く処理
                    Quaternion rot = Quaternion.LookRotation(direction, Vector3.up);
                    rot = Quaternion.Slerp(transform.rotation, rot, 7.5f * delta);
                    transform.rotation = rot;

                    // 水中かどうかをチェックし、加速度グラフに基づいた移動速度を計算
                    float speed = inWater ? playerWaterSpeed : playerSpeed;
                    if (speedTime < maxSpeedTime)
                    {
                        speedTime += delta;
                    }
                    else
                    {
                        speedTime = maxSpeedTime;
                    }

                    // 地面にRayを飛ばす
                    Ray   ground    = new Ray(new Vector3(transform.position.x, transform.position.y + playerCollider.center.y, transform.position.z), Vector3.down);
                    float hitNomalY = 1.0f;
                    if (Physics.Raycast(ground, out RaycastHit hit, rayLength, groundLayer))
                    {
                        // 地面の傾斜を取得
                        hitNomalY = hit.normal.y;
                    }

                    // 斜め入力時の移動量を修正
                    moveDirection = direction.normalized;

                    // 坂を移動する際の傾斜を考慮した移動量に修正
                    if (hitNomalY != 1.0f)
                    {
                        var     nomal = hit.normal;
                        Vector3 dir   = moveDirection - Vector3.Dot(moveDirection, nomal) * nomal;
                        moveDirection = dir.normalized;
                    }

                    // 移動量にスピード値を乗算
                    moveDirection *= speed * inputSpeed * curve.Evaluate(speedTime / maxSpeedTime);
                }
                else
                {
                    speedTime = 0;
                }

                // プレイヤーを移動させる
                if (playerNav != null && playerAgent.updatePosition)
                {
                    playerAgent.Move(moveDirection * delta);
                }

                // 水中フラグの設定
                if (StageWater != null)
                {
                    inWater    = (transform.position.y + playerCollider.center.y) - (playerCollider.height * 0.25f) < StageWater.max;
                    UnderWater = transform.position.y + playerCollider.center.y + playerCollider.height * 0.25f < StageWater.max;
                }
                else
                {
                    inWater    = false;
                    UnderWater = false;
                }

                // AnimationEventの設定
                if (animeEvent != null)
                {
                    if (UnderWater)
                    {
                        animeEvent.PlayerStepMode = StepMode.UnderWater;
                    }
                    else if (inWater)
                    {
                        animeEvent.PlayerStepMode = StepMode.InWater;
                    }
                    else
                    {
                        animeEvent.PlayerStepMode = StepMode.Nomal;
                    }
                    animeEvent.PlayerPosition = transform.position;
                }
            }

            // アニメーション実行
            if (playerAnimator != null)
            {
                playerAnimator.enabled = true;
                if (umbrellaAnimator != null)
                {
                    umbrellaAnimator.enabled = true;
                }

                // 走るアニメーション
                playerAnimator.SetBool("Run", input);
                playerAnimator.SetFloat("Speed", inWater ? (inputSpeed * curve.Evaluate(speedTime / maxSpeedTime)) / (playerSpeed / playerWaterSpeed) : inputSpeed * curve.Evaluate(speedTime / maxSpeedTime));

                // アメフラシを起動するアニメーション
                playerAnimator.SetBool("Switch", mode == PlayState.GameMode.Rain);

                // 崖から降りるアニメーション
                playerAnimator.SetBool("Jump", CliffFlag);

                // ゲームオーバー時のアニメーション
                playerAnimator.SetBool("GameOver", mode == PlayState.GameMode.GameOver);

                // クリア時のアニメーションを再生
                if (mode == PlayState.GameMode.Clear)
                {
                    if (RotateAnimation(transform.gameObject, cameraForward * -1, 360 * delta, true))
                    {
                        playerAnimator.SetBool("Run", false);
                        playerAnimator.SetBool("StageClear", true);
                    }
                }
            }
        }
        else
        {
            // アニメーションの停止
            if (playerAnimator != null)
            {
                // ポーズ中のみアニメーションを停止
                playerAnimator.enabled = false;
                if (umbrellaAnimator != null)
                {
                    umbrellaAnimator.enabled = false;
                }
            }
        }
    }