もりもりゲーム制作ブログ

それほどもりもりしてません。Unityの忘備録的ブログ。

【Unity】で列挙型を使ってエディタで選択するやつでInputManager楽にしたい

キー入力やゲームパッド入力、色々コントローラーはあるけど、

  • 正直毎回スクリプトの記述を書き換えるのはだるい・・・・
  • かといって数字とか文字列でモードみたいに判別したりもだるい・・・
  • エディター側のInputSettingsに変更を加えるのなんかもっとだるい・・・

そんなあなたの悩みを解決するかもしれない列挙型!!でそれっぽいことをします。

f:id:monimoni114514:20190131050007p:plain
こんなふうに選べる

やりたいこと

  • エディターのInspectorから入力の方法を変更したい
  • 文字列や数字のように決まった書き方以外で変更したい
  • セレクトボックスみたいに選択したい
  • 選んだだけでif文などの記述内容も対応させたい

列挙型ってそもそもどう使うの?

列挙型はclassの前に記述するとわかりやすいっぽい・・・かも。
書き方はclassの代わりにenumを記述してください。

今回は入力系をまとめたスクリプト、InputManager.csで列挙型を使っていきます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//ここを追加
public enum InputType
{
    Abutton,
    Bbutton,
}
//ここまで追加
public class InputManager : MonoBehaviour
{
}

これでInputTypeという列挙型ができました。
わざわざpublicにしてInputManagerクラス外に記述したのは後々ほかのスクリプトなどから入力法を受け取りたいときがあるかもしれないのでそうしました。
InputManagerを入力系をまとめたスクリプトとしているので、本来これはよくない気もします。
Unity1Weekなどではいつコードが密になるかわからないのでたくさんカバーできるのでこっちにしてます(言い訳)

列挙型を実際に変数として扱ってみましょう。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public enum InputType
{
    Abutton,
    Bbutton,
}
public class InputManager : MonoBehaviour
{
    //列挙型InputTypeの変数inputType;
    InputType inputType;
    
    void Start()
    {
        //列挙型.内部の値の形で代入
        public inputType = InputType.Abutton;
    }
    void Update()
    {
        //inputTypeの値がAbuttonならば文字列を出力
        if(inputType == InputType.Abutton)
            Debug.Log("Pushed A!");
    }
}

変数inputTypeはエディタから値を選択するためpublicにしています。
列挙型の変数をpublic、もしくは[SerializeField]することでエディタ上では一覧選択ができるようになってます。すごい!

列挙型の内の値は列挙型名.値名の形で得られます。
とりあえず列挙型の値でif文を使うことはできました。

次はInput系の値(例:Aキー入力👉KeyCode.Spase)を列挙型にあてはめていきます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public enum InputType
{
    Abutton = KeyCode.A,
    Bbutton = KeyCode.B,
}
public class InputManager : MonoBehaviour
{
    public InputType inputType;
    
    void Start()
    {
        //エディタから入力を選ぶためコメントアウト
        //inputType = InputType.Abutton;
    }
    void Update()
    {
        //入力がAbuttonならば文字列を出力
        if(Input.GetKeyDown((KeyCode)inputType))
            Debug.Log("Pushed A!");
    }
}

列挙型で代入することでキー入力を対応させます。
列挙型は変数がint型で格納されているため、(KeyCode)変数名でのような形でキャスト変換する必要があります。

こんな感じでInputManagerを列挙型でエディタから制御できます!以上!

ちなみにGetAxiz系の入力を列挙型で扱うことはまだできてません!すみません!!

出来次第、この記事を更新するか新しく記事かきます・・・・