🎁

【Unity】キーコンフィグを実装する

2024/03/05に公開

現在、友人と趣味でゲーム開発をしています。
その中でキーコンフィグ(特定の機能に割り当てられたキーを変更すること)を実装する機会があったので、備忘録として実装手法を書いておきます。

環境

  • Windows 11 Home
  • Unity 2021.3.0f1

実装例

JSONファイル
configuration.json
{
    "moveUp": "w",
    "moveDown": "s",
    "moveLeft": "a",
    "moveRight": "d"
  }
  

ポイント

  • 読み込むファイルには他にもXML, YAML, バイナリなども使えるそうです。
キーバインド管理用クラス
KeyBindings.cs
using System;
using UnityEngine;

[Serializable]
public class KeyBindings
{
    public string moveUp;
    public string moveDown;
    public string moveLeft;
    public string moveRight;
}

ポイント

  • [Serializable]宣言をすることで、オブジェクトが外部ファイルを読み込んで変数に値をマッピングできる(=シリアライズできる)ようになります。
キーマップを行う部分
using UnityEngine;
using System.IO;

public class BasicMoving : MonoBehaviour
{
    public float moveSpeed = 0.5f; // 移動速度
    private KeyBindings keyBindings;

    void Start(){
        string configPath = Path.Combine(Application.dataPath, "configuration.json");
        string jsonFile = File.ReadAllText(configPath);
        keyBindings = JsonUtility.FromJson<KeyBindings>(jsonFile);
    }

    void Update(){
        Vector3 moveDirection = Vector3.zero;
        if (Input.GetKey(keyBindings.moveLeft)){
            // 左向き
            moveDirection.x = -1;
        }
        if (Input.GetKey(keyBindings.moveRight)){
            // 右向き
            moveDirection.x = 1;
        }
        if (Input.GetKey(keyBindings.moveUp)){
            // 後ろ向き
            moveDirection.z = 1;
        }
        if(Input.GetKey(keyBindings.moveDown)){
            moveDirection.z = -1;
        }
        transform.Translate(moveDirection.normalized * moveSpeed * Time.deltaTime, Space.World);
    }
}

ポイント

    void Start(){
        string configPath = Path.Combine(Application.dataPath, "configuration.json");
        string jsonFile = File.ReadAllText(configPath);
        keyBindings = JsonUtility.FromJson<KeyBindings>(jsonFile);
    }
  • File.ReadAllText: 指定したファイルのテキストをすべて含んだ文字列が返ってくる
  • JsonUtility.FromJson: JSONからオブジェクトファイルを作成する
    • UnityEngine.Object派生のクラス(MonoBehaviourなど)は使えず、プレーンなクラスに対してのみ実行可

オーディオ設定や言語設定なども含める場合でも、ラッパーを作って使いまわせそうです。

参考

Discussion