新しいInputSystemを試す~Unityと永く付き合っていくために~

これはKCS Advent Calendar2020 25日目の記事です

←24日目

2020年度KCSアドベントカレンダーの本馬場入場です。高1冬からUnityを使い続け今年はローレヴェルながらもUnity班班長。早いところスマホアプリをリリースして黄色い歓声を浴びたい 25番 ユニティハンチョー 馬体重462キロ。初出走です。


将来あの有名なコードが動かなくなるかも…

</p>
if(Input.GetKey(KeyCode.Space)){
Debug.Log("Hello World!");
}
<p>

↑Unityを始めた人は誰もが通ったであろうif(Input.GetKey)が将来的に動かなくなるかもしれない。

廃止時期はまだ未定ながらUnityは今後GetKeyやGetButtonを始めとする従来のInputManagerから2019.3で正式版になった新しい入力方式InputSystemに移行する。Unityというわがままな彼女と末永く付き合っていくには避けては通れない移行になる(はず)。現状まだ情報も少なくつい最近ver1.0になったばかりなので移行にはまだまだ時間はあると思うが、善は急げ。せっかくカレンダー書くならUnity班の他の人や後世も使えるしこれを機に面倒だけどやるか!と決意。

そもそもInputSystemって何?

Unity Japan公式が動画を上げてくれている。実装方法の解説とはちょっと違うがInputSystemの概要と簡単なデモが見られる。ここで大雑把な流れを把握してから下記のサイトを参考に実装するのが良い。

導入から設定、コードの書き方まで細かく非常に解説してくれてる神(まずはここを見ろ!)

非常に参考になる神サイト3選

次にJoystickやButtonなどのUIから操作出来るように應用する際、非常に参考になるサイト

最後にif文の中で使用する時やもう少しアクションマップの設定を知りたい時に参考なるサイト

InputSystem移行するメリットをまとめると…

従来のInputManagerの入力はゲームのフレームレートに依存していたが新しいInputSystemでは依存せず中間バッファに入力内容を保存することでより正確に入力を受け取ることができるらしい。また今までGetKeyなど入力内容で条件分けしていたのをInputActionAssetを使用してアクション単位で条件分け出来る。例えば走る動作を作る場合、従来の方法ならGetKeyかGetAxisで十字キーが操作されたとき値を変えるという実装だったものが、”走る”アクションに矢印キーやWASDなどキーやGamepadのボタンなどを事前に登録(バインド)してVector2をSendMessageして操作できる。つまりIF文で&&したり別に処理を書くことなく複数のパターンの処理を一度に… まあ見せたほうが早い

こんな感じでスマホのタッチパネル(UI On-Screen Stick / On-Screen Button)やキーボード(WASD)そしてXbox wireless controller(Left-Stick)から同時に操作できる。容量の都合でカット編集したが特殊な切り替えやアプリの再起動などはしていない。またスペースキーやCキー、XboxのA,Bボタンも反應します。

↓InputActionAssetはこんな感じで登録した

初見だと難しそうに見えるがYouTubeの動画を見ながら行えば意外とすんなり登録出来る。これ1つでGamepadからも操作できるようになると思えば余裕のよっちゃん。On(Actionsの名前)関数で呼び出すっぽい。画像ならOnMovement() OnCatch()など

</p>
 public void OnMovement(InputValue inputValue)
    {
        dx = inputValue.Get<Vector2>().x;
        dy = inputValue.Get<Vector2>().y;
    }
<p>

そうそう↓using書くの忘れてはいけない

</p>
using UnityEngine.InputSystem;
using static UnityEngine.InputSystem.InputAction;
<p>

※これ動かす前にGameObjectにPlayerInputクラス入れたりUI使う場合は従来のEventSystemをInput System UI Input Moduleに変えたりor追加しないといけないので実装する時は”この記事ではなく”神サイトを見ながらやってね♡絶対に

今までGetAxisで書いてたのでdx dyを流用してすんなり動いたがボタン入力の方で少し躓いた。何となく今までのGetKeyDownはGetKeyUpの感覚でアクションを登録したらそのアクションに.downとかつければ動くんじゃないかと思っていたが全くの見当違いでアクションを分けて設定する必要があるっぽい。

赤線で囲った部分でPress Releaseなどの設定ができる。ここでは従来のKeyUpの操作をしたかったのでRelease Onlyにしたら上手く動いた。

次にGetKeyで押しっぱなしの状態を再現する場合、float型で受け取り(動画内でも言ってるけど何故かBoolじゃない)変数を用意して代入しておく。

</p>
public void OnPower(InputValue powerInputValue)
{
    powerValue = powerInputValue.Get<float>();
}
<p>

Update関数内のif文で処理。

</p>
if (powerValue >= InputSystem.settings.defaultButtonPressPoint)
{
    Debug.Log("押されてまっせ");
}
<p>

記事を書いていて何だけど多分もっと効率的なやり方があるはず。とにかく締切的にも動くことと簡単に実装することに重きを置いた結果このようなずさんな実装になった。(動くからいいよね♥)

使ってみた感想

今までUnityを使ってきた人は最初は戸惑うけど覚えさえすれば高機能で便利!これほど簡単にXbox Wireless controllerで動かせるようになったら個人開発レベルのスマホアプリもコントローラー対應が増えて高度なアクションゲームとか出てきてインディーズゲーム業界も盛り上がりそう。CrossPlatformInput使うよりはるかに楽な気がする。これから始める人もHello Worldだけなら下記のコードで動くのでさほど難しい気もしないし情報さえ出揃えば全く問題なさそうだし初めからこっちでやりましょう。(もちろん完全に移行するまでusing…は必要になりそうだけど )

</p>
if (Keyboard.current.spaceKey.isPressed) {
    Debug.Log("Hello World!");
}
<p>

とりあえずこれから作るゲームは基本InputSystemを使って開発をしようかなと思いました。今すぐ移行する必要があるかと言われれば…ないけどいずれ移行しないダメなら今やってもいんじゃね的な。

うーんよくわからん

いると思います。そんな方はKeio Computer Societyに入って万事解決!!(元新歓担当の鏡) KCSはいつでも新規サークル員を募集しています。(慶應義塾大学生限定)

回想シーン

思い返してみれば高1の冬にUnityを付き合い始めて数年。今までもアップデートするたびに何かしら怒られることや気まぐれも多々あった。そういえば今書いてて思い出したけど自分が最初にUnityいじったときにCanvasなんてなかったような…現に最初に買った参考書はvoid OnGUI()で文字を出力してる。当然Unity Hubもなかった。ここ数年の大きな変化で印象的なものの1つ目は使用言語でJava Script(Unity Script)とBoo,C#で三股かけていたのをC# 1人に決めたこと。これは部活のOBの方から悪いこと言わないからC#でやっとけと言われたので回避。次はMonodevelop unityという何かよくわからないエディタからVisual Studioという格上彼氏に乗り換えた事件。そして今回の入力システムの切り替え。これはゲームの根幹となる入力の変更だからこれまで以上に大きな事件になるような… 振り回されるのは好きではないが以上のことから常に進化しつづける彼女と付き合っていくには我々も日々精進していかないといけなくなりそうだ…

最後に投稿が25日の予定だったためUnityを彼女と表現しクリスマスに相應しいユーモアあふれるアットホームな記事を目指していましたが投稿が遅れ若干気持ちの悪い感じの記事になってしまったことを心の底からお詫び申し上げます。

良いお年を

←24日目

Posted on: 2020年12月29日, by :