URPのSampleシーンを導入したときや 公式の出しているパーティクルパックを導入した際に、 インスペクタ上に『Readme』って出ますよね。
アレの実体が何となく気になったので探ってみました。
環境
Unity2021.2.0b16
Universal RP 12.1.0
図解
どのように実装されているのかを図にするとこんな感じになります。
ScriptableObjectで作成された Readme.asset を ReadmeEditor.cs でUnityエディタ起動時に読み込んで、インスペクタ上に表示しています。
ScriptableObjectについては下記のブログ記事がまとまっていて分かりやすいです。
Readmeの実体を探る
エディタ拡張を利用して変換されているため、ぱっと見では分かりませんがReadmeの実体はテキストデータです。
試しにエディタ拡張の部分を無効化することで、変換前のインスペクタを表示してみました(コメントアウトで無理やり無効化しました)。
左側がエディタ拡張によって変換される前のReadme.assetです。ReadmeEditor.csによって右のような表示に変換されています。
左右の画像を見比べてみると、UPと書かれたアイコンの画像はIconで、"UniversalRenderPipelineTemplete"というタイトルはTItleで、本文はSectionsの中にリスト化されたデータとして保持されているのが確認できました。
内容を書き換えてみる
特別書くことが思い浮かばなかったのでちょっとアレですが、書き換えることはできました。
起動時に表示される仕組み
起動時に毎回表示される仕組みは下記のコードによって実装されています。
※コードはReadmeEditor.csから一部を抜粋したものです
static ReadmeEditor() { EditorApplication.delayCall += SelectReadmeAutomatically;//デリゲートを登録 } /* 中略 */ static void SelectReadmeAutomatically() { if (!SessionState.GetBool(kShowedReadmeSessionStateName, false)) { var readme = SelectReadme();//Readmeを探す SessionState.SetBool(kShowedReadmeSessionStateName, true); if (readme && !readme.loadedLayout) { LoadLayout();//Readmeを読み込めていれば表示 readme.loadedLayout = true; } } } /* 中略 */ static Readme SelectReadme() { var ids = AssetDatabase.FindAssets("Readme t:Readme");//Readme.assetを探す if (ids.Length == 1) { var readmeObject = AssetDatabase.LoadMainAssetAtPath(AssetDatabase.GUIDToAssetPath(ids[0])); Selection.objects = new UnityEngine.Object[] { readmeObject }; return (Readme)readmeObject; } else { Debug.Log("Couldn't find a readme"); return null; } }
静的コンストラクタのReadmeEditorからデリゲートでエディタ起動時にSelectReadmeAutomaticallyが呼ばれるようになっています。 SelectReadmeAutomaticallyの中ではSelectReadmeでReadme.assetを探しているのが分かります。
おわりに
これで実体がわかったので心置きなく消したりできますね。
後、Readmeの実装はエディタ拡張の簡単な活用例の一つとして参考になると思いました。