読者です 読者をやめる 読者になる 読者になる

テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】UIだけ表示するScene Viewを作った

アセット紹介、AssetStore エディタ拡張・エディタ機能 日記 ScriptableObject

f:id:tsubaki_t1:20150921223212p:plain

UIだけ表示するシーンビューを試しに作ってみました。
右上の画面がUIのみを表示するシーンビュー、左上がUIを表示しないシーンビューです。

今回は並べてみましたが、画面が小さい場合はSceneViewの裏に配置しクリック一発で切り替えるも面白いかもしれません。

f:id:tsubaki_t1:20150921230950g:plain

何故こんな物を作ってしまったのか

何故こんな物を作ってしまったのかと言うと、原因はシーンビューのオブジェクトをタップしても選択できない です。つまりUIが邪魔すぎて選択する上で邪魔な事この上なかった訳です。UIの表示切替も何度もやってると面倒くさくなります。

UI専用カメラを用意しScreen Space Cameraにして画面隅に配置する方法も考えましたが、UIの位置調整が面倒くさいので止めました。

f:id:tsubaki_t1:20150921223644p:plain

で、どうせならシーンビューからUI表示を消して、UIを操作する専用のシーンビューを作ってしまおうと、そう思った訳です。

どのようにして作ったのか

UnityエディタのUIは突きつめると大体がScriptableObjectで作られています。なので、

ScriptableObject.CreateInstanceで生成することが可能です。

で幸いにもSceneViewクラスはpublicなので、UnityEditor.SceneViewクラスを継承したテキトウなクラスを用意しScriptableObject.CreateInstanceを実行すればオリジナルなSceneViewが作れます。

f:id:tsubaki_t1:20150921224736p:plain

やっかいな問題が二つ。

一つ目は「描画の制御に使用しているSceneViewCameraのCullingMaskがOnGUI内で書き換えられている」事、もう一つは「SceneViewクラスの持っているOnGUIメソッドがInternalでアクセス出来ない」点です。

まずCullingMaskが書き換えられている点ですが、どうもTools.visibleLayersからレイヤー情報を取ってるらしいので、OnGUIの前後でTools.visibleLayersの情報を書き換えました。

書き換えたタイミングですが、OnGUIを新しく作りInternalでアクセス出来ないOnGUIはリフレクションで呼び出しました。
本当はOnGUIの中身を持ってきて書き換えたかったのですが、他のInternalクラスやPrivateメソッドが結構あったので面倒くさくなり止めました。

実はもう一つ問題があり、これは解決出来ていません。というのも「UI専用シーンビューをドラッグするとTools.visibleLayersが上書きされ本来のシーンビューがUI専用ビューになってしまう」問題です。
とりあえず「UI専用シーンビューからフォーカスが外れたら元に戻す」設定で何とかしていますが、割と挙動的に気持ちが悪いので何とかしたい処です。

導入方法

Unity 5.2 p1で作成。
Editorフォルダを作り、下のコードをそこに配置します。

gist.github.com

「メニューバー > Window > UISceneView」でウィンドウが開きます。

あとはエディタ画面右上のLayersからUIを非表示にします。やり方

ちなみにリフレクション使ってInternalなコードにアクセスしているので、Unityエディタバージョンアップで使えなくなる可能性有