走り始めのゲーム開発あれこれ

【Unity】よく分からないけどInputSystemを最低限使ってみる

色々やってはいたのですがいかんせんブログを書くとかいう習性はこれっぽっちも持ち合わせていないため、気付けば最終更新(初投稿)から数か月...
今回ふと思いつきまた備忘録的に書いていこうと思います。


いつもUnityで新しいプロジェクトを作る際にプレーヤーキャラクターを便利なStandardAssetsさんに頼っていたのですが、
「いい加減一から自分で作ったほうがいいのでは?」
と思ってお世話になっている方に「これキャラクターって毎回アセットに頼ってるんですけどやっぱり自作したほうがいいですか?」と聞いたところ、実はキー入力の仕組みが従来のものから新しい仕組み(InputSystem)に変わりつつあるという予想外の返答が。


ならば試しに使ってみようじゃないかということで手を付け始めたものの...
素人にはさっぱりわからん!!





というわけで今回は

ちゃんと理解してないけど取り合えず新しい入力システム「InputSystem」を一から(?)書いて使ってみる。
※素人が素人なりに頑張って解釈して「こんな感じか?あんな感じか?」と試行錯誤して何とか動くようにした道のりを書いたものです。間違った解釈や非効率なやり方である可能性があるためあんまりそのまま鵜呑みにはしないでください

まずInputSystemをインストールする必要がありますがそれは色々な記事にかかれていますので割愛させていただきます。


色々なやり方があるようなので今回紹介するのもあくまで一例という形で見て頂ければと思います。また、
「おめぇまだそんなふるいやりかたしてんのかぁ(孫悟空風)」
という方が居ましたら是非コメント等で教えて頂けると泣いて喜びます。

それでは早速やり方です。

準備編

まず動かしたいPlayerとなるゲームオブジェクトを用意します。
その後「Player Input」というものを探しAddCompornentします。
そして追加されたPlayer Inputの中の「CreatAction」をクリックしなんかようわからんものを好きな場所に保存します。
そしてBehaviorを「InvokeUnityEvents」に変更します。※動画ではやり忘れてます。

f:id:kingusuraimudayo:20211227121507g:plain

以降はこの追加されたようわからんものを使って機能を追加していくことになります。

実装編「キーボード」

まずは基本のWASDから実装してみたいと思います。
その前に先ほど作ったPlayerとなるゲームオブジェクトにスクリプトを付け、リジッドボディの実装等いつもやる下準備を済ませておきましょう。
それではまずInputSystem側の設定から行きたいと思います。先ほど作ったなんかようわからんもの(以下InputActionsと呼びます)をクリックしましょう。

そうすると下のような画面が出ると思います。

f:id:kingusuraimudayo:20210813193528p:plain

この画面の画面上中央のActionsという部分の右側にある(+)マークをクリックします。そうすると新しいアクションが追加されるので試しにTestActionsとしたいと思います。

f:id:kingusuraimudayo:20211227132751g:plain

そしてTestActionsのProperties欄にあるActionType(画面右上)の項目を「ActionType:値」「ControlType:Vector2」にします。この辺の詳しい仕組み(自己解釈)は後々説明します。
今度はTestActions横の(+)から「Add2DVectorComposite」をクリック、出て来たUp,Down,Left,RightにWASDを割り振っていきます。

f:id:kingusuraimudayo:20211227140708g:plain

これでInputActions側の設定はひとまず完了です。

次にPlayerManager(プレイヤーに付けたスクリプト)に以下のメソッドを追記しましょう。

using UnityEngine.InputSystem;

~~略~~

    public void TestMove(InputAction.CallbackContext context)
    {
        Debug.Log(context.ReadValue<Vector2>());
    }

最後にインスペクターで設定を行ったら完成です。
エディター画面に戻っていただき、ヒエラルキーからプレイヤーを選択。PlayerInputのコンポーネントを開き、イベントタブ、Playerタブの順に開きます。
そうするとInputActionsに作ったActionが一覧で表示されてるので先ほど作ったTestActionsを探し出し(+)マークをクリック。
プレイヤーゲームオブジェクトをアタッチして一覧から先ほど記述して作った「TestMove」を選択。

f:id:kingusuraimudayo:20211227150015g:plain

これで一度ゲームを起動してみるとWASDでVector2の値が返されてるのがコンソールを見ることでわかると思います。
後はこれを利用して

    void Update()
    {
        MoveDirection = MoveDirectionCash;      //InputSystemを利用した座標づくりの更新タイミングがキーボード入力があったタイミングな為一度キャッシュしないとローカル座標に変換済みのを物をさらに変換するという循環に陥る。
        MoveDirection = transform.TransformDirection(MoveDirection);
        character.Move(MoveDirection * Movespeed * Time.deltaTime);

    public void TestMove(InputAction.CallbackContext context)
    {
        MoveDirectionCash = new Vector3(context.ReadValue<Vector2>().x, 0, context.ReadValue<Vector2>().y);
    }

といった感じで上手く使ってあげれば動くと思います。

実装編「マウス」他

自分自身最初のとっかかりがめちゃくちゃ時間かかったのでなるべく丁寧に説明しようとしたら結構長くなってしまいましたので他の項目は別の記事で書かせて頂こうと思います。

他にも

  • マウス、単体のボタン等の場合
  • InputSystemが呼び出されるタイミング及び呼び出しタイミングの制御
  • コントローラー等別の機器を使う場合(勉強中)

等書きたいことはあるのでいずれ記事にさせて頂けたらと思います。特に呼び出しタイミング関係は情報が少ないのもあってわかるまでに時間がかかってしまったものなので遠くないうちに作ると思います。


要望ご意見等こちらへ:yukiyama8810@gmail.com 一緒に開発してくれる方も常に募集中です