Unityを使ったゲーム開発記録

Unityのゲーム開発などを中心に投稿していきます。何か参考になる様な記事ではなく自分用の備忘録になる為、生暖かい目で見て下さい。

Unityでのゲーム開発 〜エイムカメラの設定〜

エイムカメラの設定

前回はキャラクターとカメラのスクリプトを作りました。(´-`).。oO
そんなに大した事やってないのに分からない事を調べる時間のが長い、、、

まあそんな訳で今回は簡単な設定をして見ようと思います。

TPSを触った事ある方はわかるかもしれませんが、武器を構えるとカメラが近くになり操作キャラが端によったりしますよね?今回はそれです٩( ᐛ )و


まず必要なのはメインカメラ(前回作成した"ThirdPersonCamera")の他のカメラを用意します。
"Hierarchy"で右クリックを押して"Camera"をクリックすれば作成可能です。名前は分かりやすく"AimCamera"とします。
f:id:mochisakucoco:20210301140045p:plain



AimCameraのTransformは下記の様に設定しました。
f:id:mochisakucoco:20210301141228p:plain

⇩⇩⇩⇩⇩実際のゲーム画面はコチラ⇩⇩⇩⇩⇩⇩

f:id:mochisakucoco:20210301141337g:plain


"AimCamera"はPlayerに追従する様に動かしたいのでPlayerの階層に紐づけて親子関係にします。
f:id:mochisakucoco:20210301143439g:plain



Playerスクリプトの変更

カメラの切り替えにはPlayerの操作で切り替わる事になる為、"Player"スクリプトに変更を加えます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{

    [SerializeField] private GameObject aimCamera;  //エイムカメラを紐づける
    [SerializeField] private GameObject thirdPersonCamera;  //第三者視点カメラを紐づける
    private float Horizontal;
    private float Vertical;
    Rigidbody rb;
    public float moveSpeed = 5f;  //移動速度を1秒間で何フレーム動かすのかの設定

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void Update()
    {
        Horizontal = Input.GetAxisRaw("Horizontal");
        Vertical = Input.GetAxisRaw("Vertical");

        if (Input.GetKeyDown(KeyCode.B))  //対応したキーを押されたら内部のプログラムが呼び出される
            {
                aimCamera.SetActive(!aimCamera.activeInHierarchy);
                thirdPersonCamera.SetActive(!thirdPersonCamera.activeInHierarchy);
            }
    }

    void FixedUpdate()
    {
        // カメラの方向から、X-Z平面の単位ベクトルを取得
        Vector3 cameraForward = Vector3.Scale(thirdPersonCamera.transform.forward, new Vector3(1, 0, 1)).normalized;

        // 方向キーの入力値とカメラの向きから、移動方向を決定
        Vector3 moveForward = cameraForward * Vertical + thirdPersonCamera.transform.right * Horizontal;

        // 移動方向にスピードを掛ける。ジャンプや落下がある場合は、別途Y軸方向の速度ベクトルを足す。
        rb.velocity = moveForward * moveSpeed + new Vector3(0, rb.velocity.y, 0);

        // キャラクターの向きを進行方向にする(キャラクターの向きの設定は"ThirdPeasonCamera"が有効の場合のみ)
        if (moveForward != Vector3.zero && thirdPersonCamera.activeInHierarchy)
        {
            transform.rotation = Quaternion.LookRotation(moveForward);
        }
    }
} 

上記の内容を少し深堀していきます。




スクリプト変更部分

[SerializeField] private GameObject aimCamera;  //エイムカメラを紐づける
[SerializeField] private GameObject thirdPersonCamera;  //第三者視点カメラを紐づける

UnityのInspectorで編集可能にする為にフィールド宣言をしています。
上記の内容が正常に動作していれば"Inspector"ないの"Player"のスクリプトが変わっていると思います。
f:id:mochisakucoco:20210303004133p:plain



if (Input.GetKeyDown(KeyCode.B))  //対応したキーを押されたら内部のプログラムが呼び出される
     {
        aimCamera.SetActive(!aimCamera.activeInHierarchy);
        thirdPersonCamera.SetActive(!thirdPersonCamera.activeInHierarchy);
     }

void Update()の部分に追記した内容は[B]キーが押された時にHierarchy上にあるAimCameraとThirdPersonCameraのアクティブ状態を反転(on・off)させる内容となっています。

下記の様にプロジェクト上ではオブジェクトの名前の横のチェックボックスで簡単に切り替えられます。
しかしゲームプレイ中に編集画面が表示されている訳ではないので、プログラムを組み切り替え出来る様にしている状態です。


*重要)カメラを2つともアクティブ状態にしてしまうと同時にoffになってしまうのでゲーム開始時には下記の様な方法で"AimCamera"のチェックボックスは外しておいて下さい。

f:id:mochisakucoco:20210303011217g:plain



void FixedUpdate()
     {
        // カメラの方向から、X-Z平面の単位ベクトルを取得
        Vector3 cameraForward = Vector3.Scale(thirdPersonCamera.transform.forward, new Vector3(1, 0, 1)).normalized;

        // 方向キーの入力値とカメラの向きから、移動方向を決定
        Vector3 moveForward = cameraForward * Vertical + thirdPersonCamera.transform.right * Horizontal;

void FixedUpdate()の部分の"Camera.main"⇨"thirdPersonCamera"へ変更します。

  ⇩⇩⇩変更前⇩⇩⇩

  • Vector3 cameraForward = Vector3.Scale(Camera.main.transform.forward, new Vector3(1, 0, 1)).normalized;
  • Vector3 moveForward = cameraForward * Vertical + Camera.main.transform.right * Horizontal;

 

// キャラクターの向きを進行方向にする(キャラクターの向きの設定は"ThirdPeasonCamera"が有効の場合のみ)
if (moveForward != Vector3.zero && thirdPersonCamera.activeInHierarchy)
     {
        transform.rotation = Quaternion.LookRotation(moveForward);
     }

if (moveForward != Vector3.zero)の部分に"&& thirdPersonCamera.activeInHierarchy"を追記
三者視点カメラの時にキャラクターが向いている方向の時に進む処理に変更。


スクリプト設定後の細かい調整

カメラの優先度設定

f:id:mochisakucoco:20210304003311p:plain
今回の設定ではActive状態をoffで始めているのであまり意味あはりませんが、カメラ深度についての説明になります
Depthはカメラの優先順位とおもって頂ければ大丈夫です。大きい値を持つカメラが、小さい値のカメラの手前に描画されます。
試しに"AimCamera"と"ThirdPersonCamera"のActive状態を両方とも有効にして、この数値を片方の数値より高くすると映されるカメラが切り替わると思います。
その他のリファレンスはこちら⇩
カメラ - Unity マニュアル


Playerスクリプトへカメラを反映

f:id:mochisakucoco:20210304022004g:plain



ゲーム画面の確認

上記の設定が正常に動作している場合は⇩の様になっている筈です。
f:id:mochisakucoco:20210304034021g:plain

今回はここまでで٩( ᐛ )و



Unity用語

[SerializeField]・・・シリアル化は、データ構造やオブジェクトの状態を Unity が保存して後で再構成できる形式に変換する自動プロセスです。 Unityのビルトイン機能の中には、シリアル化を使用するものがあります。保存とロード、インスペクターウィンドウ、インスタンス化、プレハブなどの機能が含まれます。


activeInHierarchy・・・シーン中のGameObjectが有効かどうかを取得できるプロパティGameObject.activeInHierarchyの他にもGameObject.activeSelf があります。


&&・・・条件演算子C#意外でも使われるプログラミング用語「&&」はAND(かつ)。「||」はOR(または)の意味となります。





⇩⇩⇩⇩⇩⇩前回の記事はこちら⇩⇩⇩⇩⇩
mochisakucoco.hatenablog.com