Unity 8番出口ライクのホラー風脱出ゲームの作り方2 プレイヤー操作とホラー感のある足音を鳴らす機能を実装する | Unity入門の森 ゲームの作り方

Unity 8番出口ライクのホラー風脱出ゲームの作り方2 プレイヤー操作とホラー感のある足音を鳴らす機能を実装する

Unity ホラー風3D脱出ゲームの作り方 ~8番ライクゲーを作りながらポストプロセスや音響表現をマスターしよう~

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

【永久会員チケット】

永久会員チケット|Unity入門の森

全講座を見放題で学ぶ

ソースコード・素材・プロジェクトすべて公開。
Unityの基礎から応用まで、一生使えるスキルを体系的に習得。

この記事は、Unityを使った「8番出口」ライクなホラー風脱出ゲームの作り方をわかりやすく解説していくシリーズの第2回です。



前回は、アセットのインポートやTextMeshProの日本語対応設定、そして画面中央に照準(クロスヘア)を表示する方法を学びました。

前回の記事:

Unity ホラー風脱出ゲームの作り方1 プロジェクト作成と下準備
この記事はUnity ホラー風3D脱出ゲームの作り方講座の第1回です。本講座では、Unityを使って「8番出口」ライクなホラー風3D脱出ゲームの作り方を、わかりやすく解説していきます。初心者の方でも安心して進められるように基礎から丁寧に説明...

今回は、プレイヤーの操作を実装していきます。

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 CameraPlayer の子オブジェクトになり、

プレイヤーの移動に合わせてカメラも一緒に動くようになります。

 

続いて、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 で後退、AD で左右移動できるようにしていきましょう。

まず、先ほど作成した 「PlayerCTRL」 スクリプトをダブルクリックして開きましょう。

すると、Visual Studio(または既定のコードエディタ) が起動し、

次のような基本構造のプログラムが表示されると思います。

では、こちらのスクリプトを以下のように変更しましょう。

マーカー部分を参考に、不要な箇所を削除して新しいコードに書き換えてください。

 

スクリプトの解説

このスクリプトは、UnityのCharacterControllerを使って

「歩く」「走る(ダッシュ)」「重力で落下する」動きを実現するためのプレイヤー制御です。

Rigidbody を使わず、プログラム側で移動ベクトルと重力を直接管理しているのが特徴。

また、新Input Systemを使って入力を処理しています。

using宣言

UnityEngineは基本。

InputSystemは「新しい入力管理(Input Actions)」を使うために必要。

旧システム(Input.GetAxisなど)とは別物です。

 

[RequireComponent(typeof(CharacterController))]

この属性を付けておくと、

このスクリプトをアタッチしたとき自動的にCharacterControllerが追加されるようになります。

初心者がよくやる「コンポーネント付け忘れ」の防止策です。

変数宣言部

プレイヤーの物理移動を行うコンポーネントです。

controller.Move()を呼び出すことで、プレイヤーを移動させることができます。

Rigidbodyではなくこちらを使うことで「物理演算に依存しない移動」ができます。

Input Actions 関連
  • moveAction:WASDやスティック操作の入力を読み取る。

  • dashAction:Shiftキーなどで走る動作をトリガーする。

InputActionReferenceとは?

Input Actions アセットで作った操作設定(Move, Sprintなど)を

スクリプトから参照できるようにする橋渡しオブジェクト
移動パラメータ
  • walkSpeed:通常の移動速度(m/s)

  • dashMultiplier:走っているときの倍率。たとえば1.8なら約1.8倍速。

  • gravity:重力の強さ。マイナスで下方向を意味する。

UnityのCharacterControllerには標準で重力が無いので、

自分で velocity.y に重力を加える仕組みを作る必要があります。

内部変数

velocityは「現在のY方向(上下)速度」を記録します。

Move()の中で velocity.y に重力を加え続け、落下を再現します。

Awake()

ゲーム開始時に CharacterController コンポーネントを取得して

controller 変数に代入しておきます。

これをAwakeでやる理由は、Startよりも早い段階で初期化したいからです。

OnEnable() / OnDisable()

これらはスクリプトが有効になったとき/無効になったときに呼ばれます。

Input Systemでは、「入力を有効にする」処理が必要

?. 演算子を使って安全にアクセスしています。

?.(null条件演算子)とは?

この書き方は「もし moveAction が null でなければ Enable() を実行する」という意味。

nullチェックを1行で書けます。

同じことをif文で書くとこう

初心者はまずこちらの書き方を覚える方が読みやすいです。

Update()

1フレームごとに Move() 関数を呼び出します。

この中で移動や重力処理が行われます。

Updateは毎フレーム呼ばれるので、

「常に入力を監視して、必要に応じて動かす」仕組みになっています。

Move() — メイン処理

ここがプレイヤーの移動・ダッシュ・重力処理の中心です。

入力を取得

mv.x が左右(A/Dキー)、mv.y が前後(W/Sキー)を表します。

最初に Vector2.zero(= (0,0))で初期化しているのは、

入力が無い時に値が残って誤動作しないようにするためです。

移動方向の算出

ここでは、プレイヤーの向いている方向に対して「前後・左右」へ動かすためのベクトルを作成しています。

  • transform.forward:プレイヤーが前を向いている方向のベクトル

  • transform.right:プレイヤーの右方向のベクトル

入力(mv.y, mv.x)を掛け合わせることで「WASDによる相対移動」を実現しています。

最後の .normalized は「斜め移動でも速度が速くならないようにする」ためです。

.normalized の意味
ベクトルの長さを「1」に揃える処理です。

もし正規化しなければ、

たとえば「前+右=√2倍の速さ」になってしまいます。
ダッシュ速度の計算

IsPressed() でShiftキーなどが押されている間だけtrueになります。

押されているときは walkSpeed × dashMultiplier の速度に変更されます。

三項演算子 ? : の読み方

これは「もしisDashingがtrueならdashMultiplier、falseなら1を使う」という意味。

1行で条件分岐を書けますが、読みづらい場合は下のように書いても同じ

水平方向の移動ベクトル

進む方向に速度を掛けて、実際にどれくらい動くかを求めます。

この時点では上下成分は含まれていません。

重力と落下の処理

isGrounded は「地面に接しているかどうか」。

接地しているときに上向き速度(velocity.y)が残っていると

キャラクターが浮いたままになることがあるため、

-2f の軽い値で押し付けて安定させています。

その後、毎フレーム重力を加算して、

空中にいる間は下方向へどんどん加速していきます。

実際の移動処理

移動量(水平移動+落下)を合成して、

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 に戻ってコンパイル完了を待ちます。

スクリプトの解説

カメラ参照の指定

この変数は、プレイヤーの**視点(カメラ)**を指定するための参照です。

プレイヤー本体が左右回転を担当し、カメラが上下回転を担当するのがFPSの基本構造。

これにより、体と視線が独立した自然な操作感を実現します。

視点入力(Look Action)の設定

ここではマウスや右スティックの「動かした量」をVector2として受け取ります。

xが左右、yが上下の動きです。

Input Actions では、Control Type を Vector2、Binding を「Mouse/Delta」にしておくのがポイント。

視点パラメータの設定
  • mouseSensitivity:視点の動きの速さ。1.0が標準で、値を上げると早く動く。

  • pitchClamp:上下の見上げ・見下げ角度の制限。過回転を防止します。

  • lockCursorOnStart:ゲーム開始時にマウスカーソルを中央固定+非表示にする設定。FPSで必須。

Clampとは?

値を一定範囲に制限すること。

Mathf.Clamp(pitch, -pitchClamp, pitchClamp) と書くことで、

-80°〜80°の範囲しか上下を向けないようになります。

 

角度の管理変数を追加

視点の回転は「1フレームごとの差分」を加算していく方式なので、

現在の回転角を変数として保持します。

  • yaw:プレイヤー本体の左右回転角

  • pitch:カメラの上下回転角

Awake():コンポーネント取得とカメラ参照
  • CharacterControllerを取得しておきます。

  • Cameraが未設定なら子階層から自動取得します。

    (FPS構成なら基本的にカメラはPlayerの子なので問題なし)

Start():初期角度とカーソルロック
  • カーソルロック:マウスが画面外に出ないように固定。

  • yaw / pitch の初期化:シーン配置時の角度を読み取り、回転の基準にします。

  • 180°補正:Unityの角度は0〜360°表記なので、-180〜180°に直すことで上下制限が正しく動作します。

三項演算子の部分

この1行は

「カメラが存在するならそのX角度を使う。なければ0°」

という意味です。

初心者は以下のように書き換えると読みやすいです

Update():毎フレーム視点を更新
  • Look()を呼んでマウス移動を反映。

  • カーソルロック維持:何らかの理由でロックが外れても毎フレーム再設定します。

    ただし、メニューを開く処理の場合はロック解除の条件分岐を追加してください。

Look():視点移動の本体処理
視点入力の取得

lookAction.action.ReadValue<Vector2>()でマウスの移動量を読み取ります。

  • xが左右

  • yが上下

それぞれ感度を掛けて操作スピードを調整します。

水平回転(Yaw)

プレイヤー全体(体)をY軸中心に回転させます。

体の向き=進行方向になるように本体の回転を管理します。

垂直回転(Pitch)

上下の動きはカメラのローカル回転として適用します。

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 に戻りましょう。

続きを読む

このコンテンツはパスワードで保護されています。 コンテンツを読みたい方はUnity入門の森ショップ(https://unityforest.shop/)で講座閲覧権を取得してね。

まとめと次回予告

今回は、プレイヤーの移動・視点操作・足音の実装を行いました。

  • W・A・S・Dキーで移動Shiftキーでダッシュが可能に

  • マウス操作で視点を回転し、周囲を見渡せるように

  • 足音を追加して、動作にリアルな臨場感をプラス

これで、プレイヤーが実際に歩き回れる基本操作の完成形となりました。

ゲームの操作部分はこれでしっかりと土台が整いましたね!

次回は、いよいよマップの作成とグラフィックの調整を行っていきます。

ポストプロセスを使った映像演出や、ライト設定による雰囲気づくりなど、

ホラーゲームらしい“世界観の空気”を作り上げる工程に入ります。

  • 基本的なマップ構成の作成

  • ライティングで明暗の演出

  • ポストプロセスによる質感・雰囲気調整

次回は、**「見た目の恐怖と没入感」**を中心に作り込んでいきましょう。

次回の記事↓

Unity ホラー風脱出ゲームの作り方3 ポストプロセスの使い方/画面を暗くして恐怖を感じる演出方法を習得
この講座は、「8番出口」ライクなUnityホラー風脱出ゲームの作り方講座シリーズの第3回です。前回は、プレイヤーを「CharacterController」を使って移動・ダッシュできるようにし、マウス操作で視点移動を可能にしました。さらに、...

Unity ホラー風3D脱出ゲームの作り方講座に戻る >>

【ゲームの作り方講座もプレゼント中!】

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

【永久会員チケット】

永久会員チケット|Unity入門の森

全講座を見放題で学ぶ

ソースコード・素材・プロジェクトすべて公開。
Unityの基礎から応用まで、一生使えるスキルを体系的に習得。

コメント

タイトルとURLをコピーしました