LoginSignup
0
1

プレイヤーを追従するカメラの実装

Last updated at Posted at 2024-01-18

プレイヤーが移動するとカメラも一緒についてくる処理を実装します。実行環境はUnity 2022.3.10fです。

プレイヤーの操作

まずはプレイヤーを操作できるようにします。操作方法は矢印キーで移動、スペースキーでジャンプ、Zキーを押しながら矢印キーでダッシュとします。操作するためのオブジェクトを用意して以下のスクリプトをアタッチしてください。

PlayerController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[RequireComponent(typeof(CharacterController))]
public class PlayerController : MonoBehaviour
{
    public float moveSpeed; //普段の移動速度
    public float dashSpeed; //ダッシュ時の移動速度
    public float jumpPower; //ジャンプ力
    private CharacterController controller;
    private Vector3 moveVelocity;

    void Start()
    {
        controller = GetComponent<CharacterController>(); //CharacterControllerを取得
    }

    void Update()
    {
        if (Input.GetKey(KeyCode.Z)) //Zキーが押されている場合
        {
            moveVelocity.x = Input.GetAxis("Horizontal") * dashSpeed; //横軸の入力を取得
            moveVelocity.z = Input.GetAxis("Vertical") * dashSpeed; //縦軸の入力を取得
        }
        else
        {
            moveVelocity.x = Input.GetAxis("Horizontal") * moveSpeed; //横軸の入力を取得
            moveVelocity.z = Input.GetAxis("Vertical") * moveSpeed; //縦軸の入力を取得
        }

        transform.LookAt(this.transform.position + new Vector3(moveVelocity.x, 0, moveVelocity.z));

        if (controller.isGrounded) //オブジェクトが地面にいる場合
        {
            if (Input.GetKeyDown(KeyCode.Space)) //スペースキー入力すると
            {
                moveVelocity.y = jumpPower; //Y軸正の方向に移動
            }
        }
        else
        {
            moveVelocity.y += Physics.gravity.y * Time.deltaTime; //重力によるY軸負の方向への移動
        }

        controller.Move(moveVelocity * Time.deltaTime); //オブジェクトを動かす
    }
}

アタッチしたらInspectorビューからMove Speed、Dash Speed、Jump Powerにそれぞれ値を入れます。自分の環境で試した場合、Move Speedは3、Dash Speedは8、Jump Powerは3くらいがいい感じでした。これでキャラクターを操作できるようになりました。プレイヤーが動き回るための簡易的なステージも作っておきましょう。Hierarchyから3D Object→Planeで簡単に作れます。

追従するカメラ

次にカメラがキャラクターについてくるようにします。以下のスクリプトを作成してMain Cameraにアタッチします。

CameraFollow.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraFollow : MonoBehaviour
{
    private Vector3 diff; //カメラとプレイヤーの距離
    private GameObject target; //追従するターゲットオブジェクト
    public float followSpeed; //追従するスピード

    void Start()
    {
        target = GameObject.Find("Player"); //名前がPlayerのオブジェクトを取得してターゲットに指定
        diff = target.transform.position - this.transform.position; //カメラとプレイヤーの初期の距離を指定
    }

    void LateUpdate()
    {
        transform.position = Vector3.Lerp(this.transform.position, target.transform.position - diff, Time.deltaTime * followSpeed); //線形補間関数によるカメラの移動
    }
}

アタッチしたらプレイヤー用のオブジェクトの名前を「Player」に設定しておきます。また、InspectorビューからFollow Speedに値を設定します。自分の環境では5に設定しました。Sceneビューを見ながらキャラクターが見やすいようにカメラの位置を調整します。この時のカメラとプレイヤーの距離を保ちながらカメラはプレイヤーを追いかけます。
LateUpdate関数の中でVector3.Lerpが使われていますが、これにより距離が離れているほど速く近づき、近いほどゆっくり近づく動きが実現でき、カメラが滑らかに移動します。実行するとプレイヤーがダッシュした時も、プレイヤーの動きに合わせてカメラが付いてくることが確認できます。

参考

https://gihyo.jp/book/2023/978-4-297-13741-0
https://www.socym.co.jp/book/1315
https://docs.unity3d.com/ja/560/ScriptReference/Vector3.Lerp.html

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1