カジュアルゲーム用のライブラリを作って開発速度を上げた

未分類

前からやろうと思っていてなかなかやっていなかった共通部品のライブラリ化をお盆の期間を利用して作りました。

作るゲームに必要な専用の処理以外実装しないでいいようにする!をゴールとして作成しました。

導入コストを減らすためにやったこと

unitypackageや雛形のプロジェクトを作ってそれをコピーして流用するやり方も考えましたが、
以下の点を考えて、gitで管理してサブモジュールとして追加する形にしました。

サブモジュールにした理由

主にリリースしている全アプリへ変更対応を行うのがかなりしんどい&漏れが出る、競合の可能性があることを懸念しました

  • FireBaseやAdmobに変更が入った際に各アプリごとへの入れ直し
  • サーバサイドのAPI変更の反映
  • 共通部品の不具合の反映

サブモジュールのディレクトリ構成

サブモジュール運用するにあたって、以下のディレクトリだけ管理するようにしました

BaseProjectAssets/:開発時にAssetsディレクトリ直下にサブモジュールとして追加します
BaseProjectAssets/BaseAssets/:この下に各機能を配置しています
BaseProjectAssets/BaseAssets/Editor/:エディタ拡張やテンプレートなど、ビルド時に含めないもの
BaseProjectAssets/BaseAssets/Editor/Extension:エディタ拡張BaseProjectAssets/BaseAssets/Editor/Template:テンプレート系(シーン、プレハブ、gitignoreなど)
BaseProjectAssets/BaseAssets/GooglePackages/:
BaseProjectAssets/BaseAssets/Plugins/iOS/:iOSのビルドの自動化ファイルのみ配置
BaseProjectAssets/BaseAssets/Res/:ローカルリソース類を配置
BaseProjectAssets/BaseAssets/Resources/:コードから参照する可能性のあるものを配置
BaseProjectAssets/BaseAssets/Resources/Audio/:基本的なSEなどを一応配置
BaseProjectAssets/BaseAssets/Scripts:よく使う機能の共通クラスなど

今回はハイパーカジュアルとかでの使用を想定していて、アップデートはそんなに無いのでjenkinsは使用せず、ビルドはビルドファイルである程度やる方向にしました

プロジェクトの自動セットアップ機能

各共通部品が最初からセットされるだけでは満足できなかったので、エディタ拡張でプロジェクト内でボタン押下時に下記の処理を行ってある程度自動でファイルやクラスを生成するようにしました。

自動化内容

  • スプラッシュ、タイトル、メインのゲーム画面のベース、リザルト、ランキング画面とその管理クラスの自動生成
    • タイトルとランキング、リザルト画面に関してはほぼ実装が不要なように
      ユーザ登録、ランキング登録、ランキング取得処理まで自動で実装するようにしています
  • gitignoreの自動追加
    • テンプレートにあるgitignoreをプロジェクトルートの適切な位置に配置します
  • 定数・多言語管理クラスの自動生成
  • カスタム可能なポップアップ、ローディング画面などのプレハブの生成

共通化した機能

下記を共通化しました

  • 通信クラス
  • 各ストアのレビューポップアップ表示処理
  • 最新のアプリバージョンのチェック及びメンテナンス情報取得
  • 利用規約表示
  • ユーザ登録
  • ランキング登録・取得
  • 回遊上昇のための自社アプリ宣伝用のポップアップやリスト表示
  • FireBase、Admob周りのイベントや広告表示
  • 設定ポップアップ(SE,BGMのミュート、バイブのON・OFF、言語切替)
  • 音管理クラス(SE,BGMの再生、停止、ミュート)
  • ゲーム設定クラス
  • 画面の基礎クラス
  • よく使う演出系クラス(Fade,Scale,Moveなど)
  • 設定言語に紐づく文言取得クラス
  • メッセージポップアップ表示
  • ヘルプポップアップ(言語ごとのヘルプで使う画像の設置だけでOK)
  • Log関数(リリースビルド指定時の非表示や、Objectを渡したらそのクラス内の情報取得)
  • マルチ解像度対応用クラス
  • その他色々

活躍している機能

DB接続周り

  • プロジェクトごとにIDを設定しており、APIでリクエスト時にIDに紐づくDBへ接続しデータの登録参照を行うようにしています

自社アプリへの回遊処理周り

リリース済みのアプリ一覧は各ストアのリンクを貼ればいいですが、
特定のタイミングで全画面のアプリ広告を出したかったのでそこら辺を自動化しました。
プロジェクトの設定ボタン押下時に自動実装されるので、
UIの追加なども不要で表示されるようになります。

取得されるアプリはリリース中のもののみとなります。

ゲーム制御クラス

  • ビルド設定や広告・Firebaseなどの設定をInspectorで行えるようにしました
  • 内部では広告の表示タイミングの管理や、イベントの発行タイミングやゲーム全体の細かな部分を制御しています

FirebaseやAdmob広告周り

  • イベント発行処理や広告表示処理の共通化など

画面基底クラス

  • 画面制御クラスの元となるbaseクラス
  • バックグラウンド遷移時のポーズや全画面広告の表示
  • ローディングマスクの表示
  • 別シーンからのデータの受け渡し
  • その他諸々

メッセージポップアップ

  • ネイティブの柔軟なコードから生成できるメッセージダイアログが欲しかったので作成
  • コードからタイトル、メッセージ、ボタンの数、コールバックなどを設定できます
  • AddView関数を使用するともう少しカスタマイズしたレイアウトにしたりもできます
  • UI自体はプロジェクト初期化時にプレハブが自動で生成されるので、ゲームに合わせて背景やフォントだけ差し替えてます

作ってみての感想

作ってみての感想ですが、使用感としてはかなりいいです。
開発工数は少なくとも1,2週は短縮できていると思います。

実際にライブラリを使ってみて、こんな機能のも欲しいなと思ったら作成してPushしたら他のプロジェクトでもPullするだけで反映されるのでかなりストレスフリーです。

もし、個人開発などされていて開発期間を短くしたい場合の参考になればと思います。

コメント