0:00:00.308,0:00:03.558 Unity ではカスタムインスペクターを作成して 0:00:03.558,0:00:05.558 スクリプト中の どのデータを表示するか 0:00:05.558,0:00:07.558 そしてエディター上でどう表示するかを制御できます 0:00:08.846,0:00:11.547 エディターを拡張できるということは 0:00:11.547,0:00:14.507 スクリプトがより強力かつ柔軟に使えるということで 0:00:14.507,0:00:16.507 ひいてはワークフローの改良にもつながります 0:00:17.997,0:00:19.997 たとえばレベルアップシステムを作っているとしましょう 0:00:19.997,0:00:23.729 これは経験値を 750 ポイント獲得すると 0:00:23.729,0:00:25.224 レベルがひとつ上がるシステムであるとします 0:00:26.191,0:00:29.140 レベルが低いうちは計算も簡単ですが 0:00:29.140,0:00:31.699 高レベルになるにつれてだんだんと 0:00:31.699,0:00:33.699 計算がめんどくさくなってきます 0:00:33.699,0:00:35.851 そこでカスタムインスペクターを 0:00:35.851,0:00:37.851 使って この作業を簡単にしてみましょう 0:00:38.947,0:00:40.947 ここに LevelScript というスクリプトがあります 0:00:41.724,0:00:43.724 このスクリプトが先ほどの経験値ベースの 0:00:43.724,0:00:45.724 レベルアップシステムです 0:00:46.723,0:00:50.312 スクリプトで最初に目に入るのが experience 変数ですね 0:00:50.312,0:00:52.312 この関数はキャラクターが獲得した 0:00:52.312,0:00:54.312 経験値の累計を格納します 0:00:55.352,0:00:57.921 次に Level というプロパティがあります 0:00:58.504,0:01:00.504 このプロパティは 現在の経験値を取り 0:01:00.504,0:01:03.372 対応するレベルを返します 0:01:03.941,0:01:05.941 プロパティの詳細については 0:01:05.941,0:01:07.941 下記リンク先にあるプロパティのレッスンをご覧ください 0:01:10.216,0:01:12.913 さて空っぽのゲームオブジェクトを配置して 0:01:12.913,0:01:14.705 それに LevelScript をアタッチしてみました 0:01:15.385,0:01:17.385 Experience(経験値)プロパティがインスペクターに 0:01:17.385,0:01:19.385 表示されているのが見えますね 0:01:20.092,0:01:23.522 経験値が 0 ならレベルを計算するのも簡単ですが 0:01:23.522,0:01:26.982 49865 だったらどうでしょう? 0:01:28.313,0:01:30.313 ここでインスペクターをカスタマイズして 0:01:30.313,0:01:32.313 レベルを表示してみましょう 0:01:33.020,0:01:35.020 インスペクターをカスタマイズするにはまずエディターの 0:01:35.020,0:01:37.636 スクリプトを格納するフォルダを作成する必要があります 0:01:38.205,0:01:40.205 Unity に認識させるためこのフォルダの名前は 0:01:40.205,0:01:42.205 Editor としてください 0:01:42.649,0:01:45.328 そしてフォルダ内に新規スクリプトを作成します 0:01:46.119,0:01:48.119 このスクリプトにカスタムインスペクターを含めます 0:01:49.588,0:01:51.318 名前は自由に付けられますが 0:01:51.318,0:01:53.318 今回は内容に沿って 0:01:53.318,0:01:55.570 LevelScriptEditor としましょう 0:01:58.751,0:02:01.363 それではこの LevelScriptEditor に 0:02:01.363,0:02:03.476 カスタムインスペクターを書いていきます 0:02:05.127,0:02:08.169 エディター固有のコードを書くときはまず 0:02:08.169,0:02:10.169 UnityEditor 名前空間を使うことを 0:02:10.169,0:02:12.169 宣言しなくてはいけません 0:02:12.925,0:02:14.925 名前空間の詳細については 0:02:14.925,0:02:17.527 下記リンク先にある名前空間のレッスンをご覧ください 0:02:19.202,0:02:21.202 次に継承元を MonoBehaviour から 0:02:21.202,0:02:23.202 Editor に変更します 0:02:23.202,0:02:26.301 エディタの拡張は基本的にこうして行います 0:02:27.900,0:02:29.900 継承の詳細については 0:02:29.900,0:02:32.424 下記リンク先にある継承のレッスンをご覧ください 0:02:34.081,0:02:36.081 さてここからは カスタムインスペクターに 0:02:36.081,0:02:38.081 属性を与えて どのスクリプトを 0:02:38.081,0:02:40.081 カスタマイズしているのかを示します 0:02:41.133,0:02:43.133 構文はまず開き角カッコ 続けて 0:02:43.133,0:02:45.133 キーワードCustomEditor 0:02:45.133,0:02:48.296 そしてカッコ 0:02:49.643,0:02:52.737 カッコの中にはキーワード 0:02:52.737,0:02:55.223 typeOf で型を指定します 0:02:55.962,0:02:58.527 そしてその中にさらにカッコの対を作り 0:02:58.527,0:03:00.527 スクリプトの名前を入力します 0:03:01.579,0:03:03.579 この例では ご覧のとおり 0:03:03.579,0:03:06.521 カスタマイズするのは LevelScript です 0:03:08.517,0:03:11.397 そして行を 閉じ角カッコで締めます 0:03:13.031,0:03:15.719 続いて LevelScriptEditor クラスの内部に 0:03:15.719,0:03:19.446 メソッド public override void OnInspectorGUI 0:03:19.446,0:03:21.446 を作ります 0:03:21.870,0:03:23.870 このメソッドはインスペクターが Unity 上で描画される際に 0:03:23.862,0:03:25.862 毎回呼び出されます 0:03:27.461,0:03:29.461 override キーワードの 0:03:29.461,0:03:30.940 挙動の詳細については 0:03:30.940,0:03:33.527 下記リンク先にあるオーバーライドのレッスンをご覧ください 0:03:36.643,0:03:38.643 これで LevelScript のインスペクターが 0:03:38.643,0:03:40.643 変更されました 0:03:41.269,0:03:43.269 この状態で Unity に戻ると 0:03:43.269,0:03:45.269 スクリプトのプロパティがひとつも 0:03:45.269,0:03:47.269 インスペクタービューに表示されないのがわかります 0:03:49.033,0:03:51.033 これではぜんぜん便利でないので 0:03:51.033,0:03:53.295 カスタマイズを進めていきましょう 0:03:56.544,0:03:58.544 LevelScriptEditor に戻って 0:03:58.813,0:04:01.503 インスペクターで表示するフィールドを作ってみます 0:04:02.668,0:04:05.893 OnInspectorGUI メソッドの内部には自動的に LevelScript 0:04:05.893,0:04:09.505 オブジェクトへの参照である target が含まれます 0:04:11.051,0:04:13.051 しかしこれは適切な型の変数に 0:04:13.051,0:04:15.051 キャストするまでは使えません 0:04:16.077,0:04:18.077 なのでまず myLevelScript という 0:04:18.077,0:04:21.346 LevelScript 変数を作り 0:04:22.006,0:04:25.256 継承した変数 target とイコールでつなぎます 0:04:27.524,0:04:29.524 そして最後に target 変数を 0:04:29.524,0:04:31.524 LevelScript 変数としてキャストします 0:04:31.524,0:04:35.127 これはカッコで囲んだ LevelScript を隣に書いて表現します 0:04:37.769,0:04:40.493 さてここでインスペクターに表示したい情報は 0:04:41.064,0:04:43.064 キャラクターの獲得した経験値合計と 0:04:43.412,0:04:45.412 現在のレベルの 2 つです 0:04:46.507,0:04:49.038 インスペクターに int フィールドを作るときは 0:04:49.038,0:04:51.746 EditorGUILayout クラスを使います 0:04:52.859,0:04:55.544 構文は 最初にクラス名 0:04:55.544,0:04:58.266 EditorGUILayout 続けて.(ピリオド) 0:04:58.796,0:05:00.796 そしてメソッド IntField 0:05:01.378,0:05:03.378 最後にカッコ 0:05:05.594,0:05:09.103 カッコの中にはフィールド名と 0:05:09.103,0:05:10.634 フィールドの値を指定します 0:05:11.103,0:05:14.736 今回はフィールド名に Experience(経験値) 0:05:14.736,0:05:17.924 値に myLevelScript の experience 変数の値を 0:05:17.924,0:05:19.924 指定します 0:05:22.470,0:05:24.470 このフィールドに experience 変数への書き込みも 0:05:24.470,0:05:27.734 させたいので 行全体を myLevelScript.experience と 0:05:27.734,0:05:30.688 イコールでつなぎます 0:05:32.930,0:05:35.545 Level フィールドもだいたい同じように処理していきます 0:05:36.405,0:05:38.405 ただし今回は 0:05:38.405,0:05:42.484 EditorGUILayout クラスの LabelField メソッドを使います 0:05:43.689,0:05:45.951 ラベルは読み取り専用なので 0:05:45.951,0:05:47.951 ユーザーがインスペクター上でレベルを 0:05:47.951,0:05:50.371 手動入力してしまうことは起きません 0:05:52.326,0:05:55.058 LabelField メソッドのカッコ内には 0:05:55.623,0:05:57.623 Level という名前と 0:05:57.623,0:06:00.532 値 myLevelScript.Level を指定します 0:06:02.748,0:06:06.027 ただしラベルのコントロールは文字列である必要があるので 0:06:06.027,0:06:08.027 ここで Level プロパティに対して 0:06:08.027,0:06:10.027 ToString メソッドを使い 0:06:10.027,0:06:11.320 文字列に変換します 0:06:13.009,0:06:15.762 これでカスタムインスペクターは完成です 0:06:16.735,0:06:19.554 さっそく Unity に戻って確認してみましょう 0:06:22.500,0:06:24.500 ご覧のとおり インスペクターには 0:06:24.500,0:06:28.923 経験値が 49865 のとき 0:06:28.923,0:06:30.923 レベルは 66 と表示されました 0:06:32.296,0:06:34.296 そして この経験値のフィールドで 0:06:34.296,0:06:36.296 値を変更していくと 0:06:36.296,0:06:38.729 自動的にレベルの値も変更されていきます 0:06:42.154,0:06:44.154 このようにスクリプト向けにエディターを 0:06:44.675,0:06:47.268 カスタマイズすると 手動では面倒くさい 0:06:47.268,0:06:49.784 さまざまな事柄が自動化できるわけです