ちゃこブログ

お絵かきとUnityとBlenderと日記

【Unity制作日記】CustomEditorでしくじった話

進捗が非常に遅いですが、UnityEditorMemo ver2.0の開発が進んでいます。途中でCustomEditorに関して学び(失敗)があったのでメモしておきます。

SceneViewにメモを表示する

Hierarchy上にあるGameObjectに対してメモすることができます。選択中のGameObjectのメモをSceneView上に表示する機能を作ったら便利かなと思い実装を試みました。

CustomEditorのOnSceneGUIで表示

Hierarchy上にあるものは必ずGameObjectを持っています。なので、GameObjectのCustomEditorを作成することでSceneView上にメモを表示しようと考えました。UnitySceneMemoはGameObjectのLocalIdentifierInFileをキーにしているので、この方法はとても最適だと思いました。

f:id:charcotte:20171207235420p:plain
表示はできた!
実現できたので大満足(⋈◍>◡<◍)。✧♡
ところがこの時事件は起こっていたのです


f:id:charcotte:20171207235415p:plain
あれ?Inspectorがなんかおかしい・・・
お気づきでしょうか・・・いつもGameObjectのアクティブなどをいじる場所がなくなって違う表示になってしまいました。普段EditorWindowばっかりいじっているため、Inspectorがおかしくなったのに気が付いたのが時間が空いてからだったので何が原因かわからず、UnityをインストールしなおしたりProject作り直したりしてしまいました。
原因はお察しの通り、GameObjectのCustomEditorでした。

GameObjectのCustomEditorは良くないのである

GameObjectのCustomEditorではOnSceneGUIしか記述していませんでした。GameObjectのInspectorがおかしくなったのだから、GameObjectのCustomEditorでOnInspectorGUIをoverrideしてbase.OnInspectorGUI()をすれば直るのかな?と思いましたが直らず。GameObjectがだめならTransformでいいじゃない!とトライしてみましたが、TransformのInspectorもいつもと違う表示になってしまいました。

解決策はないか、色々と検索をしてみました。

もうお気付きかもしれませんが他のスクリプトファイルでCustomEditor(typeof(Object))を使用している場合、どちらか一方のCustomEditorのみ使用されます
github.com

The "GameObjectInspector" class as well as the "TransformInspector" class are internal classes inside the UnityEngine.dll which you can't access without using massive reflection.
You really should avoid replacing the inspector of any built-in object, especially if you plan to release your editor extension for others. It was never intended and isn't recommended to replace the GameObject or Transform inspector.
answers.unity.com


以上のことから、

  • もしユーザーがCustomEditor(typeof(GameObject))を使っていたら、ユーザーに不都合が生じる
  • GameObjectのInspectorに影響のあるエディタ拡張はリリースすべきではない

解決策どころか、そもそもの考え方が良くなかったのですね。
Editor拡張の巨匠たちの言葉により、ほかの人に配布するAssetならばGameObjectに限らずUnityAPIのCustomEditorは非推奨であることを学びました。もちろん該当APIの拡張がメインならよいと思うのですが、UnityEditorMemoようなAssetがやるべきでないなと思います。
今後はこういうことに注意しながら作ろうと思いました。

結局SceneViewの件はどうするの?

メインの話じゃないですが・・・こちらを参考にonSceneGUIDelegateを使いました。(最初からこっち使えばよかったのに)もう少しGUI周りを詰めていければと思います。さて年内提出ができるか否か( ^)o(^ )
tsubakit1.hateblo.jp