Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
こわくないエディター拡張入門
Search
ゲムシャリコ
October 14, 2023
Technology
0
170
こわくないエディター拡張入門
unity1week online共有会 #13にて発表させていただいたスライドです。
動画等は配信をご確認ください。
https://youtu.be/COFWY3BrDEw?t=2786
ゲムシャリコ
October 14, 2023
Tweet
Share
Other Decks in Technology
See All in Technology
Docker互換のセキュアなコンテナ実行環境「Podman」超入門
devops_vtj
6
3.2k
ABEMAにおけるLLMを用いたコンテンツベース推薦システム導入と効果検証
cyberagentdevelopers
PRO
1
720
【基調講演】変える、今ここから ― IoTとAIで紡ぐ未来
soracom
PRO
0
320
Classmethod流のPlatform Engineering / classmethod-platform-engineering-devio2024
tomoki10
0
470
E2Eテスト自動化プラットフォームにおけるAIの活用
shift_evolve
0
180
楽しくGoを学び合う、LayerXの勉強会文化 / LayerX's study culture of having fun and learning Go together
ar_tama
2
350
テストケースの自動生成に生成AIの導入を試みた話と生成AIによる今後の期待
shift_evolve
0
180
Classmethod Odyssey 登壇資料
yamahiro
0
390
ゆめみのアクセシビリティの現在地と今後
ryokatsuse
3
290
ACRiルーム最新情報とAMD GPUサーバーのご紹介
anjn
0
150
CEL(Common Expression Language)で書いた条件にマッチしたIAM Policyを見つける / iam-policy-finder
fujiwara3
0
710
推薦システムを本番導入する上で一番優先すべきだったこと~NewsPicks記事推薦機能の改善事例を元に~
morinota
0
120
Featured
See All Featured
The Mythical Team-Month
searls
217
43k
What’s in a name? Adding method to the madness
productmarketing
PRO
21
2.9k
From Idea to $5000 a Month in 5 Months
shpigford
377
46k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
44
4.7k
Faster Mobile Websites
deanohume
303
30k
A Tale of Four Properties
chriscoyier
155
22k
The Brand Is Dead. Long Live the Brand.
mthomps
52
36k
Music & Morning Musume
bryan
43
5.9k
Optimizing for Happiness
mojombo
373
69k
Leading Effective Engineering Teams 2024
addyosmani
3
300
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
121
18k
Robots, Beer and Maslow
schacon
PRO
157
8.1k
Transcript
こわくない エディター拡張入門 ゲムシャリコ 2023/10/14 unity1week 共有会 #13 (お題: 1ボタン)
自己紹介 • 情報系大学 2年生 • ゲームプログラマー志望 • unity1week参加 3回目 @gameshalico
ゲムシャリコ
Orbit 重力2Dアクション 自転に沿って動いたり 公転に沿って動いたり 総合10位(発表時)
エディター拡張? Unityエディターをカスタマイズするもの ヒエラルキーの見た目を整えたり インスペクタにボタンを追加したり
エディター拡張で時短 ちま……ちま…… インスペクターから値を調整 ドラッグ移動で爆速調整
Orbitでの実装 書いたコードはこれだけ!
なんだか難しそう? 見慣れない構文や見たことない関数だらけで 尻込みしてしまいがち? 一回やってみると意外と単純 作業効率UPで作品のクオリティもUP
作ってみよう : 2点間を移動するギミック 本題ではないのでゲーム側の実装は割愛(配布あり)
今回作るもの ハンドルを使って目標点を移動できるようにする
実装 using UnityEditor; using UnityEngine; [CustomEditor(typeof(MoveBetween))] public class MoveBetweenEditor :
Editor { private void OnSceneGUI() { MoveBetween moveBetween = (MoveBetween)target; EditorGUI.BeginChangeCheck(); Vector3 position = Handles.PositionHandle(moveBetween.destination, Quaternion.identity); if(EditorGUI.EndChangeCheck()) { Undo.RecordObject(moveBetween, "Change Destination"); moveBetween.destination = position; } } }
Editorフォルダの作成 「Editor」という名前のフォルダを作成する エディター拡張のScriptはここに入れる Editorフォルダ以下はビルドに含まれない Scripts Editor 別のフォルダとして用意 通常のスクリプト エディター拡張の スクリプト
※ 階層は自由 参考: https://docs.unity3d.com/ja/2023.2/Manual/SpecialFolders.html
using UnityEditor; エディター拡張に関するクラスは UnityEditor名前空間にある。 using UnityEditorを忘れない。 大体のIDEで補完してくれるので こんなのあったな、ぐらいでOK。 ビルドに含まれない コードでのみ利用できる
using UnityEditor; using UnityEngine; クラス等をグループ化して まとめるもの。 各クラスはUnityEditor.Editor のような形で表現できるが、 using で省略できる。 名前空間 参考: https://docs.unity3d.com/ScriptReference/UnityEditor.html
[CustomEditor(typeof(XXX))] このクラスはXXX型のエディター拡張だよ、という宣言 Unity側に教えてあげるイメージ 指定した型の情報を取得する。 型を変数に入れられる形に変換する。 []で囲まれてるやつをAttributeといい、 クラスやメンバーに情報を付加できる。 typeof演算子 Attribute [CustomEditor(typeof(MoveBetween))]
public class MoveBetweenEditor : Editor 参考: https://docs.unity3d.com/ScriptReference/CustomEditor.html
class XXX : Editor MonoBehaviourみたいなもの。 MonoBehaviour(スクリプト)用の エディター拡張のクラスは、 Editorクラスを継承 させる。 [CustomEditor(typeof(MoveBetween))]
public class MoveBetweenEditor : Editor { …… } ScriptableObjectの エディターを拡張するときも Editorクラスを継承して使う。 ScriptableObject Editor MoveBetweenEditor 継承 親 子 参考: https://docs.unity3d.com/ScriptReference/Editor.html
private void OnSceneGUI() { …… } OnSceneGUI() Unityから呼ばれるイベント関数。 Updateみたいなイメージ。 ヒエラルキー上で
選択されているときに呼ばれる。 シーンビューの表示を拡張する。 インスペクターが表示されるときに呼ばれる インスペクターの機能を拡張できる。 UIToolkitではCreateInspectorGUIを使う。 OnInspectorGUI() 2 1 「2」を選択中 「2」のOnSceneGUIが呼ばれている 参考: https://docs.unity3d.com/ScriptReference/Editor.html
this.target 選択している拡張対象のオブジェクト。 Editorクラスのpublic変数。 UnityEngine.Object型で入っているので キャスト(型変換)して使う必要がある。 MoveBetween moveBetween = (MoveBetween)target; 万物の祖。Unity関係のオブジェクトはだ
いたいこいつを継承している。 UnityEngine.Object 「1」を選択中 参考: https://docs.unity3d.com/ja/current/ScriptReference/Editor-target.html
EditorGUI.BeginChangeCheck() EditorGUI.EndChangeCheck() : bool これに囲まれたGUI要素(後述)が 変更されたかを検知する。 EditorGUI.BeginChangeCheck(); …… if(EditorGUI.EndChangeCheck()) {
…… } BeginChangeCheck EndChangeCheck PositionHandle 変更されてる?👀👀 あったよ!(true) or なかったよ!(false) 変更見てるよ! 参考: https://docs.unity3d.com/ja/current/ScriptReference/EditorGUI.BeginChangeCheck.html
Handles.PositionHandle (Vector3 position, Quaternion rotation) : Vector3 移動できるハンドルを制御するGUI要素。 EditorGUI.Begin/EndChangeCheck で囲み、変更を検知する。
Vector3 position = Handles.PositionHandle( moveBetween.destination, Quaternion.identity ); 真ん中の半透明の面を ドラッグすると平面で移動 できるって知ってました? 私は知りませんでした。 参考: https://docs.unity3d.com/ja/current/ScriptReference/Editor-target.html
Undo.RecordObject (Object objectToUndo, string name) アンドゥ(Ctrl+Z)に対応させる。 オブジェクトを変更する直前に呼び出す。 Undo.RecordObject( moveBetween, "Change
Destination“ ); moveBetween.destination = position; Edit>Undo History で確認できる 参考: https://docs.unity3d.com/ja/current/ScriptReference/Undo.RecordObject.html
ね?簡単でしょ? using UnityEditor; using UnityEngine; [CustomEditor(typeof(MoveBetween))] public class MoveBetweenEditor :
Editor { private void OnSceneGUI() { MoveBetween moveBetween = (MoveBetween)target; EditorGUI.BeginChangeCheck(); Vector3 position = Handles.PositionHandle(moveBetween.destination, Quaternion.identity); if(EditorGUI.EndChangeCheck()) { Undo.RecordObject(moveBetween, "Change Destination"); moveBetween.destination = position; } } }
プロジェクト配布 GitHubにて今回の プロジェクトを配布中 今回紹介できなかった MoveBetweenの実装も コメント追記済み https://github.com/gameshalico/unity-custom-editor-sample-move-between
次のステップ • エディター拡張の記事を探して 自分でも実装してみる • 公式のマニュアルを読んでみる • UIToolkitはいいぞ(情報少なめ)
ご清聴ありがとうございました