0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

コントローラー操作への対応(Unity)

0
Last updated at Posted at 2025-12-14

Act0 はじめに

 この記事は、名工大AdventCalender2025の14日目の記事です。
 この記事を見ているということは、たぶんUnityでコントローラーによる操作を実装したいのだと思います。もしくは単に気になったのでしょう。前置きがちょっと長いので、Act1まで飛ばしても良いです。なお、今回のUnityのバージョンは"6000.0.60f1"です。

 いつもゲーム開発をしている人間は、キーボード操作に慣れているため、WASD移動とか、スペースキーのジャンプとか、もしくはZキー/Xキーの決定/キャンセル辺りの操作は当たり前になっていると思います。しかし、普段パソコンでゲームをやらない人にとっては、「ゲーム=コントローラーでピコピコするやつ」という等式が成り立ってしまっているため、中々とっつきにくくなってしまいます。

 私は今年の名工大の工大祭で2つゲームを展示しました。1つはチームで作った3Dアクションゲーム、もう一つは個人で作ったシューティングゲームです。結果としては、ACTの方はかなり遊ばれていたのですが、STGの方はあんまり遊ばれていませんでした。勿論、ジャンルとかクオリティに影響されている節はあると思いますが、コントローラー操作に対応させていなかったのも原因の一つでしょう。

スクリーンショット 2025-11-11 000641.png
 ↑制作した3Dアクションゲーム「Box Garden」

スクリーンショット 2025-12-13 234005.png
 ↑制作したシューティングゲーム「Bullet Collection」
 分かる人には分かりますが、東方Projectの二次創作ゲームです。

 「コントローラー操作」という使い古されたネタかもしれませんが、ゲームの開発中に躓いたところをおさえながら、少し発展的な内容も含めて知識を共有していきたいと思うので、活用していただければ幸いです。
 結構具体的な手段とかコードとかも書きますが、あくまでも方法の一つに過ぎないので、自分にあった形で実装していくのをお勧めします。

Act1 プロジェクトとオブジェクトの作成

 Act0で言及した「Box Gurden」というゲームの制作では、プログラム以外にも、デザインとか音楽とかUIとかを実装していったのですが、そこは別に本題ではないので、「オブジェクトを動かす」ことを目標に進めていきます。この章は下準備なので、Unityを触ったことがある人は気にしなくても良いです。

まずは、プロジェクトを立てましょう。最初に「インストール」から「エディターをインストール」を選び、「インストール」をやっておきましょう。バージョンは推奨されているもので良いです。そして、「プロジェクト」の「新しいプロジェクト」から「Universal 3D」を選んで、「プロジェクトを作成」します。少し待つと、画面が開きます。

スクリーンショット 2025-12-14 005808.png
 ↑こんな画面、全てはここから始まる

 次に、オブジェクトを配置します。今回は地面と動かす物体があればいいので、左のヒエラルキーで右クリックして、「3D Object」から「Cube」と「Sphere」を選択してそれぞれ配置しましょう。分かりやすいように、Materialで色も付けてみたり(Assets内で右クリックして選択します)。

スクリーンショット 2025-12-14 010601.png
 ↑配置した画像、座標や大きさはインスペクターで上手く調整する

 これで準備は完了です。

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が作られるので、選択すると、このようなウィンドウが開きます。

スクリーンショット 2025-12-14 103505.png

 オブジェクトの移動を実装するために、「Action Maps」で「player」という名前でMapを作り、そこから「Actions」にも「move」というActionを追加します。そして、Action Propertiesにて、「Action Type」を「Value」、「Control Type」を「vector 2」に設定しておきます。さらに、moveのBindingをGamepadのLeftStickに設定しましょう。この時点でこんな感じです。

スクリーンショット 2025-12-14 104418.png

 ちなみに、「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君は本当に面白いので、是非とも一回触ってみて下さいな。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?