見出し画像

Unityで英語の変数名をインスペクタで日本語表示にする方法

はじめに

これを

英語で表示

こうしたい

日本語で表示

Unityは変数名に日本語が使えるので、日本語で変数名を宣言すればそのままインスペクタでも日本語で表示されます!オワリ
…じゃなくてですね
もちろんそれで気にならん人はそれでもOKなんでこの先の記事を読む必要はないんですが、私のように変数名はちゃんと英語で書きたいけどインスペクタに表示される変数名は日本語でわかりやすくしたい!
という人のための記事です


早速ガッカリさせるようですが、そんな設定はデフォルトではありません
Unityは当然海外のソフトなので基本英語だし、英語圏の人は変数名が英語でも問題なくて置き換える必要もないから気にならんのだと思います
まぁそもそもプログラム自体英語だし
でも変数名を「~Amount」とか「~Multiplier」とかもっと馴染みのない英単語にしてると一瞬考えてしまうし、久しぶりに見たら「なんだっけ?」みたいな事になるんですよ
日本人としては「~の量」「~の乗数」のように表示できたらわかりやすいですよね
私自身普段は[Header]アトリビュートを使ってます
[Header]アトリビュートとは元々ある機能で、プログラムの変数名の前に[Header("ここにタイトル")]と書けばインスペクタの変数名の上に「ここにタイトル」とつける事ができる機能です
こんな感じ

もちろんこれでもいいです
ただ、二行使うので変数が多くなればなるほど当然高さも増えるし、
▼名前
Name

のように同じ事を二度説明する感じになってしまいます
じゃあこの「Name」部分を「名前」に置き換えられたら便利だと思いませんか?
パッと思いつく方法は3つ

  1. 変数名を日本語で書く

  2. Odinのようなアセットを使う

  3. 自分でカスタムエディタを用意する

順に説明します


1:変数名を日本語で書く

これが一番カンタンです
プログラムはもちろん英語でないとダメですが、変数名は日本語でも余裕で扱え、ビルドもちゃんと通ります
もっと言うとクラス名や関数名も日本語が使えたりします
コードに日本語が混じっても気にならない人は全然それでいいと思います
じゃあそれでいいや、という方はこちらで終了となります
あざした😇

メリット:すぐ使えるしわかりやすい
デメリット:コードに日本語が混じる


2:Odinのようなアセットを使う

Odin(正式名称:Odin Inspector and Serializer)というのは有名なアセットで、インスペクタをめちゃくちゃ使いやすくして色々できるようにするアセットです
なので変数名を他の文字に置き換えるなんかも当然対応してます
それどころか100種類以上の機能があり、かゆいところに手が届きまくるという超絶便利仕様です
ただし、これだけ機能があるという事は当然有料でしかも結構高いです
それでもいい!こういうのが欲しかった!という方はぜひ使ってみてください
使い方は公式ドキュメントや色んな開発ブログで解説されてると思います
ちなみにOdinが一番有名なんじゃないかと思いますが、もしかしたら他にもあるかもしれません

メリット:インスペクタの事ならたいがい何でもできる
デメリット:有料でお高め、機能が豊富過ぎて使い切れないかも、容量食う


3:自分でカスタムエディタを用意する

正直これが書きたかっただけです
私自身変数名に日本語が混じるのがイヤで、Odinも持ってはいるんですが機能が豊富過ぎて一部の機能しか使わないのにわざわざ導入してプロジェクトを重くするのもなぁと思っていました
Unityに限らずですが極力バニラな状態を好む性格というのもあります
そこで思いついたのが「じゃあ自分でそういうカスタムエディタを作ればいいのでは?🤔」でした
前置きが長くなったので早速コードを貼ります
▼2024.01.20以前に使われた方に
エディタ上のみに制限するのを忘れててビルドでエラーが出てました
また、かなりコードを短くして問題点や処理を改善しました
エディタ上だけで機能するようにしつつ、そのまま差し替えるだけで使えるようにしたので差し替えて使って下さい
失礼しました🙏🏻

/*
 * インスペクタに表示される変数名を好きな文字に置き換えるカスタムエディタ
 * CustomLabelAttribute.cs : Ver. 1.0.3
 * Written by Takashi Sowa with ChatGPT
 * ▼使い方:以下のように記述すればインスペクタに表示される「variable」が「変数名」に置き換わる
 * [CustomLabel("変数名")]
 * public int variable = 0;//[SerializeField]でも利用可
*/

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 #if  UNITY_EDITOR
using UnityEditor;
 #endif 

public class CustomLabelAttribute : PropertyAttribute{
	public readonly GUIContent Label;//GUIContent型に変更
	public CustomLabelAttribute(string label){
		Label = new GUIContent(label);//stringからGUIContentに変換
	}
}

 #if  UNITY_EDITOR
//カスタムアトリビュートに関連づけられたプロパティドロワーの宣言
[CustomPropertyDrawer(typeof(CustomLabelAttribute))]
public class CustomLabelAttributeDrawer : PropertyDrawer{
	//エディタ上でカスタムプロパティを描画
	public override void OnGUI(Rect position, SerializedProperty property, GUIContent label){
		//カスタムアトリビュートをCustomLabelAttributeとして取得
		var newLabel = attribute as CustomLabelAttribute;
		//カスタムアトリビュートのラベルをプロパティのラベルに設定
		label = newLabel.Label;
		//エディタ上にプロパティを描画
		EditorGUI.PropertyField(position, property, label, true);
	}

	//エディタ上でプロパティの高さを取得
	public override float GetPropertyHeight(SerializedProperty property, GUIContent label){
		//プロパティの高さを取得
		return EditorGUI.GetPropertyHeight(property, true);
	}
}
 #endif 

使い方は、
1:上記のコードを右上のコピーマークからコピー
2:空の新規テキストファイルにペースト
3:「CustomLabelAttribute.cs」というファイル名で保存
4:プロジェクトのどこでもいい適当な場所に置く
そして変数名を書く時に[CustomLabel]アトリビュートを使って以下のように書くだけです

[CustomLabel("変数名")]
public int variable = 0;//[SerializeField]でも利用可

書き方は[Header]アトリビュートと同様です
この例で言えば「variable」がインスペクタでは「変数名」に置き換わって日本語で表示されます
[CustomLabel]アトリビュートはスニペット登録して一発で出せるようにしとけば楽です
上記はpublicですが、[SerializeField]でも問題なく使えます
例えばこう書けば

[CustomLabel("操作可不可切り替え")]
[SerializeField]
bool canControl = false;

[CustomLabel("名前")]
public string name = default;

[CustomLabel("最大HP")]
public int maxHP = 100;

[CustomLabel("最大スタミナ")]
public int maxStamina = 100;

[CustomLabel("歩行速度")]
public float walkSpeed = 1.0f;

[CustomLabel("しゃがみ速度")]
public float crouchSpeed = 2.0f;

[CustomLabel("ダッシュ速度")]
public float runSpeed = 3.0f;

こう表示されます

もしグループ化したい時は[Header]アトリビュートもうまく使ってこう書けば

[CustomLabel("操作可不可切り替え")]
[SerializeField] bool canControl = false;

[Header("▼ステータス")]
[CustomLabel("名前")] public string name = default;
[CustomLabel("最大HP")] public int maxHP = 100;
[CustomLabel("最大スタミナ")] public int maxStamina = 100;

[Header("▼移動速度")]
[CustomLabel("歩行速度")] public float walkSpeed = 1.0f;
[CustomLabel("しゃがみ速度")] public float crouchSpeed = 2.0f;
[CustomLabel("ダッシュ速度")] public float runSpeed = 3.0f;

こう表示されます

わかりやすくなりましたね
ちなみに見ての通りアトリビュートは二行に分けなくても一行にまとめて書く事もできます

メリット:英語変数名とインスペクタ表示を分けられる、ファイル1つでOK
デメリット:自分でしか試してないのでご自身の責任でご利用ください😅

▼継承で利用する場合の追記
継承元に「SerializeField」で変数を定義すると継承先のインスペクタでその変数が表示されなくなりますが「protected」をつければ問題ありません
<例>
[SerializeField] int age = 10;//これだと継承先のインスペクタに出ない
[SerializeField] protected int age = 10;//継承先でも問題なく表示


おわりに

いかがでしたでしょうか?
別に自分は英語変数名でもいいという方には意味がないですが、そもそもそんな人はこの記事を読んでないと思いますし、私と同じような事を考えていた人にはわりと有効な気がします
もし気に入って使っていただけたら嬉しいです😇


おまけ

元々Unityで使えるアトリビュートは[Header]アトリビュート以外にもたくさんあります
有名所で言うと
intやfloatを一定の範囲内でしか使えないようにする為のRange
stringを複数行入力できるようにするTextArea
変数名にマウスオーバーすればコメントが出せるTooltipAttribute
等々たくさんあります
興味のある方は調べてみてください😇
私の作ったゲーム「44 Minutes in Nightmare」もよろしくです!
某忍者や某Bro.やその他有名ゲーム実況者にも実況されたアレです!


この記事が気に入ったらサポートをしてみませんか?