Editor スクリプティング 入門

  • 11,653 views
Uploaded on

Unite Japan …

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

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

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
11,653
On Slideshare
0
From Embeds
0
Number of Embeds
16

Actions

Shares
Downloads
0
Comments
0
Likes
28

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Editor スクリプティング 入門誰もが使えるそんな環境づくり
  • 2. 私はこんな人Unity Technologies JapanフィールドエンジニアEditor拡張にお熱@kyusyukeigo安藤 圭吾
  • 3. Editorスクリプトってなんだ
  • 4. EditorスクリプトってなんだUnityEditorを拡張するためのスクリプト
  • 5. Editorスクリプトってなんだインスペクターを拡張したり
  • 6. Editorスクリプトってなんだインスペクターを拡張したり ウィンドウを作成したり
  • 7. Editorスクリプトってなんだ自動でテスターにアプリ配信したり
  • 8. EditorスクリプトってなんだJenkinsさんにお願いしたりEmotional Jenkins - https://cacoo.com/store/items/10148
  • 9. EditorスクリプトってなんだJenkinsさんにお願いしたり 怒られたりEmotional Jenkins - https://cacoo.com/store/items/10148
  • 10. Editorスクリプトってなんだ開発をスムーズに行うために手助けをするもの
  • 11. 時間割いてまでやる必要あるの?必要か?
  • 12. 実際にあったことを少しだけご紹介こんなことって...ない?
  • 13. 初期パラメータはwikiに書いてますこんなことって...ない?
  • 14. コピペスプレッドシートに一覧初期パラメータはwikiに書いてますこんなことって...ない?
  • 15. こんなことって...ない?パラメータはContextMenuで管理
  • 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. こんなことって...ない?パラメータはContextMenuで管理ランライム側余計なコードエディター側に書け!
  • 18. ちょっとどこ触ってんの!こんなことって...ない?
  • 19. こんなことって...ない?ちょっとどこ触ってんの!なんか動かないんだけど... どれどれ...
  • 20. こんなことって...ない?ちょっとどこ触ってんの!−90じゃなくて 270にして!
  • 21. こんなことって...ない?ちょっとどこ触ってんの!触ってほしくない所を触ってる!
  • 22. こんなことって...ない?ちょっとどこ触ってんの!触ってほしくない所を触ってる!2DのときZ軸は大丈夫?
  • 23. こんなことって...ない?ちょっとどこ触ってんの!Transform
  • 24. こんなことって...ない?ちょっとどこ触ってんの!Z軸削除Transform
  • 25. こんなことって...ない?見せないCustomEditorを使う触らせたくないものちょっとどこ触ってんの!
  • 26. Editorスクリプトはこんな時に便利
  • 27. コンパクト見やすい / 目立つEditorスクリプトはこんな時に便利
  • 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. 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. 今回話すことGUI周りについて
  • 31. PropertyDrawer
  • 32. PropertyDrawerPropertyDrawerって何
  • 33. PropertyDrawerPropertyDrawerって何(シリアライズされたフィールドで)カスタマイズするためのものインスペクターに表示されるGUIを
  • 34. ...PropertyDrawerって何これつまりpublic変数PropertyDrawerpublic Vector3 vector3;
  • 35. パッと見たいときに少し使いづらいPropertyDrawer...PropertyDrawerって何
  • 36. [Compact]public Vector3 vector3;https://github.com/anchan828/property-drawer-collection/tree/master/CompactAttributePropertyDrawer...PropertyDrawerって何
  • 37. 自分で作れるPropertyDrawer
  • 38. 自分で作れるPropertyDrawer[Compact]public Vector3 vector3;using UnityEngine;public class CompactAttribute : PropertyAttribute {}
  • 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. 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. 唯一、使い回し出来るEditor拡張(だと思ってる)プロジェクトと切り分けてコードを書くことが容易PropertyDrawer
  • 42. ネタPreviewTexturehttps://github.com/anchan828/property-drawer-collection/tree/master/PreviewTextureAttributePropertyDrawer
  • 43. AnimatorParameterLabelSearchPasswordPopupSceneName要望/バグあればissueお願いhttps://github.com/anchan828/property-drawer-collectionPropertyDrawer
  • 44. EditorWindow
  • 45. EditorWindowEditorWindowって何UnityEditorはEditorWindowで成り立っている
  • 46. EditorWindow
  • 47. EditorWindow
  • 48. EditorWindow
  • 49. EditorWindow
  • 50. EditorWindow
  • 51. EditorWindow
  • 52. EditorWindowEditorWindowの作り方EditorWindowはScriptableObject継承
  • 53. EditorWindowEditorWindowの作り方EditorWindowはScriptableObject継承なのでCreateInstanceで生成できる
  • 54. EditorWindowEditorWindowの作り方CreateInstance複数同じEditorWindow生成
  • 55. EditorWindowEditorWindowの作り方CreateInstanceGetWindow<T>複数同じEditorWindow生成必ず1つのEditorWindow生成
  • 56. EditorWindowEditorWindowの作り方GetWindowについて• 内部でCreateInstanceが呼び出される
  • 57. EditorWindowEditorWindowの作り方GetWindowについて• 内部でCreateInstanceが呼び出される• 生成されたEditorWindowはキャッシュされる
  • 58. EditorWindowEditorWindowの作り方GetWindowについて• 内部でCreateInstanceが呼び出される• 生成されたEditorWindowはキャッシュされる• Showが呼ばれる
  • 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. EditorWindowEditorWindowでGUIUnityのGUIStyleを使いたい
  • 61. EditorWindowEditorWindowでGUIEditorGUIUtility.GetBuildinSkin
  • 62. EditorWindowEditorWindowでGUIEditorGUIUtility.GetBuiltinSkinGameSceneInspectorSkin
  • 63. EditorWindowEditorWindowでGUIEditorGUIUtility.GetBuiltinSkinGameSceneInspectorLabelButtonToggleSkinStyle
  • 64. EditorWindowEditorWindowでGUIEditorStylesEditorGUIUtility.GetBuiltinSkinGameSceneInspectorLabelButtonToggleSkinStyle
  • 65. EditorWindowEditorWindowでGUIEditorStylesEditorGUIUtility.GetBuiltinSkinGameSceneInspectorLabelMini ButtonToggleLabelButtonToggleSkinStyle
  • 66. EditorWindowEditorWindowでGUIビルドインされてるGUISkinのCustomStyleを使いたいUnityのGUIStyleを使いたい
  • 67. EditorWindowビルドインのGUISkinにあるCustomStyle名を知る
  • 68. EditorWindow現在ではCustomStyle名を知る術はないビルドインのGUISkinにあるCustomStyle名を知る
  • 69. EditorWindow現在ではCustomStyle名を知る術はないむりやり知るには、ScriptableObjectで保存ビルドインのGUISkinのCustomStyle名を知る
  • 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. EditorWindow.assetで保存してInspectorで見る400以上CustomStyleがあるBuildInSkinのCustomStyle名を知る
  • 72. EditorWindowBuildInSkinのCustomStyle名を知るただしStyle名は今後変更される可能性があるので注意.assetで保存してInspectorで見る400以上CustomStyleがある
  • 73. EditorWindowUnityらしいEditorWindowを作成する混乱を招かないように
  • 74. GUIを知るはじめの一歩• CustomEditor ( Attribute )• Editor ( Class )この2つを知ること
  • 75. EditorEditorクラスって何?インスペクターとシーンビューのGUIを表示するためのクラス
  • 76. EditorOnInspectorGUI インスペクターのGUIを描画する
  • 77. EditorOnInspectorGUIOnPreviewGUI プレビューを描画するインスペクターのGUIを描画する
  • 78. EditorOnInspectorGUIOnPreviewGUI プレビューを描画するインスペクターのGUIを描画するOnSceneGUI シーンビューのGUIを描画する
  • 79. EditorOnInspectorGUI3rd Person Controller ( Prefab )
  • 80. EditorOnInspectorGUIOnPreviewGUI3rd Person Controller ( Prefab )
  • 81. EditorOnInspectorGUIOnPreviewGUI3rd Person Controller ( Prefab )OnSceneGUI
  • 82. Editor3rd Person Controller ( Prefab )
  • 83. EditorGameObjectInspectorTransformInspectorCharacterControllerEditorAnimationEditorMonoScriptInspector
  • 84. EditorTransform Inspectorみたいなのを作るにはCustomEditorを使う
  • 85. CustomEditorCustomEditorって何Editorを継承したクラスを使用するためのAttribute
  • 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. OnInspectorGUIOnPreviewGUIこの部分を自由にカスタマイズできるようになるOnSceneGUICustomEditor
  • 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. EditorGUI使いたいけどどうするの?Editor.CreateEditorでEditor作ってOnInspectorGUIEditor.CreateEditor ( transform );
  • 90. EditorPreview使いたいけどどうするの?Editor.CreateEditorでEditor作ってOnPreviewGUIEditor.CreateEditor ( material );
  • 91. Editorこんな感じでEditorを生成するEditor.CreateEditor ( transform );Editor.CreateEditor ( material );CustomEditorが複数ある場合はEditor.CreateEditor ( transform, typeof(CustomTransform) );
  • 92. EditorEditorクラスを理解することがエディタ拡張(GUI)のスタートライン
  • 93. 各WindowのOnGUI既にUnityに実装してあるEditorWindow
  • 94. EditorWindow
  • 95. 各WindowのOnGUIOnGUIイベントをデリゲートに登録できる• プロジェクトウィンドウEditorApplication.projectWindowItemOnGUI• ヒエラルキーウィンドウEditorApplication.hierarchyWindowItemOnGUI
  • 96. 各WindowのOnGUI• プロジェクトウィンドウprojectWindowItemOnGUIファイルサイズ表示
  • 97. 各WindowのOnGUI• ヒエラルキーウィンドウhierarchyWindowItemOnGUIアイコン表示
  • 98. Handles
  • 99. HandlesHandles って何3D GUI を表示するためのクラス
  • 100. Handles3D GUI の種類まだ沢山ある
  • 101. Handlesどこで使う?Editor の OnSceneGUI で書くvoid OnSceneGUI (){ transform.position = Handles.DoPositionHandle (transform.position, Quaternion.identity);}シーンビューで使用する
  • 102. Handles2D GUI と 3D GUI の棲み分け2D GUIを使うときはHandles.BeginGUIvoid OnSceneGUI (){ GUILayout.Label ("表示されない"); }void OnSceneGUI (){ Handles.BeginGUI (); GUILayout.Label ("表示される"); Handles.EndGUI ();}
  • 103. HandlesSceneViewをカスタマイズしよう
  • 104. GUIのお話終わり
  • 105. 時間割いてまでやる必要あるの?必要か?
  • 106. 最後のまとめ開発者自身がEditor拡張は必要!と思うこと触らせたくないものは見せるな!Editorクラスを正しく理解すること
  • 107. Questions ?
  • 108. ご清聴ありがとうございました