Act0 はじめに
この記事は、名工大AdventCalender2025の14日目の記事です。
この記事を見ているということは、たぶんUnityでコントローラーによる操作を実装したいのだと思います。もしくは単に気になったのでしょう。前置きがちょっと長いので、Act1まで飛ばしても良いです。なお、今回のUnityのバージョンは"6000.0.60f1"です。
いつもゲーム開発をしている人間は、キーボード操作に慣れているため、WASD移動とか、スペースキーのジャンプとか、もしくはZキー/Xキーの決定/キャンセル辺りの操作は当たり前になっていると思います。しかし、普段パソコンでゲームをやらない人にとっては、「ゲーム=コントローラーでピコピコするやつ」という等式が成り立ってしまっているため、中々とっつきにくくなってしまいます。
私は今年の名工大の工大祭で2つゲームを展示しました。1つはチームで作った3Dアクションゲーム、もう一つは個人で作ったシューティングゲームです。結果としては、ACTの方はかなり遊ばれていたのですが、STGの方はあんまり遊ばれていませんでした。勿論、ジャンルとかクオリティに影響されている節はあると思いますが、コントローラー操作に対応させていなかったのも原因の一つでしょう。

↑制作したシューティングゲーム「Bullet Collection」
分かる人には分かりますが、東方Projectの二次創作ゲームです。
「コントローラー操作」という使い古されたネタかもしれませんが、ゲームの開発中に躓いたところをおさえながら、少し発展的な内容も含めて知識を共有していきたいと思うので、活用していただければ幸いです。
結構具体的な手段とかコードとかも書きますが、あくまでも方法の一つに過ぎないので、自分にあった形で実装していくのをお勧めします。
Act1 プロジェクトとオブジェクトの作成
Act0で言及した「Box Gurden」というゲームの制作では、プログラム以外にも、デザインとか音楽とかUIとかを実装していったのですが、そこは別に本題ではないので、「オブジェクトを動かす」ことを目標に進めていきます。この章は下準備なので、Unityを触ったことがある人は気にしなくても良いです。
まずは、プロジェクトを立てましょう。最初に「インストール」から「エディターをインストール」を選び、「インストール」をやっておきましょう。バージョンは推奨されているもので良いです。そして、「プロジェクト」の「新しいプロジェクト」から「Universal 3D」を選んで、「プロジェクトを作成」します。少し待つと、画面が開きます。
次に、オブジェクトを配置します。今回は地面と動かす物体があればいいので、左のヒエラルキーで右クリックして、「3D Object」から「Cube」と「Sphere」を選択してそれぞれ配置しましょう。分かりやすいように、Materialで色も付けてみたり(Assets内で右クリックして選択します)。

↑配置した画像、座標や大きさはインスペクターで上手く調整する
これで準備は完了です。
Act2 スフィアを動かす
ここからが本題です。この球体を動かしましょう。といっても、ただ動かすだけなら簡単です。スフィアのインスペクターから「Add Component」で「Rigidbody」を追加し、以下のC#のスクリプトをAssets内に用意して(Create → MonoBehaviour Script)、スフィアのインスペクターにドラッグアンドドロップしてみましょう。
// sample1
using UnityEngine;
public class ArrowKeyMovement : MonoBehaviour
{
public float moveSpeed = 5.0f;
void Update()
{
Vector3 movement = Vector3.zero;
if (Input.GetKey(KeyCode.W))
{
movement += transform.forward;
}
if (Input.GetKey(KeyCode.S))
{
movement -= transform.forward;
}
if (Input.GetKey(KeyCode.A))
{
movement -= transform.right;
}
if (Input.GetKey(KeyCode.D))
{
movement += transform.right;
}
if (movement.magnitude > 0)
{
transform.position += movement.normalized * moveSpeed * Time.deltaTime;
}
}
}
再生ボタンのようなボタンでPlayすれば、WASDキーで動かせると思います。
しかし、今回の訴求点はここではありません。コントローラーで、動かせるようにすることです。コントローラー操作への対応は、主に「Input System」と「Input Action」の二つの方法があります。最近はInput Actionを使うことが推奨されているようですが、正直、小規模なゲームならInput Systemでも大丈夫だと思います。設定も比較的簡単です。とは言え、拡張性なども考慮すると、Input Actionを利用するようにした方がいいでしょう。今回も、それを使っていきます。
再びAssets内で右クリックして、「Create」から「Input Action」を選択しましょう。すると、フォルダ内にEditerが作られるので、選択すると、このようなウィンドウが開きます。
オブジェクトの移動を実装するために、「Action Maps」で「player」という名前でMapを作り、そこから「Actions」にも「move」というActionを追加します。そして、Action Propertiesにて、「Action Type」を「Value」、「Control Type」を「vector 2」に設定しておきます。さらに、moveのBindingをGamepadのLeftStickに設定しましょう。この時点でこんな感じです。
ちなみに、「path」を設定するとき、Listenを使うことで、実際にコントローラーで入力したものが表示されるので、便利です。
その後、インスペクターで「Generate C# Class」にチェックし、FileやNameを設定して、Applyすると、はい、Assets内にスクリプトが生成されました。これを元に、もう一つC#スクリプトを作ってみます。
// sample2
using UnityEngine;
using UnityEngine.InputSystem;
public class GamepadMovement : MonoBehaviour, NewActions.IPlayerActions
{
public float moveSpeed = 5.0f;
private Vector2 moveInput = Vector2.zero;
private NewActions inputActions;
void Awake()
{
inputActions = new NewActions();
inputActions.player.SetCallbacks(this);
}
void OnEnable()
{
inputActions.Enable();
}
void OnDisable()
{
inputActions.Disable();
}
void Update()
{
MoveObject();
}
public void OnMove(InputAction.CallbackContext context)
{
if (context.performed)
{
moveInput = context.ReadValue<Vector2>();
}
else if (context.canceled)
{
moveInput = Vector2.zero;
}
else if (context.phase == InputActionPhase.Started || context.phase == InputActionPhase.Waiting)
{
moveInput = context.ReadValue<Vector2>();
}
}
private void MoveObject()
{
Vector3 movement = transform.right * moveInput.x + transform.forward * moveInput.y;
transform.position += movement * moveSpeed * Time.deltaTime;
}
}
先ほどと同じように、スフィアにドラッグアンドドロップすると、コントローラーで動かせます。これで、誰にでも遊べるようなゲームが作れるワケです。
Act3 複数人で遊ばせたい(発展)
ここからはちょっと発展的な内容です。やっぱりゲームは、複数人で遊んだ方が楽しいです。「友達は別売り」というスラングもありますが、これは複数人で遊びたい願望を表した表現だと思います。ということで、複数のコントローラーで複数のオブジェクトを操作できるようにしましょう。
実は、Input Actionは一つ用意すれば、他のActionを用意する必要はありません。変更しなくて良いです。このあたりがInput Systemより優れた所ですね。そして、プレイヤーごとの入力値を保存するスクリプトと、PlayerInputManagerによるプレイヤーとデバイスの関連付けを実装すれば、マルチプレイヤーに対応できます。
Act3については、後日内容を追加する予定です。
Act4 さいごに
ここまで読んでいただきありがとうございました。インターネット上にこのような記事を上げるのは初めてなので、読みにくかったと思いますが、お許しください。
Unity君は本当に面白いので、是非とも一回触ってみて下さいな。



