Editor スクリプティング 入門

19,098 views

Published on

Unite Japan
Editorスクリプティング入門

公式ページで公開するまで仮でアップします。
公式ページで公開されたらここのは削除します。

0 Comments
39 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
19,098
On SlideShare
0
From Embeds
0
Number of Embeds
9,765
Actions
Shares
0
Downloads
0
Comments
0
Likes
39
Embeds 0
No embeds

No notes for slide

Editor スクリプティング 入門

  1. 1. Editor スクリプティング 入門誰もが使えるそんな環境づくり
  2. 2. 私はこんな人Unity Technologies JapanフィールドエンジニアEditor拡張にお熱@kyusyukeigo安藤 圭吾
  3. 3. Editorスクリプトってなんだ
  4. 4. EditorスクリプトってなんだUnityEditorを拡張するためのスクリプト
  5. 5. Editorスクリプトってなんだインスペクターを拡張したり
  6. 6. Editorスクリプトってなんだインスペクターを拡張したり ウィンドウを作成したり
  7. 7. Editorスクリプトってなんだ自動でテスターにアプリ配信したり
  8. 8. EditorスクリプトってなんだJenkinsさんにお願いしたりEmotional Jenkins - https://cacoo.com/store/items/10148
  9. 9. EditorスクリプトってなんだJenkinsさんにお願いしたり 怒られたりEmotional Jenkins - https://cacoo.com/store/items/10148
  10. 10. Editorスクリプトってなんだ開発をスムーズに行うために手助けをするもの
  11. 11. 時間割いてまでやる必要あるの?必要か?
  12. 12. 実際にあったことを少しだけご紹介こんなことって...ない?
  13. 13. 初期パラメータはwikiに書いてますこんなことって...ない?
  14. 14. コピペスプレッドシートに一覧初期パラメータはwikiに書いてますこんなことって...ない?
  15. 15. こんなことって...ない?パラメータはContextMenuで管理
  16. 16. using UnityEngine;public class NewBehaviourScript : MonoBehaviour{ [ContextMenu("Hoge")] public void Hoge () { HogeScript h = GetComponent<HogeScript> (); h.str = "hoge"; } [ContextMenu("Fuga")] public void Fuga (){} [ContextMenu("Foo")] public void Foo (){}}ContextMenuのためのScript...パラメータはContextMenuで管理こんなことって...ない?
  17. 17. こんなことって...ない?パラメータはContextMenuで管理ランライム側余計なコードエディター側に書け!
  18. 18. ちょっとどこ触ってんの!こんなことって...ない?
  19. 19. こんなことって...ない?ちょっとどこ触ってんの!なんか動かないんだけど... どれどれ...
  20. 20. こんなことって...ない?ちょっとどこ触ってんの!−90じゃなくて 270にして!
  21. 21. こんなことって...ない?ちょっとどこ触ってんの!触ってほしくない所を触ってる!
  22. 22. こんなことって...ない?ちょっとどこ触ってんの!触ってほしくない所を触ってる!2DのときZ軸は大丈夫?
  23. 23. こんなことって...ない?ちょっとどこ触ってんの!Transform
  24. 24. こんなことって...ない?ちょっとどこ触ってんの!Z軸削除Transform
  25. 25. こんなことって...ない?見せないCustomEditorを使う触らせたくないものちょっとどこ触ってんの!
  26. 26. Editorスクリプトはこんな時に便利
  27. 27. コンパクト見やすい / 目立つEditorスクリプトはこんな時に便利
  28. 28. Editorスクリプトはこんな時に便利using UnityEngine;using UnityEditor;using UnityEditor.Callbacks;public class PostProcess{ [PostProcessBuild] static void OnPostprocessBuild (BuildTarget target, string pathToBuiltProject) { //フレームワーク追加とか } [PostProcessScene] static void OnPostprocessScene () { //デバッグ時のみに追加したいマネージャー(GameObject)追加とか }}ビルド前後の処理自動化
  29. 29. Editorスクリプトはこんな時に便利using UnityEngine;using UnityEditor;public class AssetModification : UnityEditor.AssetModificationProcessor{ static void OnWillCreateAsset (string path){} static void OnWillSaveAssets (string[] paths){} static AssetMoveResult OnWillMoveAsset (string from, string to) { return AssetMoveResult.FailedMove; //ここでアセット移動制限 } static AssetDeleteResult OnWillDeleteAsset (string path, RemoveAssetOptions option) { return AssetDeleteResult.FailedDelete; //ここでアセット削除制限 }}アセット管理移動すんな!削除すんな!
  30. 30. 今回話すことGUI周りについて
  31. 31. PropertyDrawer
  32. 32. PropertyDrawerPropertyDrawerって何
  33. 33. PropertyDrawerPropertyDrawerって何(シリアライズされたフィールドで)カスタマイズするためのものインスペクターに表示されるGUIを
  34. 34. ...PropertyDrawerって何これつまりpublic変数PropertyDrawerpublic Vector3 vector3;
  35. 35. パッと見たいときに少し使いづらいPropertyDrawer...PropertyDrawerって何
  36. 36. [Compact]public Vector3 vector3;https://github.com/anchan828/property-drawer-collection/tree/master/CompactAttributePropertyDrawer...PropertyDrawerって何
  37. 37. 自分で作れるPropertyDrawer
  38. 38. 自分で作れるPropertyDrawer[Compact]public Vector3 vector3;using UnityEngine;public class CompactAttribute : PropertyAttribute {}
  39. 39. using UnityEngine;using UnityEditor;[CustomPropertyDrawer(typeof(CompactAttribute))]public class CompactDrawer : PropertyDrawer{ public override void OnGUI (Rect position, SerializedProperty property, GUIContent label) { ... }}自分で作れるPropertyAttributePropertyDrawerusing UnityEngine;public class CompactAttribute : PropertyAttribute {}PropertyDrawer
  40. 40. using UnityEngine;using UnityEditor;[CustomPropertyDrawer(typeof( Hoge ))]public class CompactDrawer : PropertyDrawer{ public override void OnGUI (Rect position, SerializedProperty property, GUIContent label) { ... }}自分で作れるシリアライズされたクラス[System.Serializable]public class Hoge{public float number;}PropertyDrawerFindPropertyRelative
  41. 41. 唯一、使い回し出来るEditor拡張(だと思ってる)プロジェクトと切り分けてコードを書くことが容易PropertyDrawer
  42. 42. ネタPreviewTexturehttps://github.com/anchan828/property-drawer-collection/tree/master/PreviewTextureAttributePropertyDrawer
  43. 43. AnimatorParameterLabelSearchPasswordPopupSceneName要望/バグあればissueお願いhttps://github.com/anchan828/property-drawer-collectionPropertyDrawer
  44. 44. EditorWindow
  45. 45. EditorWindowEditorWindowって何UnityEditorはEditorWindowで成り立っている
  46. 46. EditorWindow
  47. 47. EditorWindow
  48. 48. EditorWindow
  49. 49. EditorWindow
  50. 50. EditorWindow
  51. 51. EditorWindow
  52. 52. EditorWindowEditorWindowの作り方EditorWindowはScriptableObject継承
  53. 53. EditorWindowEditorWindowの作り方EditorWindowはScriptableObject継承なのでCreateInstanceで生成できる
  54. 54. EditorWindowEditorWindowの作り方CreateInstance複数同じEditorWindow生成
  55. 55. EditorWindowEditorWindowの作り方CreateInstanceGetWindow<T>複数同じEditorWindow生成必ず1つのEditorWindow生成
  56. 56. EditorWindowEditorWindowの作り方GetWindowについて• 内部でCreateInstanceが呼び出される
  57. 57. EditorWindowEditorWindowの作り方GetWindowについて• 内部でCreateInstanceが呼び出される• 生成されたEditorWindowはキャッシュされる
  58. 58. EditorWindowEditorWindowの作り方GetWindowについて• 内部でCreateInstanceが呼び出される• 生成されたEditorWindowはキャッシュされる• Showが呼ばれる
  59. 59. EditorWindowEditorWindowの種類• Normal ( Show )• Aux• Popup• Utility• DropDown• ScriptableWizard• Preference用途に合わせて使い分けるhttp://docs.unity3d.com/Documentation/ScriptReference/EditorWindow.htmlhttp://anchan828.hatenablog.jp/entry/2013/02/17/020603
  60. 60. EditorWindowEditorWindowでGUIUnityのGUIStyleを使いたい
  61. 61. EditorWindowEditorWindowでGUIEditorGUIUtility.GetBuildinSkin
  62. 62. EditorWindowEditorWindowでGUIEditorGUIUtility.GetBuiltinSkinGameSceneInspectorSkin
  63. 63. EditorWindowEditorWindowでGUIEditorGUIUtility.GetBuiltinSkinGameSceneInspectorLabelButtonToggleSkinStyle
  64. 64. EditorWindowEditorWindowでGUIEditorStylesEditorGUIUtility.GetBuiltinSkinGameSceneInspectorLabelButtonToggleSkinStyle
  65. 65. EditorWindowEditorWindowでGUIEditorStylesEditorGUIUtility.GetBuiltinSkinGameSceneInspectorLabelMini ButtonToggleLabelButtonToggleSkinStyle
  66. 66. EditorWindowEditorWindowでGUIビルドインされてるGUISkinのCustomStyleを使いたいUnityのGUIStyleを使いたい
  67. 67. EditorWindowビルドインのGUISkinにあるCustomStyle名を知る
  68. 68. EditorWindow現在ではCustomStyle名を知る術はないビルドインのGUISkinにあるCustomStyle名を知る
  69. 69. EditorWindow現在ではCustomStyle名を知る術はないむりやり知るには、ScriptableObjectで保存ビルドインのGUISkinのCustomStyle名を知る
  70. 70. EditorWindowusing UnityEngine;using UnityEditor;public class BuildinSkins : ScriptableObject{public GUISkin game = EditorGUIUtility.GetBuiltinSkin (EditorSkin.Game);public GUISkin inspector = EditorGUIUtility.GetBuiltinSkin (EditorSkin.Inspector);public GUISkin scene = EditorGUIUtility.GetBuiltinSkin (EditorSkin.Scene);}AssetDatabase.CreateAsset (ScriptableObject.CreateInstance<BuildinSkins> (), "Assets/BuildinSkins.asset");BuildInSkinのCustomStyle名を知るhttp://anchan828.hatenablog.jp/entry/2013/02/17/024650
  71. 71. EditorWindow.assetで保存してInspectorで見る400以上CustomStyleがあるBuildInSkinのCustomStyle名を知る
  72. 72. EditorWindowBuildInSkinのCustomStyle名を知るただしStyle名は今後変更される可能性があるので注意.assetで保存してInspectorで見る400以上CustomStyleがある
  73. 73. EditorWindowUnityらしいEditorWindowを作成する混乱を招かないように
  74. 74. GUIを知るはじめの一歩• CustomEditor ( Attribute )• Editor ( Class )この2つを知ること
  75. 75. EditorEditorクラスって何?インスペクターとシーンビューのGUIを表示するためのクラス
  76. 76. EditorOnInspectorGUI インスペクターのGUIを描画する
  77. 77. EditorOnInspectorGUIOnPreviewGUI プレビューを描画するインスペクターのGUIを描画する
  78. 78. EditorOnInspectorGUIOnPreviewGUI プレビューを描画するインスペクターのGUIを描画するOnSceneGUI シーンビューのGUIを描画する
  79. 79. EditorOnInspectorGUI3rd Person Controller ( Prefab )
  80. 80. EditorOnInspectorGUIOnPreviewGUI3rd Person Controller ( Prefab )
  81. 81. EditorOnInspectorGUIOnPreviewGUI3rd Person Controller ( Prefab )OnSceneGUI
  82. 82. Editor3rd Person Controller ( Prefab )
  83. 83. EditorGameObjectInspectorTransformInspectorCharacterControllerEditorAnimationEditorMonoScriptInspector
  84. 84. EditorTransform Inspectorみたいなのを作るにはCustomEditorを使う
  85. 85. CustomEditorCustomEditorって何Editorを継承したクラスを使用するためのAttribute
  86. 86. CustomEditorCustomEditorって何[CustomEditor(typeof(HogeScript))][CanEditMultipleObjects]public class Custom : Editor{ public override void OnInspectorGUI () { EditorGUIUtility.LookLikeInspector (); HogeScript h = (HogeScript)target; EditorGUI.BeginChangeCheck (); string str = EditorGUILayout.TextField ("label", h.str); if (EditorGUI.EndChangeCheck ()) { h.str = str; EditorUtility.SetDirty (h); } }}Editorを継承CustomEditorCanEditMultipleObjects
  87. 87. OnInspectorGUIOnPreviewGUIこの部分を自由にカスタマイズできるようになるOnSceneGUICustomEditor
  88. 88. editorForChildClassesでサブクラス(子クラス)を拡張CustomEditorusing UnityEngine;using UnityEditor;[CustomEditor(typeof(Component), true)]public class CustomComponent : Editor{ private string memo = ""; public override void OnInspectorGUI () { EditorGUI.BeginChangeCheck (); string _memo = EditorGUILayout.TextArea (memo); if (EditorGUI.EndChangeCheck ()) { memo = _memo; } }}
  89. 89. EditorGUI使いたいけどどうするの?Editor.CreateEditorでEditor作ってOnInspectorGUIEditor.CreateEditor ( transform );
  90. 90. EditorPreview使いたいけどどうするの?Editor.CreateEditorでEditor作ってOnPreviewGUIEditor.CreateEditor ( material );
  91. 91. Editorこんな感じでEditorを生成するEditor.CreateEditor ( transform );Editor.CreateEditor ( material );CustomEditorが複数ある場合はEditor.CreateEditor ( transform, typeof(CustomTransform) );
  92. 92. EditorEditorクラスを理解することがエディタ拡張(GUI)のスタートライン
  93. 93. 各WindowのOnGUI既にUnityに実装してあるEditorWindow
  94. 94. EditorWindow
  95. 95. 各WindowのOnGUIOnGUIイベントをデリゲートに登録できる• プロジェクトウィンドウEditorApplication.projectWindowItemOnGUI• ヒエラルキーウィンドウEditorApplication.hierarchyWindowItemOnGUI
  96. 96. 各WindowのOnGUI• プロジェクトウィンドウprojectWindowItemOnGUIファイルサイズ表示
  97. 97. 各WindowのOnGUI• ヒエラルキーウィンドウhierarchyWindowItemOnGUIアイコン表示
  98. 98. Handles
  99. 99. HandlesHandles って何3D GUI を表示するためのクラス
  100. 100. Handles3D GUI の種類まだ沢山ある
  101. 101. Handlesどこで使う?Editor の OnSceneGUI で書くvoid OnSceneGUI (){ transform.position = Handles.DoPositionHandle (transform.position, Quaternion.identity);}シーンビューで使用する
  102. 102. Handles2D GUI と 3D GUI の棲み分け2D GUIを使うときはHandles.BeginGUIvoid OnSceneGUI (){ GUILayout.Label ("表示されない"); }void OnSceneGUI (){ Handles.BeginGUI (); GUILayout.Label ("表示される"); Handles.EndGUI ();}
  103. 103. HandlesSceneViewをカスタマイズしよう
  104. 104. GUIのお話終わり
  105. 105. 時間割いてまでやる必要あるの?必要か?
  106. 106. 最後のまとめ開発者自身がEditor拡張は必要!と思うこと触らせたくないものは見せるな!Editorクラスを正しく理解すること
  107. 107. Questions ?
  108. 108. ご清聴ありがとうございました

×