【Unity】既存のビューやウィンドウをスクリプトから開く方法

仕事でUnityでライトマップを焼くときのLightingウィンドウの設定のプリセットを保存できるエディター拡張を作って、

そのエディター拡張のウィンドウを開く時にLightingウィンドウが開かれてなかったら一緒に開こうと思ったのですが、

Lightingなどの既存のウィンドウは拡張ウィンドウのようにただGetWindow()だけでは開けませんでした。

 

そこで色々検索してなんとか開く方法を見つけました。

一通り自分で試してはいますが、不具合が出ても責任は取れませんので自己責任でお試し下さい。

あと、もしもっと良い方法あったら教えて下さい。m(_ _)m

 

 

では、まずは特定のウィンドウ(この例ではLightingウィンドウ)が開かれてるかどうかを確認して

開かれてなければ開く方法です。



// 開かれてるウィンドウのリストを取得する
var editorList = Resources.FindObjectsOfTypeAll ();

List list = new List ();
foreach (var n in editorList) {
    list.Add (n.GetType ().ToString ());
}

int index = list.IndexOf ("UnityEditor.LightingWindow");


// LightingWindowを探して、もし開いてなければ一緒に開く
if (index == -1) {

    // 普通にEditorWindow.GetWindow(tyeof("UnityEditor.LightingWindow"))じゃ開けないのでリフレクションを使う
    var asm = Assembly.Load ("UnityEditor");
    var typeLightingWindow = asm.GetType ("UnityEditor.LightingWindow");

    var lightingWindow = EditorWindow.GetWindow (typeLightingWindow, false, "Lighting", false);

}


はい、こんな↑感じのコードを開こうとしている自作のウィンドウのShowWindow()内に書いておくと

開かれてるか確認して開かれてなかったらLightingのウィンドウを一緒に開くことができました。

これに関してはこちらのQiitaのページを参考にさせて頂きました。

 

●Preference ウィンドウをドッキング可能な状態で開く - Qiita
http://qiita.com/butislime/items/0cb51097ad055ffe56d8

 

そして、それ以外のウィンドウの開き方は下記をご覧下さい。

引っかかったのはAnimatorとAnimator Parameterのウィンドウです。

確認した感じではこれら2つだけは他と同じようには開けませんでした。

 

上の方法でもウィンドウを開いていればウィンドウの名前を取得できますが、

ウィンドウの名前はこちらのサイトを参考にさせて頂きました。

 

●【Unity】エディタで表示できるウィンドウの名前を調べる - コガネブログ
http://baba-s.hatenablog.com/entry/2015/04/30/103154



 

var asm = Assembly.Load ("UnityEditor");


//シーンビュー
var typeSceneView = asm.GetType ("UnityEditor.SceneView");
var sceneView = EditorWindow.GetWindow (typeSceneView, false, "Scene", false);


//ゲームビュー
var typeGameView = asm.GetType ("UnityEditor.GameView");
var gameView = EditorWindow.GetWindow (typeGameView, false, "Game", false);

 

//インスペクターウィンドウ
var typeInspctWindow = asm.GetType ("UnityEditor.InspectorWindow");
var InspctWindow = EditorWindow.GetWindow (typeInspctWindow, false, "Inspector", false);

 

//ヒエラルキーウィンドウ
var typeHiercyWindow = asm.GetType ("UnityEditor.SceneHierarchyWindow");
var hiercyWindow = EditorWindow.GetWindow (typeHiercyWindow, false, "Hierarchy", false);

 

//プロジェクトウィンドウ
var typePrjctWindow = asm.GetType ("UnityEditor.ProjectBrowser");
var prjctWindow = EditorWindow.GetWindow (typePrjctWindow, false, "Project", false);

 

//アニメーションウィンドウ
var typeAnimWindow = asm.GetType ("UnityEditor.AnimationWindow");
var animWindow = EditorWindow.GetWindow (typeAnimWindow, false, "Animation", false);

 

//プロファイラーウィンドウ
var typeProfilWindow = asm.GetType ("UnityEditor.ProfilerWindow");
var profilWindow = EditorWindow.GetWindow (typeProfilWindow, false, "Profiler", false);

 

//オーディオミキサーウィンドウ
var typeAudioWindow = asm.GetType ("UnityEditor.AudioMixerWindow");
var audioWindow = EditorWindow.GetWindow (typeAudioWindow, false, "Audio Mixer", false);

 

//アセットストアウィンドウ
var typeAssetWindow = asm.GetType ("UnityEditor.AssetStoreWindow");
var assetWindow = EditorWindow.GetWindow (typeAssetWindow, false, "Asset Store", false);

 

//スプライトパッカーウィンドウ
var typeSpriteWindow = asm.GetType ("UnityEditor.Sprites.PackerWindow");
var spriteWindow = EditorWindow.GetWindow (typeSpriteWindow, false, "Sprite Packer", false);

 

//ライティングウィンドウ
var typeLightingWindow = asm.GetType ("UnityEditor.LightingWindow");
var lightingWindow = EditorWindow.GetWindow (typeLightingWindow, false, "Lighting", false);

 

//オクルージョンカリングウィンドウ
var typeOcclsnWindow = asm.GetType ("UnityEditor.OcclusionCullingWindow");
var occlsnWindow = EditorWindow.GetWindow (typeProfilWindow, false, "Occlusion Culling", false);

 

//フレームデバッグウィンドウ
var typeFrameWindow = asm.GetType ("UnityEditor.ProfilerWindow");
var frameWindow = EditorWindow.GetWindow (typeFrameWindow, false, "Frame Debug", false);

 

//ナビゲーションウィンドウ
var typeNaviWindow = asm.GetType ("UnityEditor.NavMeshEditorWindow");
var naviWindow = EditorWindow.GetWindow (typeNaviWindow, false, "Navigation", false);

 

//コンソールウィンドウ
var typeConslWindow = asm.GetType ("UnityEditor.ConsoleWindow");
var conslWindow = EditorWindow.GetWindow (typeConslWindow, false, "Console", false);

//===================================================================


var asm2 = Assembly.Load ("UnityEditor.Graphs");

Module editorGraphModule = asm2.GetModule("UnityEditor.Graphs.dll");


//アニメーターウィンドウ
var typeAnimatorWindow = editorGraphModule.GetType ("UnityEditor.Graphs.AnimatorControllerTool");
var animatorWindow = EditorWindow.GetWindow (typeAnimatorWindow, false, "Animator", false);

 

//アニメーターパラメーターウィンドウ
var typeAnimPrmWindow = editorGraphModule.GetType ("UnityEditor.Graphs.ParameterControllerEditor");
var animaPrmWindow = EditorWindow.GetWindow (typeAnimPrmWindow, false, "Parameter", false);


AnimatorとAnimator Parameterのウィンドウの開き方の参考にしたのは下記のGitHubページです。

 

●Unity3D: Sync the Animation window to an Animator without requiring hierarchy selection (4.6.x) · GitHub
https://gist.github.com/BlueRyth/8aa27eb7f5725263dcee