一人称コントローラーを作るうえで、最も基本になるスクリプトを作成します。先述した通り、今回のコントローラーは複数のコンポーネントを組み合わせて動くようにします。ベースになるスクリプトと、機能をなすスクリプト!ここではカメラの視点移動を行うことが出来るところまで作成する予定です。
今回作成するもの
完成動画
今回の制作では以下のようなものが作成出来ます。動くことは出来ませんが、周りを見るだけの機能が実装されます。ゲーム性次第では動かない一人称のゲームも出来そうなので、アイデア次第ではここからゲームも作れそうですね。
今回使う内容など
変わった内容としては、マウスカーソルが非表示になったりインスペクターをちょっとおしゃれにしたりする処理が学べます
- カーソルの非表示化
- インスペクターで入力できる数字に制限を設けることが出来る
- 特定のオブジェクトの角度を変更する処理
FirstPresonControllerとCharacterController
スクリプト作成:FirstPersonController
まずは基本となるスクリプトを作成。キャラクターコントローラーやカメラ自体はまだ使いませんが、一蓮托生のクラスとなりますので追加します。
using UnityEngine;
[RequireComponent(typeof(CharacterController))]
public class FirstPersonController : MonoBehaviour
{
private CharacterController characterController;
public CharacterController CharacterController => characterController;
private Camera playerCamera;
public Camera PlayerCamera => playerCamera;
private void Awake()
{
characterController = GetComponent<CharacterController>();
playerCamera = GetComponentInChildren<Camera>();
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
}
}
CharacterControllerのパラメータ調整
先程のクラスの中にあったCharacterControllerとは、Unity標準のコンポーネントになります。RequireComponentを使うことで、同インスペクターに存在することを強要出来ます。自分でコンポーネントを追加しなくても、必要なものが追加されます。以下手順に沿って、コンポーネントの設定を行ってみてください。
- FirstPersonControllerをアタッチ
- 前回作成したPlayerゲームオブジェクトに追加
- この時CharacterControllerというコンポーネントも同時に追加されることを確認してください
- CharacterControllerのパラメータを以下の様にセット
- Slope Limit:30
- Step Offset:0.3
- Center:0 , 1 , 0
- Radius:0.5
- Height:2
- (Slop Limit以外はデフォルトです。動かすうえでは変更)
画面確認
エディタ上でゲームを動かして、動作確認を行います。と言っても変化は少ないです。
再生して、ゲームビューをクリックするとマウスが非表示状態になると思います。あとはマウスを動かしても特に変化なし!現在の状態はこれでOK!(下図はCharacterControllerのCenterがズレた状態になっています)
マウスカーソルが非表示になった場合、エスケープキーを押すことでマウスカーソルが再表示されます
周りを見回す機能追加
一人称のゲームで最も基本的な操作である視点の移動を実装してみたいと思います。機能を持ったコンポーネントを追加して、必要に応じてコントローラー側から初期化処理を行います。
FPCameraLook
まずは見回すだけのスクリプトを作成します。注意点としては初期化処理のInitializeメソッドでFirstPersonControllerを引数に渡す必要があります。
using UnityEngine;
public class FPCameraLook : MonoBehaviour
{
private FirstPersonController controller;
private Transform cameraRoot;
[Header("Look")]
[SerializeField, Range(1, 10)] private float lookSpeed = 2.0f;
[SerializeField, Range(1, 100)] private float upperLookLimit = 50.0f;
[SerializeField, Range(1, 100)] private float lowerLookLimit = 50.0f;
public void Initialize(FirstPersonController controller)
{
this.controller = controller;
cameraRoot = controller.PlayerCamera.transform.parent;
}
private void Update()
{
Vector2 delta = new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y"));
Vector3 euler = transform.eulerAngles;
euler.y += delta.x * lookSpeed;
transform.eulerAngles = euler;
float cameraEulerX = cameraRoot.localEulerAngles.x;
cameraEulerX -= delta.y * lookSpeed;
cameraEulerX = 180 < cameraEulerX ? cameraEulerX - 360 : cameraEulerX;
cameraEulerX = Mathf.Clamp(cameraEulerX, -upperLookLimit, lowerLookLimit);
cameraRoot.localRotation = Quaternion.Euler(cameraEulerX, 0, 0);
}
}
- lookSpeed:カメラの感度調整
- upperLookLimit:カメラの見上げられる上限
- lowerLookLimit:カメラの見下ろせる加減
FirstPersonControllerへの組み込み
基本ポリシーとして、各コンポーネントは自身からFirstPersonControllerを探して初期化を行ったりしないようにします。あくまでFirstPersonControllerが主導して実装を行います。
using UnityEngine;
[RequireComponent(typeof(CharacterController))]
public class FirstPersonController : MonoBehaviour
{
private CharacterController characterController;
public CharacterController CharacterController => characterController;
private Camera playerCamera;
public Camera PlayerCamera => playerCamera;
private void Awake()
{
characterController = GetComponent<CharacterController>();
playerCamera = GetComponentInChildren<Camera>();
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
FPCameraLook cameraLook = playerCamera.GetComponent<FPCameraLook>();
cameraLook?.Initialize(this);
}
}
動作確認
ゲームを動かすと、マウスの移動に応じてカメラの角度が変わってくれると思います。
FPCameraLookのコンポーネントのパラメータを調整して、角度の制限や移動スピードが変わることを確認してみてくださいッ!
コメント