Unityで英語の変数名をインスペクタで日本語表示にする方法
はじめに
これを
こうしたい
Unityは変数名に日本語が使えるので、日本語で変数名を宣言すればそのままインスペクタでも日本語で表示されます!オワリ
…じゃなくてですね
もちろんそれで気にならん人はそれでもOKなんでこの先の記事を読む必要はないんですが、私のように変数名はちゃんと英語で書きたいけどインスペクタに表示される変数名は日本語でわかりやすくしたい!
という人のための記事です
早速ガッカリさせるようですが、そんな設定はデフォルトではありません
Unityは当然海外のソフトなので基本英語だし、英語圏の人は変数名が英語でも問題なくて置き換える必要もないから気にならんのだと思います
まぁそもそもプログラム自体英語だし
でも変数名を「~Amount」とか「~Multiplier」とかもっと馴染みのない英単語にしてると一瞬考えてしまうし、久しぶりに見たら「なんだっけ?」みたいな事になるんですよ
日本人としては「~の量」「~の乗数」のように表示できたらわかりやすいですよね
私自身普段は[Header]アトリビュートを使ってます
[Header]アトリビュートとは元々ある機能で、プログラムの変数名の前に[Header("ここにタイトル")]と書けばインスペクタの変数名の上に「ここにタイトル」とつける事ができる機能です
こんな感じ
もちろんこれでもいいです
ただ、二行使うので変数が多くなればなるほど当然高さも増えるし、
▼名前
Name
のように同じ事を二度説明する感じになってしまいます
じゃあこの「Name」部分を「名前」に置き換えられたら便利だと思いませんか?
パッと思いつく方法は3つ
変数名を日本語で書く
Odinのようなアセットを使う
自分でカスタムエディタを用意する
順に説明します
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;
こう表示されます
わかりやすくなりましたね
ちなみに見ての通りアトリビュートは二行に分けなくても一行にまとめて書く事もできます
おわりに
いかがでしたでしょうか?
別に自分は英語変数名でもいいという方には意味がないですが、そもそもそんな人はこの記事を読んでないと思いますし、私と同じような事を考えていた人にはわりと有効な気がします
もし気に入って使っていただけたら嬉しいです😇
おまけ
元々Unityで使えるアトリビュートは[Header]アトリビュート以外にもたくさんあります
有名所で言うと
intやfloatを一定の範囲内でしか使えないようにする為のRange、
stringを複数行入力できるようにするTextArea、
変数名にマウスオーバーすればコメントが出せるTooltipAttribute、
等々たくさんあります
興味のある方は調べてみてください😇
私の作ったゲーム「44 Minutes in Nightmare」もよろしくです!
某忍者や某Bro.やその他有名ゲーム実況者にも実況されたアレです!
この記事が気に入ったらサポートをしてみませんか?