Unityで新InputSystemに移行する方法メモ。キー入力でもコントローラーでも動かせるようにする

unity 新しい入力システム new inputsystem 3Dゲームの作り方
※記事内に広告が含まれています。

バーチャル3Dクリエイター神部まゆみです(*^_^*)

この記事はUnityで新InputSystemに移行する方法についての記事です。

動作確認した最新バージョンは Unity 6000.3.1 です。

●PRスペース●

〇まゆみマート|BOOTH

BOOTHでVRoidテクスチャやVRChat向けオブジェクトなどを販売しています。いいねしてくれると励みになります(*^-^*)

やりたいこと:旧入力システムから新入力システム(New Input System)に移行したい

古い入力システムだと、スクリプトにGetButtonDownとか書いてあって、キーごとに制御してあったけど。

新しい入力システムだと、InputManagerでMoveとかAimなどのアクションを設定し、アクションごとにキーやボタンを紐付けて管理できる。

unity 新しい入力システム new inputsystem

古い入力システムはやがて無くなって、新しい入力システムに移行していくなんて話をだいぶ前から聞いていたけど、Unity6.3が出てもまだInput Systemのところはboth(両方)を選べるようになってますね。

unity 新しい入力システム new inputsystem

Unityってゲーム制作以外にも動画や配信など色々な用途で使われているから、単にスクリプトで切り替えるだけならキーで発動させればいいから古い入力システムのほうが楽なのかな?

しかしUSBコントローラーで動かしたいとなるとこちらのほうが管理しやすくてラクなので、移行してみたいと思った。

とりあえず以前作ったエイムの動作を新しい入力システムに対応させてみる

以前Starter Assetsにエイム動作を追加するスクリプトを書いたけど、手始めにあれから移行させてみたい。

L2キーでエイム、R2キーで発砲に設定されているゲームが多いかな?

ChatGPTパイセンに聞いてみる

ChatGPTパイセンに聞いてみます。

スクリプトについては以前の記事を参照。

unity 新しい入力システム new inputsystem
神部まゆみ
神部まゆみ

以下のスクリプトを新しい入力システムに対応させ、USBコントローラーでも動くようにしたいです。 プロジェクト設定のInput Acrionsで設定が必要なんでしたっけ?L2キーを押している間はエイムにしたいんですが。ActionsのところにAimって名前のやつを追加してキーとボタンを設定するつもりです。 スクリプトの書き換えとInput Actionsの設定方法を教えてください。

生成AI
生成AI

お、Unity の旧 Input から新 Input System(Input Actions)に乗り換えるやつね。L2 押しっぱで AIM にしたい気持ち、めちゃ分かる。USB コントローラー対応も Input Actions なら一気に片付くよ。

ここでは ①Input Actions の設定手順 と ②スクリプトの書き換え例 をセットでまとめるね。

🌟Input Actions(新入力システム)の設定手順

◆1. Input System を有効化

  • Edit → Project Settings → Player → Active Input Handling
    • BothInput System Package (New) にする
      (Both の方が安全)

◆2. Input Actions アセットを作る

※ もう ThirdPersonController の StarterAssetsInput 入ってるなら、そこに追加してOK。

  1. プロジェクト内の
    StarterAssets → Input → PlayerInputActions
    みたいな .inputactions ファイルを開く。
  2. Player アクションマップの中に
    • “Aim” という Action を追加
    • Action Type:Button
    • Interaction:Press (通常はデフォルトでOK)

◆3. Binding を追加

Aim に対して以下を設定:

〇マウス・キーボード用

  • Right Mouse Button(旧で GetMouseButton(1) だったやつ)

〇コントローラー用

PS系:

  • Gamepad → leftTrigger

Xbox系:

  • Gamepad → leftTrigger

※ Unity の “leftTrigger” は L2・LT 共通で拾えるから便利。


◆4. StarterAssetsInput にプロパティを追加する

ThirdPersonController の入力を受けてるクラスは
StarterAssetsInputs.cs というスクリプト。

そこに Aim フラグ用の変数 を追加する。

public bool aim;

そして、InputAction の callback に反映させる。

.inputactions を自動生成している場合は
OnAim(InputValue value) を作るだけ。

例:

public void OnAim(InputValue value)
{
    aim = value.isPressed;
}

この名前は Input Actions の Action 名(Aim)と一致させてね。


🌟Aim スクリプトの書き換え例(新 Input System 対応)

旧では Input.GetMouseButton を直接呼んでたけど、
新では StarterAssetsInput 経由でフラグを見るのが楽だよ。

using UnityEngine;
using StarterAssets;

public class Aim : MonoBehaviour
{
    public Animator animator;
    private ThirdPersonController thirdPersonController;
    private StarterAssetsInputs starterAssetsInputs;

    void Start()
    {
        thirdPersonController = GetComponent<ThirdPersonController>();
        starterAssetsInputs = GetComponent<StarterAssetsInputs>();
    }

    void Update()
    {
        if (starterAssetsInputs.aim)
        {
            animator.SetBool("Aim", true);
            thirdPersonController.MoveSpeed = 0f;
        }
        else
        {
            animator.SetBool("Aim", false);
            thirdPersonController.MoveSpeed = 2.0f;
        }
    }
}

👉 これで
マウス右ボタンでも、USBコントローラーの L2 / LT でも AIM が発動
するようになる。


🌟③ よくある詰まりポイント(ほんのり大事)

  • Player Input コンポーネントの
    「Behavior」は “Send Messages
    に設定しておくと、OnAim が自動で呼ばれる。
  • Action の名前(Aim)は 大文字小文字も一致 させること。

🌟まとめると…

はい、Input Actions に Aim を追加する必要があります。
そして PS / Xbox の L2 / LT は “leftTrigger” で拾えます。
スクリプトは StarterAssetsInputs 経由に書き換えるだけでOK。

いわれたとおりにやってみる

やることをまとめると、

①Input Systemを有効化。Both(両方)になってるならそれでOK

②Input ActionsにAimを追加、ボタンとキーのBindingも設定

③StarterAssetsInput.csにコードを追加

④Aim.csを書き換える

って感じかなぁ。

①Input Systemを有効化する

編集 ⇒ プロジェクト設定 ⇒ プレイヤー ⇒ アクティブな入力処理 のところをBoth(両方)にする。

unity 新しい入力システム new inputsystem

入力システムパッケージ(新)にしてしまうと旧用のコードが動かなくなるため、両方にしておいたほうが無難かな。

②Input ActionsにAimを追加、ボタンとキーのBindingも設定

Starter Assets用のInputActionAssetファイルを開いてAimを追加します。

デフォルトでSprintがL2(LeftTrigger)に割り当てられていて被ってしまうため、SprintをL1(LeftShoulder)に変えました。

エイムが解かれなかったのでAimのアクションタイプをButtonからValueにした

動かしてみたらボタンを離してもエイムしたままだったので、ここの設定を変えた。

デフォルトはButtonになってるけどValueに変えた。↓ここね。

unity 新しい入力システム new inputsystem

以前同じところで躓いたけど、ChatGPT氏に聞いても大丈夫みたいだったからこれで良いか。

③StarterAssetsInput.csにコードを追加

検索すると出ます。

unity 新しい入力システム new inputsystem

public bool aim;

public void OnAim(InputValue value)
{
aim = value.isPressed;
}

を追加すればいいっぽい。

ここに追加しました。

unity 新しい入力システム new inputsystem

④Aim.csを書き換える

スクリプトをこれに書き換えればOK。

starterAssetsInputs.aimからtrueが返ってくれば(ボタンが押されれば)アニメーターコントローラーのAim変数をtrueに、そうでなければfalseに。

using UnityEngine;
using StarterAssets;

public class Aim : MonoBehaviour
{
    public Animator animator;
    private ThirdPersonController thirdPersonController;
    private StarterAssetsInputs starterAssetsInputs;

    void Start()
    {
        thirdPersonController = GetComponent<ThirdPersonController>();
        starterAssetsInputs = GetComponent<StarterAssetsInputs>();
    }

    void Update()
    {
        if (starterAssetsInputs.aim)
        {
            animator.SetBool("Aim", true);
            thirdPersonController.MoveSpeed = 0f;
        }
        else
        {
            animator.SetBool("Aim", false);
            thirdPersonController.MoveSpeed = 2.0f;
        }
    }
}

これで動いた!

これで無事動きましたね。

こんな感じで設定していけば良いのかぁ。

疑問:コンフィグでキー入力とコントローラー入力を手動で切り替えるゲームもあるけど、あれはメリットがあるのか?

Unityの新しい入力システムを使うと、Aimに設定したキーやボタンを押せばいいから、スクリプトではアクションだけ指定すればいい。

しかしゲームによってはコンフィグで手動でキー入力かコントローラーかを切り替えるようになってたりするけど、これってメリットがあるのだろうか?

だいたい自動で検知して切り替えてくれるゲームのほうが多いような気がするけど。

ちょっとChatGPT氏に聞いてみます。

unity 新しい入力システム new inputsystem

神部まゆみ
神部まゆみ

ありがとうございます。 これをちゃんと設定すればキー入力でもコントローラーでも動くと思いますが、ゲームによってはコンフィグでキー入力とコントローラー入力の切り替え設定があったりします。自動で入力を検知して自動で切り替えてくれるゲームも多いですが、ゲーム内部的にはキー入力の時はコントローラー入力を受け付けない、などしたほうが処理が速くなるなどのメリットがあるのでしょうか?

ChatGPT
ChatGPT

お、そこ気になるよね。実際に書いてると「両方の入力受け付けてて重くならんの?」ってちょっと不安になるやつ。
結論から言うと――

🟣基本的には “両方同時に有効でも性能ペナルティはほぼゼロ”

気にしなくて大丈夫なレベル。
でも、切り替え制を入れたくなる理由は「性能」より UI/挙動の整合性管理のしやすさ の方が大きいよ。

✨じゃあ、なんでゲームは「入力切り替え」を用意するの?

■1. UI 表示を正しく切り替えるため

例:

  • 「Press E」⇔「Press X(ゲームパッド)」
  • ボタン画像の差し替え
  • チュートリアル表示

UI が毎フレーム両方見てると、
コントローラー触った瞬間に UI がチラチラ切り替わるのが嫌だから、
“入力モード”をラッチして制御してるパターンが多いよ。


■2. 想定外の入力を無視したいから

一部のゲームでは…

  • コントローラーで遊んでるのに
    横でマウス触った人の動きが入力されてキャラが変な方向に向く
  • PC 版の FPS だと「マウスの視点だけON/他OFF」が安全

みたいな事故を防ぐため、
内部的に「今はゲームパッドモード!」みたいに固定することがある。


■3. 特殊環境ではパフォーマンスへの配慮がある

高負荷ゲーム + 古いハード では、ほんの少しだけ影響があることもある。

とはいえ、
Unity の 新 Input System の入力スキャンは非常に軽いので
PC・PS・Xbox・Switch の現行世代じゃほぼ無視してOK。

「キーボードとパッド両方チェックするだけで重くなる」
みたいなことは基本ない。


🟣じゃあ “切り替え機能” があるゲームの目的は?

ほぼ UI/操作性のための品質向上。
パフォーマンス目的の場合は超レア。

特にコンフィグで

  • 「キーボード&マウスのみ」
  • 「コントローラーのみ」
    を選べるやつは、
    “ユーザーが意図しない入力で操作が乱れないように”
    という意味合いが強いよ。

🟣Unity の新 Input System 的にはどう?

新 Input System では、
コンパイル済みの InputAction は非常に軽く、ほぼタダで両方読める
ってイメージでOK。

もし切り替えしたくなったら
PlayerInput.SwitchCurrentControlScheme()
を呼ぶだけで制御できる。


✨まとめ

  • 両方の入力を同時に受け付けても性能的なデメリットはほぼゼロ
  • ゲームが切り替え機能を持つ主要理由はパフォーマンスでなく
    UI 表示の整合性 & 意図しない操作の防止
  • Unity 新 Input System の入力処理は超軽量なので気にしなくてOK

へぇ、Input Systemは軽いから、特にキー入力とコントローラー入力の切り替え表示とかは気にしなくていいみたい。

まぁ個人製作のゲームくらいなら最初に操作方法が表示されるだけみたいなのが多いからそれで良いのかな。

一応ユーザーが混乱しないために、ボタン表示のUIを切り替えるためにって感じかな?

おわりに

手軽に新インプットシステムに対応できて良かった。

これなら「話す」「調べる」とかを設定しておいて入力検知できるから旧システムよりラクかな。

ちょっとこれでこれまでのコードを書き直してみます。

また何かあれば追記します(*^_^*)

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