Upgrade to Pro — share decks privately, control downloads, hide ads and more …

使われやすいライブラリのための「コ・ツ」〜社内Unityライブラリの思想と設計〜/simple-unity-library

 使われやすいライブラリのための「コ・ツ」〜社内Unityライブラリの思想と設計〜/simple-unity-library

Mikito Yoshiya

May 26, 2021
Tweet

Other Decks in Programming

Transcript

  1. 社内Unityライブラリ・基盤化の取り組み
 • UI Framework
 • Networking Framework
 • Adventure Engine


    • Time Managemnet
 • Resource Management
 • Scene Management
 • Build / CI Support
 • Debug Support
 • Local Storage
 • ...etc
 
 *実ライブラリ名ではありません 
 
 結構がんばっている!

  2. SimpleとEasyは同じようで違う
 • Simple
 ◦ 単純(単一・純粋)
 ◦ 混ざっていない、絡んでいない
 
 • Easy


    ◦ すぐに求めることが実現できる、使い始められる 
 ◦ 今の自分の能力でできる
 Simple Made Easy (Rich Hickey): https://www.youtube.com/watch?v=kGlVcSMgtV4 
 Simple
 Complex
 Easy
 Hard

  3. SimpleとEasyを区別することが大事
 • Easy - Complex
 ◦ 短期的には生産性が高い
 ◦ 中期的には生産性が低下することも 


    
 • Hard - Simple
 ◦ 最初は学習が必要
 ◦ 中期的には生産性を維持
 
 場合によってはこちらの方が重要 
 社内ではこっちを優先したいことも多い 

  4. 多くの要素・他のライブラリに依存
 • 依存は複雑
 ◦ 依存の解決や競合
 ◦ 依存ライブラリのメンテナンス状態の考慮 
 
 •

    UPM的な問題もあり
 ◦ Unityにおいてライブラリ間の依存解決にまだ難あり 
 ◦ OSSはOpenUPMで大分いける? 
 COMPLEX

  5. 依存は厳選する
 • 依存先は安定かどうか
 • 公式の機能や標準に依存するのはよい
 ◦ Unity(uGUI, AssetBundle, JsonUtility, WebRequest...)

    
 ◦ .NET (LINQ, Task, Cryptography...) 
 ◦ 社内標準
 • 簡易実装で代替できないかを検討
 ◦ その代わり拡張を用意:後述
 SIMPLE

  6. 全シチュエーションにライブラリ側で自動対応
 • 利用側からは何も変更ができない
 ◦ シリアライズ形式、フォーマット
 ◦ ちょっとしたパラメータやステップの付与 
 
 •

    ライブラリへの要求と共に複雑性が増す
 ◦ 新しいフォーマットへの対応は? 
 ◦ 全てに対してメンテナンスできる? 
 ◦ 細かい設定の調整は?
 COMPLEX
 Pattern A
 Impl
 Pattern B
 Impl
 Pattern C
 Impl
 Library
 Core Logic
 My App

  7. 抽象化し拡張できるようにしておく
 • 抽象化したインターフェースを外部に公開
 
 • ライブラリ利用側で拡張を実装
 ◦ 依存注入する
 ◦ ライブラリ側で全て作る必要はない!

    
 
 
 SIMPLE
 Pattern A
 Impl
 Library
 Core Logic
 My App
 My Impl
 <Interface>
 抽象化
 Interface公開
 拡張の実装
 依存の注入

  8. 抽象化し拡張に対して開く
 • 依存注入? for Unity
 ◦ ピュアコード x コンストラクタ、セッターインジェクション 


    ◦ SerializeField
 ◦ SerializeReference
 ◦ GetComponentでInterface探す
 • DIContainer(Extenject/VContainer)
 ◦ ライブラリ側で対応を意識できているとよいですね 
 ◦ 隠蔽しなければ良い
 
 SIMPLE

  9. プレハブを配置すれば自動起動
 COMPLEX
 • MonoBehaviourはEasyだけど複雑
 • 初期化タイミングをコントロールしにくい
 ◦ 任意のシーケンス中に初期化したい 
 ◦

    プレイ中に設定変更して再セットアップしたい 
 • 異なるコンテキストで使いにくい
 ◦ 2種の設定を同時に使いたい
 ◦ テストで使いたい

  10. コアロジックをピュアコード化
 • 色々なコンテキストで利用できる
 ◦ コンストラクタなどに依存や設定を渡す 
 ◦ テストも書きやすい
 
 •

    グローバルなマネージャーやシングルトンパターンは一考
 ◦ ex: MyLibrary.Operation()
 ◦ コンストラクタが隠蔽されます
 
 SIMPLE