Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
使われやすいライブラリの ための「コ・ツ」 社内Unityライブラリの思想と設計 Gotanda.unity #18 ワンダープラネット株式会社 Mikito Yoshiya
Slide 2
Slide 2 text
吉谷幹人 - Mikito Yoshiya ワンダープラネット株式会社 タノシムスタジオ テックリード @mikito0521
Slide 3
Slide 3 text
● これからUnity案件に取り組み始めますか? ● 新入社員のオンボーディングに困っていませんか? 専門学校教科書採用実績 大手ゲーム会社新卒配布実績 【宣伝】改訂版がでます! Unity2021 実践入門 Amazon (6/15)
Slide 4
Slide 4 text
今日は Unityのライブラリを作る際に 気をつけたいこと について話します
Slide 5
Slide 5 text
社内Unityライブラリ・基盤化の取り組み ● UI Framework ● Networking Framework ● Adventure Engine ● Time Managemnet ● Resource Management ● Scene Management ● Build / CI Support ● Debug Support ● Local Storage ● ...etc *実ライブラリ名ではありません 結構がんばっている!
Slide 6
Slide 6 text
SimpleとEasyの話
Slide 7
Slide 7 text
SimpleとEasyは同じようで違う ● Simple ○ 単純(単一・純粋) ○ 混ざっていない、絡んでいない ● Easy ○ すぐに求めることが実現できる、使い始められる ○ 今の自分の能力でできる Simple Made Easy (Rich Hickey): https://www.youtube.com/watch?v=kGlVcSMgtV4 Simple Complex Easy Hard
Slide 8
Slide 8 text
SimpleとEasyを区別することが大事 ● Easy - Complex ○ 短期的には生産性が高い ○ 中期的には生産性が低下することも ● Hard - Simple ○ 最初は学習が必要 ○ 中期的には生産性を維持
Slide 9
Slide 9 text
SimpleとEasyを区別することが大事 ● Easy - Complex ○ 短期的には生産性が高い ○ 中期的には生産性が低下することも ● Hard - Simple ○ 最初は学習が必要 ○ 中期的には生産性を維持 場合によってはこちらの方が重要 社内ではこっちを優先したいことも多い
Slide 10
Slide 10 text
Simpleさを保つコツを3テーマに分けて紹介します SIMPLE COMPLEX アンチパターン 解消パターン
Slide 11
Slide 11 text
混ぜない・絡ませない Simpleを保つためのコツ1/3
Slide 12
Slide 12 text
1ライブラリで多種多様なことが実現できる ● いろいろできるはEasyだけど複雑 ● 要素が多くなるほど不要な考慮が増える ○ 使わない機能の競合 ○ リリース・更新回数の増加 ○ セキュリティリスク COMPLEX Component A Component B Component C リソース管理 課金処理 エディター拡張
Slide 13
Slide 13 text
コンセプトを明確に・責務を1つに ● 同タイミングで変更するものはまとめ、異なるものは分ける ○ 閉鎖性共通の原則(単一責任の原則) ● 適切な名前をつける ○ 名は体を表す ○ 失敗例:社内のGotandaLib(LINQの拡張ライブラリ) SIMPLE
Slide 14
Slide 14 text
多くの要素・他のライブラリに依存 ● 依存は複雑 ○ 依存の解決や競合 ○ 依存ライブラリのメンテナンス状態の考慮 ● UPM的な問題もあり ○ Unityにおいてライブラリ間の依存解決にまだ難あり ○ OSSはOpenUPMで大分いける? COMPLEX
Slide 15
Slide 15 text
依存は厳選する ● 依存先は安定かどうか ● 公式の機能や標準に依存するのはよい ○ Unity(uGUI, AssetBundle, JsonUtility, WebRequest...) ○ .NET (LINQ, Task, Cryptography...) ○ 社内標準 ● 簡易実装で代替できないかを検討 ○ その代わり拡張を用意:後述 SIMPLE
Slide 16
Slide 16 text
設定や手順を隠蔽しない Simpleを保つためのコツ2/3
Slide 17
Slide 17 text
全シチュエーションにライブラリ側で自動対応 ● 利用側からは何も変更ができない ○ シリアライズ形式、フォーマット ○ ちょっとしたパラメータやステップの付与 ● ライブラリへの要求と共に複雑性が増す ○ 新しいフォーマットへの対応は? ○ 全てに対してメンテナンスできる? ○ 細かい設定の調整は? COMPLEX Pattern A Impl Pattern B Impl Pattern C Impl Library Core Logic My App
Slide 18
Slide 18 text
抽象化し拡張できるようにしておく ● 抽象化したインターフェースを外部に公開 ● ライブラリ利用側で拡張を実装 ○ 依存注入する ○ ライブラリ側で全て作る必要はない! SIMPLE Pattern A Impl Library Core Logic My App My Impl 抽象化 Interface公開 拡張の実装 依存の注入
Slide 19
Slide 19 text
抽象化し拡張に対して開く ● 依存注入? for Unity ○ ピュアコード x コンストラクタ、セッターインジェクション ○ SerializeField ○ SerializeReference ○ GetComponentでInterface探す ● DIContainer(Extenject/VContainer) ○ ライブラリ側で対応を意識できているとよいですね ○ 隠蔽しなければ良い SIMPLE
Slide 20
Slide 20 text
プレハブを配置すれば自動起動 COMPLEX ● MonoBehaviourはEasyだけど複雑 ● 初期化タイミングをコントロールしにくい ○ 任意のシーケンス中に初期化したい ○ プレイ中に設定変更して再セットアップしたい ● 異なるコンテキストで使いにくい ○ 2種の設定を同時に使いたい ○ テストで使いたい
Slide 21
Slide 21 text
コアロジックをピュアコード化 ● 色々なコンテキストで利用できる ○ コンストラクタなどに依存や設定を渡す ○ テストも書きやすい ● グローバルなマネージャーやシングルトンパターンは一考 ○ ex: MyLibrary.Operation() ○ コンストラクタが隠蔽されます SIMPLE
Slide 22
Slide 22 text
提供しすぎない Simpleを保つためのコツ3/3
Slide 23
Slide 23 text
いろいろなメソッドを公開 COMPLEX ● 不要な要素や選択肢があることは複雑 ● リファクタリングで様々なプロジェクトが死にます
Slide 24
Slide 24 text
不要なInterfaceは公開しない ● 拡張に対して開き・変更に対しては閉じる ○ 全再利用の原則(インターフェース分離の原則) ○ 開発初期は意識的に絞る・拡張性もあとでいい ● 最初にテスト/サンプル/Demoをつくる ○ 必要最低限がわかる SIMPLE
Slide 25
Slide 25 text
超絶UXなエディター拡張 COMPLEX ● GUIはEasyだが複雑 ● エディターコードもソース・機能の一部 ○ メンテナンスが必要 ○ 要素が増えれば複雑性は上がる
Slide 26
Slide 26 text
GUIが必要か冷静になって考える ● そのEasyさ本当に必要ですか? ● EasyじゃないけどSimpleな方法を探す ○ インスペクタの拡張 -> ymlとかjsonとかでデータ読み込み ○ セットアップウィザード -> READMEで手順を説明 SIMPLE
Slide 27
Slide 27 text
まとめ ● ライブラリ開発ではSimple / Easyを区別することが大事 ● Simpleを保つために ○ 混ぜない・絡ませない ○ 設定や手順を隠蔽しない ○ 提供しすぎない
Slide 28
Slide 28 text
注意 ライブラリ・プラグインにはそれぞれコンセプトがあり、 本資料のアンチパターンが全てに適用されるわけではありません。 あくまで社内ライブラリの選定基準・開発視点でのお話です。