現場レベルのゲーム制作が、すべてここで学べます。
この記事は、Unityを使った「8番出口」ライクなホラー風脱出ゲームの作り方をわかりやすく解説していくシリーズの第2回です。
前回は、アセットのインポートやTextMeshProの日本語対応設定、そして画面中央に照準(クロスヘア)を表示する方法を学びました。
前回の記事:

今回は、プレイヤーの操作を実装していきます。
Unityの最新のInput Systemを活用した前進・後退・左右移動、視点移動といった基本的な操作に加えて、足音の再生処理など、ホラーゲームらしい“臨場感”を演出する要素も取り入れていきましょう。
ゲームオブジェクトの作成
プレイヤーのテスト環境を作成
まずは、プレイヤーの動作をテストするための**床(平面)**を作成しましょう。
Hierarchyウィンドウで右クリックし、
「3D Object → Plane(平面)」を選択します。
作成された平面は、プレイヤーが立つステージ(床)として機能します。

作成した Plane の大きさを調整して、テストしやすい広さの床にしておきましょう。
インスペクターで Transform コンポーネントを以下のように設定します。
-
位置(Position):X = 0, Y = 0, Z = 0
-
回転(Rotation):X = 0, Y = 0, Z = 0
-
スケール(Scale):X = 10, Y = 10, Z = 10
この設定で、床が10倍の大きさに拡張され、プレイヤーが自由に動き回れるスペースが確保されます。
テスト用のステージとしては十分な広さなので、プレイヤーの移動動作を確認するのに最適です。

プレイヤーのゲームオブジェクトを作成
続いて、プレイヤー本体のオブジェクトを作成しましょう。
Hierarchyウィンドウで右クリックし、
「Create Empty(空のオブジェクトを作成)」を選択します。
作成したオブジェクトの名前を 「Player」 に変更してください。
このオブジェクトが、今後プレイヤーの移動・視点操作などを担当する中心となります。

次に、作成した Player オブジェクトの設定を行いましょう。
まず、Tag(タグ) を「Player」に変更します。
この設定をしておくことで、スクリプトからプレイヤーを簡単に識別できるようになります。
続いて、Transform の値を以下のように変更してください。
-
位置(Position):X = 0, Y = 0, Z = 0
-
回転(Rotation):X = 0, Y = 0, Z = 0
-
スケール(Scale):X = 0.5, Y = 0.75, Z = 0.5
この数値に設定すると、プレイヤーの大きさがほどよく調整され、
後で追加する「キャラクターコントローラー」にも自然にフィットします。

次に、Main Camera をプレイヤーに追従させるため、
Player オブジェクトの子オブジェクトに設定します。
Hierarchyウィンドウで Main Camera を選択し、
そのままドラッグして Player の上にドロップしましょう。
すると、Main Camera が Player の子オブジェクトになり、
プレイヤーの移動に合わせてカメラも一緒に動くようになります。

続いて、Main Camera の設定を行いましょう。
まず、Transform を以下のように変更します。
-
位置(Position):X = 0, Y = 0.5, Z = 0
-
回転(Rotation):X = 0, Y = 0, Z = 0
-
スケール(Scale):X = 2, Y = 1, Z = 2
この設定により、カメラがプレイヤーの目線の少し上(Y=0.5)に配置され、
実際に歩いているような視点でゲーム内を見渡せるようになります。
次に、Cameraコンポーネントの設定を以下のように調整しましょう。
-
Field of View(有効視野):75
-
Clipping Planes > Near(クリップ面):0.05
FOV(Field of View)は視野の広さを表す値で、
この設定ではやや広めの視野となり、ホラーゲーム特有の“奥行きのある空間”を感じやすくなります。
Near(ニア)を 0.05 に設定することで、
壁やオブジェクトに接近した際の“カメラのめり込み”を軽減できます。

これで、プレイヤーのゲームオブジェクトの作成は完了です。
次のステップでは、このプレイヤーに移動処理を実装していきましょう。
プレイヤーを動かすスクリプトを作成する
プレイヤーの移動と視点操作、そして足音を実現するためのスクリプトを新規作成し、
先ほど用意した Player オブジェクトにアタッチしていきます。
このスクリプトでは、
WASDキーによる移動やマウス操作での視点回転、さらに移動速度に応じた足音の再生など、
プレイヤー操作の基本となる機能をまとめて実装します。
スクリプトを作成する
まず、Projectウィンドウの Assets フォルダ内で右クリックし、
「Create → Folder(作成 → フォルダ)」を選択して、空のフォルダを作成します。
フォルダ名は 「script」 にしておきましょう。
この中に、ゲームを制御する C#スクリプト を作成していきます。

作成した 「script」 フォルダを開き、
その中で右クリック → 「Create → MonoBehaviour Script(C# スクリプト)」を選択します。
スクリプトの名前を 「PlayerCTRL」 に変更しましょう。
このスクリプトの中に、プレイヤーの移動・視点操作・足音などの処理を記述していきます。

プレイヤーを W・A・S・D キーで移動できるようにする
ここからは、キーボード操作でプレイヤーを動かす処理を実装していきます。
W で前進、S で後退、A と D で左右移動できるようにしていきましょう。
まず、先ほど作成した 「PlayerCTRL」 スクリプトをダブルクリックして開きましょう。
すると、Visual Studio(または既定のコードエディタ) が起動し、
次のような基本構造のプログラムが表示されると思います。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
using UnityEngine; public class PlayerCTRL : MonoBehaviour { // Start is called once before the first execution of Update after the MonoBehaviour is created void Start() { } // Update is called once per frame void Update() { } } |
では、こちらのスクリプトを以下のように変更しましょう。
マーカー部分を参考に、不要な箇所を削除して新しいコードに書き換えてください。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
using UnityEngine; using UnityEngine.InputSystem; // CharacterController コンポーネントが必須であることを示す属性 [RequireComponent(typeof(CharacterController))] public class PlayerCTRL : MonoBehaviour { private CharacterController controller; // プレイヤーの物理的な移動を扱うコンポーネント [Header("Input Actions (InputActionReference)")] [Tooltip("移動入力(Vector2)。Input Actions の Move を割り当てる")] public InputActionReference moveAction; [Tooltip("ダッシュ入力(Button)。Input Actions の Sprint を割り当てる")] public InputActionReference dashAction; [Header("移動設定")] [Tooltip("歩行速度(m/s)")] public float walkSpeed = 3.5f; [Tooltip("ダッシュ倍率(1.8なら歩行の1.8倍)")] public float dashMultiplier = 1.8f; [Tooltip("重力(マイナス値が下向き)")] public float gravity = -18f; // プレイヤーの上下方向の速度を記録(重力用) private Vector3 velocity; void Awake() { // 起動時に CharacterController を取得しておく controller = GetComponent<CharacterController>(); } void OnEnable() { // スクリプトが有効になったときに入力を受け付ける moveAction?.action.Enable(); dashAction?.action.Enable(); } void OnDisable() { // スクリプトが無効になったときに入力を停止する moveAction?.action.Disable(); dashAction?.action.Disable(); } void Start() { } void Update() { // 毎フレームごとに移動処理を実行 Move(); } void Move() { Vector2 mv = Vector2.zero; // Input System から移動入力を取得(x=左右、y=前後) if (moveAction != null) mv = moveAction.action.ReadValue<Vector2>(); // プレイヤーの現在の向きを基準に前方向・右方向を取得 Vector3 forward = transform.forward; Vector3 right = transform.right; // 入力に応じて移動方向を算出(正規化して斜め移動でも速度一定に) Vector3 moveDir = (forward * mv.y + right * mv.x).normalized; // ダッシュボタンが押されている間はスピードを倍率分アップ bool isDashing = dashAction != null && dashAction.action.IsPressed(); float speed = walkSpeed * (isDashing ? dashMultiplier : 1f); // 水平方向の移動ベクトル Vector3 horizontal = moveDir * speed; // 地面に接している場合は落下速度をリセット(ふわ浮きを防ぐ) if (controller.isGrounded && velocity.y < 0f) { velocity.y = -2f; } // 毎フレーム重力を加算 velocity.y += gravity * Time.deltaTime; // 実際に動かす量(水平移動+重力)を合成 Vector3 motion = horizontal + velocity; // CharacterController を使って物理的に移動させる controller.Move(motion * Time.deltaTime); } } |
スクリプトの解説
このスクリプトは、UnityのCharacterControllerを使って
「歩く」「走る(ダッシュ)」「重力で落下する」動きを実現するためのプレイヤー制御です。
Rigidbody を使わず、プログラム側で移動ベクトルと重力を直接管理しているのが特徴。
また、新Input Systemを使って入力を処理しています。
using宣言
|
1 2 |
using UnityEngine; using UnityEngine.InputSystem; |
UnityEngineは基本。
InputSystemは「新しい入力管理(Input Actions)」を使うために必要。
旧システム(Input.GetAxisなど)とは別物です。
[RequireComponent(typeof(CharacterController))]
|
1 |
[RequireComponent(typeof(CharacterController))] |
この属性を付けておくと、
このスクリプトをアタッチしたとき自動的にCharacterControllerが追加されるようになります。
初心者がよくやる「コンポーネント付け忘れ」の防止策です。
変数宣言部
Update()
|
1 2 3 4 |
void Update() { Move(); } |
1フレームごとに Move() 関数を呼び出します。
この中で移動や重力処理が行われます。
Updateは毎フレーム呼ばれるので、
「常に入力を監視して、必要に応じて動かす」仕組みになっています。
Move() — メイン処理
ここがプレイヤーの移動・ダッシュ・重力処理の中心です。
入力を取得
|
1 2 3 |
Vector2 mv = Vector2.zero; if (moveAction != null) mv = moveAction.action.ReadValue<Vector2>(); |
mv.x が左右(A/Dキー)、mv.y が前後(W/Sキー)を表します。
最初に Vector2.zero(= (0,0))で初期化しているのは、
入力が無い時に値が残って誤動作しないようにするためです。
移動方向の算出
|
1 2 3 |
Vector3 forward = transform.forward; Vector3 right = transform.right; Vector3 moveDir = (forward * mv.y + right * mv.x).normalized; |
ここでは、プレイヤーの向いている方向に対して「前後・左右」へ動かすためのベクトルを作成しています。
-
transform.forward:プレイヤーが前を向いている方向のベクトル -
transform.right:プレイヤーの右方向のベクトル
入力(mv.y, mv.x)を掛け合わせることで「WASDによる相対移動」を実現しています。
最後の .normalized は「斜め移動でも速度が速くならないようにする」ためです。
.normalized の意味ベクトルの長さを「1」に揃える処理です。
もし正規化しなければ、
たとえば「前+右=√2倍の速さ」になってしまいます。
ダッシュ速度の計算
|
1 2 |
bool isDashing = dashAction != null && dashAction.action.IsPressed(); float speed = walkSpeed * (isDashing ? dashMultiplier : 1f); |
IsPressed() でShiftキーなどが押されている間だけtrueになります。
押されているときは walkSpeed × dashMultiplier の速度に変更されます。
三項演算子 ? : の読み方
|
1 |
isDashing ? dashMultiplier : 1f |
これは「もしisDashingがtrueならdashMultiplier、falseなら1を使う」という意味。
1行で条件分岐を書けますが、読みづらい場合は下のように書いても同じ
|
1 2 3 |
float speed = walkSpeed; if (isDashing) speed *= dashMultiplier; |
水平方向の移動ベクトル
|
1 |
Vector3 horizontal = moveDir * speed; |
進む方向に速度を掛けて、実際にどれくらい動くかを求めます。
この時点では上下成分は含まれていません。
重力と落下の処理
|
1 2 3 4 5 |
if (controller.isGrounded && velocity.y < 0f) { velocity.y = -2f; } velocity.y += gravity * Time.deltaTime; |
isGrounded は「地面に接しているかどうか」。
接地しているときに上向き速度(velocity.y)が残っていると
キャラクターが浮いたままになることがあるため、
-2f の軽い値で押し付けて安定させています。
その後、毎フレーム重力を加算して、
空中にいる間は下方向へどんどん加速していきます。
実際の移動処理
|
1 2 |
Vector3 motion = horizontal + velocity; controller.Move(motion * Time.deltaTime); |
移動量(水平移動+落下)を合成して、
1フレーム分の動きを CharacterController に伝えます。
Time.deltaTime を掛けているのは、
フレームレートが違っても同じスピードで動くようにするためです。
このスクリプトのポイントまとめ
| 要素 | 内容 | 注意点 |
|---|---|---|
| CharacterController | Rigidbodyを使わずに移動 | コリジョンは物理ではない |
| Input System | 新しい入力方式 | Enable()/Disable()が必須 |
| 重力処理 | velocity.yに加算 | -2fで地面押し付け防止 |
| 移動方向 | forward/rightベース | normalizedで速度一定化 |
| ダッシュ | Shiftで速度UP | 三項演算子で簡略化 |
スクリプトをPlayerにアタッチする
書き終えたら、「CTRL+S」でセーブしてUnity に戻りましょう。
Projectウィンドウの 「PlayerCTRL」 スクリプトを、
Hierarchy内の 「Player」オブジェクト にドラッグ&ドロップしてアタッチします。

では次に、PlayerCTRL スクリプトの設定を行っていきましょう。
Hierarchyで 「Player」オブジェクト を選択し、
Inspector(インスペクター) を確認します。
PlayerCTRL コンポーネント内にある、
-
Move Action に「Player / Move」
-
Dash Action に「Player / Sprint」
をそれぞれ割り当ててください。
これで、W・A・S・Dキーによる移動と、Shiftキーによるダッシュ入力が有効になります。

設定が完了したら、一度 「Ctrl + P」 または画面上部の再生ボタン ▶ からゲームを実行してみましょう。
すると、プレイヤーに CharacterController コンポーネントが自動的にアタッチされます。
一度、再生を止めて
Inspector(インスペクター)を確認し、Radius(半径) を 0.75 に変更してください。
次に、現在プレイヤーが床(Plane)に少し埋まっている状態になっているため、
Transform の位置を以下のように調整します。
-
位置(Position):X = 0, Y = 1, Z = 0
このように設定することで、プレイヤーが床の上に正しく立った状態になります。

これで、プレイヤーの移動制御は完成です。
一度、再生ボタン ▶ または Ctrl + P を押してゲームを実行してみましょう。
W・A・S・Dキーで移動し、Shiftキーでダッシュできれば成功です!
スムーズに動けていれば、移動処理の実装は問題ありません。

マウスで視点を動かせるようにする
ここでは、マウス操作でカメラを上下左右に回転させ、プレイヤーが周囲を見回せるようにします。上下の回転角には制限を設け、酔いづらい設定にします。
先ほど作成した 「PlayerCTRL」 を開き、マーカーで示した箇所を追記してください。
追記後は Ctrl + S で保存し、Unity に戻ってコンパイル完了を待ちます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
using UnityEngine; using UnityEngine.InputSystem; // CharacterController コンポーネントが必須であることを示す属性 [RequireComponent(typeof(CharacterController))] public class PlayerCTRL : MonoBehaviour { [Header("参照")] [Tooltip("上下回転(ピッチ)を与えるカメラ。Playerの子にしてください。")] public Camera playerCamera; private CharacterController controller; // プレイヤーの物理的な移動を扱うコンポーネント [Header("Input Actions (InputActionReference)")] [Tooltip("移動入力(Vector2)。Input Actions の Move を割り当てる")] public InputActionReference moveAction; [Tooltip("ダッシュ入力(Button)。Input Actions の Sprint を割り当てる")] public InputActionReference dashAction; [Tooltip("視点入力(Vector2/MOUSE DELTA)。Input Actions の Look を割り当てる")] public InputActionReference lookAction; [Header("移動設定")] [Tooltip("歩行速度(m/s)")] public float walkSpeed = 3.5f; [Tooltip("ダッシュ倍率(1.8なら歩行の1.8倍)")] public float dashMultiplier = 1.8f; [Tooltip("重力(マイナス値が下向き)")] public float gravity = -18f; [Header("視点設定")] [Tooltip("マウス感度")] public float mouseSensitivity = 1.2f; [Tooltip("上下の回転角制限")] public float pitchClamp = 80f; [Tooltip("開始時にカーソルをロック&非表示にする")] public bool lockCursorOnStart = true; // プレイヤーの上下方向の速度を記録(重力用) private Vector3 velocity; private float yaw; // 水平角(Y軸) private float pitch; // 垂直角(X軸) void Awake() { // 起動時に CharacterController を取得しておく controller = GetComponent<CharacterController>(); if (playerCamera == null) { playerCamera = GetComponentInChildren<Camera>(); } } void OnEnable() { // スクリプトが有効になったときに入力を受け付ける moveAction?.action.Enable(); dashAction?.action.Enable(); lookAction?.action.Enable(); } void OnDisable() { // スクリプトが無効になったときに入力を停止する moveAction?.action.Disable(); dashAction?.action.Disable(); lookAction?.action.Disable(); } void Start() { // カーソルロック if (lockCursorOnStart) { Cursor.lockState = CursorLockMode.Locked; Cursor.visible = false; } // 初期角度をTransformから取得 yaw = transform.eulerAngles.y; pitch = (playerCamera != null) ? playerCamera.transform.localEulerAngles.x : 0f; if (pitch > 180f) pitch -= 360f; // 0~360 → -180~180 へ補正 } void Update() { // 毎フレームごとに移動処理を実行 Move(); Look(); // 視点操作 Cursor.lockState = CursorLockMode.Locked; Cursor.visible = false; } void Look() { if (lookAction == null) return; Vector2 look = lookAction.action.ReadValue<Vector2>(); // Mouse Delta 等 float mouseX = look.x * mouseSensitivity; float mouseY = look.y * mouseSensitivity; // Player本体の水平回転 yaw += mouseX; transform.rotation = Quaternion.Euler(0f, yaw, 0f); // カメラの垂直回転 pitch -= mouseY; pitch = Mathf.Clamp(pitch, -pitchClamp, pitchClamp); if (playerCamera != null) { playerCamera.transform.localRotation = Quaternion.Euler(pitch, 0f, 0f); } } void Move() { Vector2 mv = Vector2.zero; // Input System から移動入力を取得(x=左右、y=前後) if (moveAction != null) mv = moveAction.action.ReadValue<Vector2>(); // プレイヤーの現在の向きを基準に前方向・右方向を取得 Vector3 forward = transform.forward; Vector3 right = transform.right; // 入力に応じて移動方向を算出(正規化して斜め移動でも速度一定に) Vector3 moveDir = (forward * mv.y + right * mv.x).normalized; // ダッシュボタンが押されている間はスピードを倍率分アップ bool isDashing = dashAction != null && dashAction.action.IsPressed(); float speed = walkSpeed * (isDashing ? dashMultiplier : 1f); // 水平方向の移動ベクトル Vector3 horizontal = moveDir * speed; // 地面に接している場合は落下速度をリセット(ふわ浮きを防ぐ) if (controller.isGrounded && velocity.y < 0f) { velocity.y = -2f; } // 毎フレーム重力を加算 velocity.y += gravity * Time.deltaTime; // 実際に動かす量(水平移動+重力)を合成 Vector3 motion = horizontal + velocity; // CharacterController を使って物理的に移動させる controller.Move(motion * Time.deltaTime); } } |
スクリプトの解説
カメラ参照の指定
|
1 2 3 |
[Header("参照")] [Tooltip("上下回転(ピッチ)を与えるカメラ。Playerの子にしてください。")] public Camera playerCamera; |
この変数は、プレイヤーの**視点(カメラ)**を指定するための参照です。
プレイヤー本体が左右回転を担当し、カメラが上下回転を担当するのがFPSの基本構造。
これにより、体と視線が独立した自然な操作感を実現します。
視点入力(Look Action)の設定
|
1 2 |
[Tooltip("視点入力(Vector2/MOUSE DELTA)。Input Actions の Look を割り当てる")] public InputActionReference lookAction; |
ここではマウスや右スティックの「動かした量」をVector2として受け取ります。
xが左右、yが上下の動きです。
Input Actions では、Control Type を Vector2、Binding を「Mouse/Delta」にしておくのがポイント。
視点パラメータの設定
|
1 2 3 4 |
[Header("視点設定")] public float mouseSensitivity = 1.2f; public float pitchClamp = 80f; public bool lockCursorOnStart = true; |
-
mouseSensitivity:視点の動きの速さ。1.0が標準で、値を上げると早く動く。
-
pitchClamp:上下の見上げ・見下げ角度の制限。過回転を防止します。
-
lockCursorOnStart:ゲーム開始時にマウスカーソルを中央固定+非表示にする設定。FPSで必須。
Clampとは?
値を一定範囲に制限すること。
Mathf.Clamp(pitch, -pitchClamp, pitchClamp) と書くことで、
-80°〜80°の範囲しか上下を向けないようになります。
角度の管理変数を追加
|
1 2 |
private float yaw; // 水平角(Y軸) private float pitch; // 垂直角(X軸) |
視点の回転は「1フレームごとの差分」を加算していく方式なので、
現在の回転角を変数として保持します。
-
yaw:プレイヤー本体の左右回転角
-
pitch:カメラの上下回転角
Awake():コンポーネント取得とカメラ参照
|
1 2 3 4 5 |
controller = GetComponent<CharacterController>(); if (playerCamera == null) { playerCamera = GetComponentInChildren<Camera>(); } |
-
CharacterControllerを取得しておきます。
-
Cameraが未設定なら子階層から自動取得します。
(FPS構成なら基本的にカメラはPlayerの子なので問題なし)
Start():初期角度とカーソルロック
|
1 2 3 4 5 6 7 8 9 |
if (lockCursorOnStart) { Cursor.lockState = CursorLockMode.Locked; Cursor.visible = false; } yaw = transform.eulerAngles.y; pitch = (playerCamera != null) ? playerCamera.transform.localEulerAngles.x : 0f; if (pitch > 180f) pitch -= 360f; |
-
カーソルロック:マウスが画面外に出ないように固定。
-
yaw / pitch の初期化:シーン配置時の角度を読み取り、回転の基準にします。
-
180°補正:Unityの角度は0〜360°表記なので、-180〜180°に直すことで上下制限が正しく動作します。
三項演算子の部分
|
1 |
pitch = (playerCamera != null) ? playerCamera.transform.localEulerAngles.x : 0f; |
この1行は
「カメラが存在するならそのX角度を使う。なければ0°」
という意味です。
初心者は以下のように書き換えると読みやすいです
|
1 2 3 4 |
if (playerCamera != null) pitch = playerCamera.transform.localEulerAngles.x; else pitch = 0f; |
Update():毎フレーム視点を更新
|
1 2 3 |
Look(); Cursor.lockState = CursorLockMode.Locked; Cursor.visible = false; |
-
Look()を呼んでマウス移動を反映。
-
カーソルロック維持:何らかの理由でロックが外れても毎フレーム再設定します。
ただし、メニューを開く処理の場合はロック解除の条件分岐を追加してください。
Look():視点移動の本体処理
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
void Look() { if (lookAction == null) return; Vector2 look = lookAction.action.ReadValue<Vector2>(); float mouseX = look.x * mouseSensitivity; float mouseY = look.y * mouseSensitivity; yaw += mouseX; transform.rotation = Quaternion.Euler(0f, yaw, 0f); pitch -= mouseY; pitch = Mathf.Clamp(pitch, -pitchClamp, pitchClamp); if (playerCamera != null) { playerCamera.transform.localRotation = Quaternion.Euler(pitch, 0f, 0f); } } |
視点入力の取得
lookAction.action.ReadValue<Vector2>()でマウスの移動量を読み取ります。
-
xが左右 -
yが上下
それぞれ感度を掛けて操作スピードを調整します。
水平回転(Yaw)
|
1 2 |
yaw += mouseX; transform.rotation = Quaternion.Euler(0f, yaw, 0f); |
プレイヤー全体(体)をY軸中心に回転させます。
体の向き=進行方向になるように本体の回転を管理します。
垂直回転(Pitch)
|
1 2 3 |
pitch -= mouseY; pitch = Mathf.Clamp(pitch, -pitchClamp, pitchClamp); playerCamera.transform.localRotation = Quaternion.Euler(pitch, 0f, 0f); |
上下の動きはカメラのローカル回転として適用します。
Clampで視点が真上や真下に行き過ぎるのを防止します。
Quaternion.Eulerの使い方
Quaternion.Euler(x, y, z)は「指定角度で回転した姿勢」を作る関数。
ここでは
-
transform.rotation = Quaternion.Euler(0, yaw, 0);→ 本体の向き -
playerCamera.transform.localRotation = Quaternion.Euler(pitch, 0, 0);→ カメラ上下と分けています。
PlayerCTRLを設定する
「Player」オブジェクトを選択し、Inspector(インスペクター)を確認します。
-
Player Camera に 「Main Camera」 をドラッグ&ドロップしてアタッチします。
-
Look Action に 「Player / Look」 を割り当てます。
これで、マウスの動きに応じて視点が回転するようになります。

設定が完了したら、再生ボタン ▶ または Ctrl + P でゲームを実行してみましょう。
Gameビューでマウスを動かし、視点が自由に動けば成功です!
これで、プレイヤーが周囲を見回せるようになりました。

マウス操作を取られてしまうのでこのままでは再生状態から抜けられなくなります。一旦escキーなどを押してから再生停止してください。
足音を追加して臨場感をアップしよう
ここでは、プレイヤーの移動に合わせて足音を再生できるようにします。
歩く・走る速度によって再生間隔を変えることで、よりリアルで緊張感のある雰囲気を演出します。
先ほど作成した 「PlayerCTRL」 スクリプトを開き、
マーカーで示した箇所をそのまま追加してください。
追記が完了したら、Ctrl + S で保存して Unity に戻りましょう。
まとめと次回予告

今回は、プレイヤーの移動・視点操作・足音の実装を行いました。
-
W・A・S・Dキーで移動、Shiftキーでダッシュが可能に
-
マウス操作で視点を回転し、周囲を見渡せるように
-
足音を追加して、動作にリアルな臨場感をプラス
これで、プレイヤーが実際に歩き回れる基本操作の完成形となりました。
ゲームの操作部分はこれでしっかりと土台が整いましたね!
次回は、いよいよマップの作成とグラフィックの調整を行っていきます。
ポストプロセスを使った映像演出や、ライト設定による雰囲気づくりなど、
ホラーゲームらしい“世界観の空気”を作り上げる工程に入ります。
-
基本的なマップ構成の作成
-
ライティングで明暗の演出
-
ポストプロセスによる質感・雰囲気調整
次回は、**「見た目の恐怖と没入感」**を中心に作り込んでいきましょう。
次回の記事↓

現場レベルのゲーム制作が、すべてここで学べます。






コメント