Singletonは便利なんだけどあまり使いたくない… そんなあなたにSingletonを使用せずに実装されたApplicationの考え方や設計などを紹介します。
Singletonを使わないUnityを用いたApplication開発ポケコロツイン事例紹介
View Slide
自己紹介堀尾 大地● ポケコロツイン clientエンジニア職務経歴● 株式会社Aiming(約5年)● 株式会社インディゴゲームスタジオ(約 1年)● cocone株式会社 <= イマココ趣味● ゲーム● youtubeでhololiveの配信を見る● 欅坂46/櫻坂46
目次1. Singletonを使いたくない理由2. ポケコロツインの実装紹介3. まとめ
Singletonを使いたくない理由
Unityを使ってApplicationを作る● UnityがSceneを起点としている● アプリやチームの規模が大きくなってくると複数のSceneができる● Scene間でデータのやり取りをする仕組みが欲しくなる
Unityを使ってApplicationを作る● UnityがSceneを起点としている● アプリやチームの規模が大きくなってくると複数のSceneができる● Scene間でデータのやり取りをする仕組みが欲しくなる↓そうだ、Singletonを使おう。
Singletonが手っ取り早くて実装も簡単…だけど?● Scene間のやり取りのために作ったのにどこからでも呼べる便利クラス化● ボタン押したらボタン制御クラスが急にSingletonを呼び出したりしてこれどうやって動いてるんだ…?ってなる● Singletonを1個作るとどんどん生まれる(割れ窓)● 複数のSingleton同士が依存しあって初期化を変えると全部死ぬ、処理が追えなくなる
Singletonが手っ取り早くて実装も簡単…だけど?● Scene間のやり取りのために作ったのにどこからでも呼べる便利クラス化● ボタン押したらボタン制御クラスが急にSingletonを呼び出したりしてこれどうやって動いてるんだ…?ってなる● Singletonを1個作るとどんどん生まれる(割れ窓)● 複数のSingleton同士が依存しあって初期化を変えると全部死ぬ、処理が追えなくなる↓管理コスト高くない?
結局使う人による● 使用ルールを作って必要最低限だけをSingletonでカバーするとかなら全然いいと思う● 人の入れ替わりが起こる運営型のProjectでずっと保守できる?
結局使う人による● 使用ルールを作って必要最低限だけをSingletonでカバーするとかなら全然いいと思う● 人の入れ替わりが起こる運営型のProjectでずっと保守できる?↓やりたくない (できる or できない ではない)
話をもとに戻します論点はSingletonを使うか使わないか、どう使うかではなくScene間のデータのやり取りをスムーズに行いたいだけ
話をもとに戻します論点はSingletonを使うか使わないか、どう使うかではなくScene間のデータのやり取りをスムーズに行いたいだけ↓SceneLoad時に必要な情報をScene側に良い感じに渡せれば良いだけ!!!!!
ポケコロツインの実装紹介
Scene CざっくりとしたイメージApplicationManager(MonoBehaviour)Scene BApplicationManagerで共有で使うインスタンスを初期化しておいてLoad時に各Sceneに渡すScene AApplicationOperator(c# class)
ApplicationManagerの役割1. 起点となるSceneに設置されたGameObjectにAttachしApplicationのエントリポイントとなる2. 初期化時にGameObjectをDontDestroy3. Operatorを初期化してインスタンスを保持する
ApplicationOperatorの役割1. 共通で使うインスタンスの初期化と保持2. インスタンス同士の依存などを解決共通で使う処理の例Scene、UI、通信、AssetBundle、Sound、Localデータ、設定データ、ユーザーデータ…など…
SceneClassの定義こんな感じのclassを継承して各Sceneに配置したGameObjectにAttachしておく
SceneのLoad
まとめ
良かった点● Singletonを使わずにScene間のやり取りを実現できた!!!!!!● インスタンスの使用スコープを絞ることが出来る● エントリポイントが明確なので処理が追いやすい● 再利用性が高い
悪い点(?)● 学習コストが高め● 雑にApplicationManager側に処理を作られる
結局、最終的には人をどうやって教育するかになりますね…
ご清聴ありがとうございました。