FPC07 – 頭を揺らして動きをつける(Head bob)

今回はゲームには影響しませんが、効果的な頭を揺らす演出を追加してみましょう。

目次

今回作るもの

Head bobはいわゆる頭の揺れです。歩いたり走ったりすると視界が揺れると思いますが、それを作ろうと思います。あるだけで結構印象が変わるので、ゲームにあった揺れ具合で一層するのをおすすめします

完成図・適応未適応の違い

今回は適応したときとの違いを並べました。パラメータを少し控えめにしているので歩いているときは影響が少し少なく感じますが、走っているときはちゃんと揺れてますね

学べること

上下の動きは単振動(サインカーブ)を使ったり、後々の足音を鳴らすためのイベントを仕込んだりしています。イベントに関しては未使用なので実装しなくても問題ありません。

  • 上下方向の単振動(Sin)
  • 足音を鳴らすときに利用できるイベントの実装

実装開始!

スクリプト:FPHeadbob

今回のスクリプトでは、今後のことを見越して足音を鳴らすためのイベントも仕込んでいます。利用するのはFootstepの回までお待ち下さい。揺れに関してはカメラのTransformを移動させます。サインカーブをつかって単振動をするように上下に移動させることで頭の揺れを再現します。

  • swingSpeed:頭の揺れるスピード
  • swingAmount:頭の揺れる移動量
using UnityEngine;
using UnityEngine.Events;

[RequireComponent(typeof(FPMovement))]
public class FPHeadbob : FPComponentBase
{
    public float swingSpeed = 100f;
    public float swingAmount = 0.025f;
    private float degree = 0.0f;

    private FPMovement movement;
    private Transform cameraTransform;

    public UnityEvent OnFootStep = new UnityEvent();

    private void Awake()
    {
        movement = GetComponent<FPMovement>();
    }

    public override void initialize()
    {
        base.initialize();
        cameraTransform = Controller.PlayerCamera.transform;
    }

    public void Update()
    {
        if (!Controller.CharacterController.isGrounded)
        {
            return;
        }

        float velocityMagnitude = Vector3.Magnitude(new Vector3(movement.Velocity.x, 0f, movement.Velocity.z)); ;
        float movementRate = velocityMagnitude / movement.MovementSpeed;

        if (0.1f < velocityMagnitude)
        {
            float currentDegree = Mathf.Repeat(degree + Time.deltaTime * velocityMagnitude * swingSpeed * movementRate, 360.0f);
            float currentRadian = currentDegree * Mathf.Deg2Rad;

            if (degree < 270f && 270f <= currentDegree)
            {
                OnFootStep.Invoke();
            }
            degree = currentDegree;

            cameraTransform.localPosition = new Vector3(
                cameraTransform.localPosition.x,
                Mathf.Sin(currentRadian) * swingAmount * movementRate,
                cameraTransform.localPosition.z);
        }
    }
}

動作確認

実際に動かしてみます!歩きのときは少し影響薄いので微妙ですが、走ったときはかなり違いを感じれると思います。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次