Unity エディタ拡張
株式会社ハ・ン・ド
プログラマ
馬場翔太
/68
自己紹介
• 馬場翔太
• 株式会社ハ・ン・ド
• プログラマ
• Twitter:@baba_s_
• Qiita:baba_s
2
/68
株式会社ハ・ン・ド
3
/68
株式会社ハ・ン・ド
4
/68
コガネブログ
http://baba-s.hatenablog.com/
5
/68
アジェンダ
1. エディタ拡張の基本
2. Hierarchyビューの拡張
3. Projectビューの拡張
4. Sceneビューの拡張
5. 参考アセット
6
/68
ターゲット
• エディタ拡張初学者の方
• Unity 5 以上
7
/68
アジェンダ
1. エディタ拡張の基本
2. Hierarchyビューの拡張
3. Projectビューの拡張
4. Sceneビューの拡張
5. 参考アセット
8
/68
いろいろな場所が拡張可能
9
/68
エディタ拡張の方法
1. 「Editor」フォルダを作成
2. エディタ拡張用のスクリプトを格納
3. スクリプトに処理を記述
10
/68
アジェンダ
1. エディタ拡張の基本
2. Hierarchyビューの拡張
3. Projectビューの拡張
4. Sceneビューの拡張
5. 参考アセット
11
/68
Hierarchyビューとは
シーン内に存在するオブジェクトの一覧
12
/68
Hierarchyビューの拡張サンプル
オブジェクトが編集可能かどうか変更するアイコンを表示
13
/68
Hierarchyビューの拡張サンプル
オブジェクトを複数選択できるチェックボックスを表示
14
/68
Hierarchyビューの拡張サンプル
無効なコンポーネントがアタッチされているかを表示
15
/68
Hierarchyビューの拡張サンプル
オブジェクトに設定されているアイコンを表示
16
/68
Hierarchyビューの拡張サンプル
オブジェクトが持つコンポーネントの一覧を表示
17
/68
Hierarchyビューの拡張サンプル
一行おきに色を変える
18
/68
Hierarchyビューの拡張サンプル
NGUIのUIWidgetの
depthを編集するGUIを表示
19
/68
ゲームオブジェクトのアクティブを変更できる
チェックボックスを表示してみる
Hierarchyビューの拡張
20
/68
Hierarchyビューの拡張
「Editor」フォルダを作成して
エディタ拡張用のスクリプトを格納
21
/68
Hierarchyビューの拡張
クラスを定義
22
using UnityEditor;
using UnityEngine;
public class ExampleClass
{
...
}
/68
Hierarchyビューの拡張
「EditorApplication.hierarchyWindowItemOnGUI」に
コールバック関数を登録
23
[InitializeOnLoadMethod]
static void Example()
{
EditorApplication.hierarchyWindowItemOnGUI += OnGUI;
}
static void OnGUI( int instanceID, Rect selectionRect )
{
...
}
/68
Hierarchyビューの拡張
「EditorUtility.InstanceIDToObject」で
ゲームオブジェクトの情報を取得
24
var obj = EditorUtility.InstanceIDToObject( instanceID );
var go = obj as GameObject;
if ( go == null )
{
return;
}
...
/68
Hierarchyビューの拡張
「GUI.Toggle」でゲームオブジェクトの
アクティブを変更するチェックボックスを表示
25
var pos = selectionRect;
pos.x = pos.xMax - 16;
pos.width = 16;
var newActive = GUI.Toggle(
pos,
go.activeSelf,
string.Empty
);
go.SetActive( newActive );
/68
Hierarchyビューの拡張
26
using UnityEditor;
using UnityEngine;
public static class ExampleClass
{
[InitializeOnLoadMethod]
static void Example()
{
EditorApplication.hierarchyWindowItemOnGUI += OnGUI;
}
static void OnGUI( int instanceID, Rect selectionRect )
{
var obj = EditorUtility.InstanceIDToObject( instanceID );
var go = obj as GameObject;
if ( go == null )
{
return;
}
var pos = selectionRect;
pos.x = pos.xMax - 16;
pos.width = 16;
var newActive = GUI.Toggle( pos, go.activeSelf, string.Empty );
go.SetActive( newActive );
}
}
/68
Hierarchyビューの拡張サンプル一覧
オブジェクトのアクティブを変更するチェックボックスを表示
http://baba-s.hatenablog.com/entry/2015/04/28/121747
オブジェクトが編集可能かどうか変更するアイコンを表示
http://baba-s.hatenablog.com/entry/2015/04/27/101143
オブジェクトを複数選択できるチェックボックスを表示
http://baba-s.hatenablog.com/entry/2015/04/29/133141
無効なコンポーネントがアタッチされているかを表示
http://baba-s.hatenablog.com/entry/2015/05/04/171926
オブジェクトに設定されているアイコンを表示
http://baba-s.hatenablog.com/entry/2015/05/05/103647
27
/68
Hierarchyビューの拡張サンプル一覧
オブジェクトが持つコンポーネントの一覧を表示
http://baba-s.hatenablog.com/entry/2015/05/08/114119
一行おきに色を変える
http://baba-s.hatenablog.com/entry/2015/05/09/122713
NGUIのUIWidgetのdepthを編集するGUIを表示
http://baba-s.hatenablog.com/entry/2015/05/25/125552
28
/68
アジェンダ
1. エディタ拡張の基本
2. Hierarchyビューの拡張
3. Projectビューの拡張
4. Sceneビューの拡張
5. 参考アセット
29
/68
Projectビューとは
プロジェクトに含まれるリソースの一覧
30
/68
Projectビューの拡張サンプル
拡張子を表示
31
/68
Projectビューの拡張サンプル
容量を表示
32
/68
Projectビューの拡張サンプル
ファイル数を表示
33
/68
Projectビューの拡張サンプル
テクスチャのプレビューを表示
34
/68
Projectビューの拡張サンプル
一行おきに色を変える
35
/68
アセットが管理されているフォルダを
エクスプローラで開くことができるボタンを表示してみる
Projectビューの拡張
36
/68
Projectビューの拡張
「Editor」フォルダを作成して
エディタ拡張用のスクリプトを格納
37
/68
Projectビューの拡張
クラスを定義
38
using UnityEditor;
using UnityEngine;
public class ExampleClass
{
...
}
/68
Projectビューの拡張
「EditorApplication.projectWindowItemOnGUI」に
コールバック関数を登録
39
[InitializeOnLoadMethod]
static void Example()
{
EditorApplication.projectWindowItemOnGUI += OnGUI;
}
static void OnGUI( string guid, Rect selectionRect )
{
...
}
/68
Projectビューの拡張
「AssetDatabase.GUIDToAssetPath」で
アセットが存在するファイルのパスを取得
40
var path = AssetDatabase.GUIDToAssetPath( guid );
path = path.Replace( “/”, “¥¥” );
...
/68
Projectビューの拡張
「GUI.Button」でフォルダを開くためのボタンを表示
41
var pos = selectionRect;
pos.x = pos.xMax - 16;
pos.width = 16;
if ( !GUI.Button( pos, "!" ) )
{
return;
}
...
/68
Projectビューの拡張
「Process.Start」でフォルダを開く
42
Process.Start( "explorer.exe", "/select," + path );
/68
Projectビューの拡張
43
using System.Diagnostics;
using UnityEditor;
using UnityEngine;
public class ExampleClass
{
[InitializeOnLoadMethod]
static void Example()
{
EditorApplication.projectWindowItemOnGUI += OnGUI;
}
static void OnGUI( string guid, Rect selectionRect )
{
var pos = selectionRect;
pos.x = pos.xMax - 16;
pos.width = 16;
if ( !GUI.Button( pos, "!" ) ){ return; }
var path = AssetDatabase.GUIDToAssetPath( guid );
path = path.Replace( "/", "¥¥" );
Process.Start( "explorer.exe", "/select," + path );
}
}
/68
Projectビューの拡張サンプル一覧
フォルダを開くボタンを表示
http://baba-s.hatenablog.com/entry/2015/06/21/193838
拡張子を表示
http://baba-s.hatenablog.com/entry/2015/05/07/103743
容量を表示
http://baba-s.hatenablog.com/entry/2015/06/18/101052
ファイル数を表示
http://baba-s.hatenablog.com/entry/2015/06/22/090000
テクスチャのプレビューを表示
http://baba-s.hatenablog.com/entry/2015/05/13/224633
44
/68
Projectビューの拡張サンプル一覧
一行おきに色を変える
http://baba-s.hatenablog.com/entry/2015/05/16/115549
45
/68
アジェンダ
1. エディタ拡張の基本
2. Hierarchyビューの拡張
3. Projectビューの拡張
4. Sceneビューの拡張
5. 参考アセット
46
/68
シーンの編集画面
Sceneビューとは
47
/68
Sceneビューの拡張サンプル
カメラを初期位置に戻すボタンを表示
48
/68
Sceneビューの拡張サンプル
Sceneビューと
Gameビューの
カメラを同期
49
/68
ボタンを表示してみる
Sceneビューの拡張
50
/68
Sceneビューの拡張
「Editor」フォルダを作成して
エディタ拡張用のスクリプトを格納
51
/68
Sceneビューの拡張
クラスを定義
52
using UnityEditor;
using UnityEngine;
public class ExampleClass
{
...
}
/68
Sceneビューの拡張
「SceneView.onSceneGUIDelegate」に
コールバック関数を登録
53
[InitializeOnLoadMethod]
static void Example()
{
SceneView.onSceneGUIDelegate += OnGUI;
}
static void OnGUI( SceneView sceneView )
{
...
}
/68
Sceneビューの拡張
「GUI.WindowFunction」で表示するボタンの一覧を作成
54
GUI.WindowFunction func = id =>
{
if ( GUILayout.Button( "Shaded" ) )
{
// TODO
}
else if ( GUILayout.Button( "Wireframe" ) )
{
// TODO
}
};
...
/68
Sceneビューの拡張
「GUILayout.Window」でボタンの一覧を表示
55
var rect = new Rect( 8, 24, 80, 0 );
GUILayout.Window( 1, rect, func, string.Empty );
/68
Sceneビューの拡張
56
using UnityEditor;
using UnityEngine;
public class ExampleClass
{
[InitializeOnLoadMethod]
static void Example()
{
SceneView.onSceneGUIDelegate += OnGUI;
}
static void OnGUI( SceneView sceneView )
{
GUI.WindowFunction func = id =>
{
if ( GUILayout.Button( "Shaded" ) ) {}
else if ( GUILayout.Button( “Wireframe" ) ) {}
};
var rect = new Rect( 8, 24, 80, 0 );
GUILayout.Window( 1, rect, func, string.Empty );
}
}
/68
Sceneビューの拡張サンプル一覧
ボタンを表示
http://baba-s.hatenablog.com/entry/2015/06/19/103708
カメラを初期位置に戻すボタンを表示
http://baba-s.hatenablog.com/entry/2015/05/11/100630
SceneビューとGameビューのカメラを同期
https://github.com/anchan828/unitejapan2014
57
/68
アジェンダ
1. エディタ拡張の基本
2. Hierarchyビューの拡張
3. Projectビューの拡張
4. Sceneビューの拡張
5. 参考アセット
58
/68
参考アセット
• QHierarchy
• Favorites Tab[s]
• UNITY EDITOR ENHANCEMENTS
59
/68
QHierarchy
https://www.assetstore.unity3d.com/jp/#!/content/28577
60
/68
QHierarchy
61
/68
QHierarchy
62
/68
Favorites Tab[s]
https://www.assetstore.unity3d.com/jp/#!/content/4237
63
/68
Favorites Tab[s]
64
/68
UNITY EDITOR ENHANCEMENTS
http://www.tenebrous.co.uk/?portfolio=unity-editor-enhancements
65
/68
まとめ
• エディタ拡張は簡単
• Hierarchyビューは拡張可能
• Projectビューも拡張可能
• Sceneビューも拡張可能
• 既に便利なアセットがたくさん
66
/68
知って得するUnity エディタ拡張編
http://www.slideshare.net/shotababa359/unity-32294734
67
/6868
ありがとうございました

Unity エディタ拡張