1. 手に入るもの
Common Game System とは何か、プロジェクトに提供される 23 のサービス、そして意図的に含めていないもの。
1.1 Common Game System とは?
Common Game System(CGS)は Unity 6.3 LTS 向けの C# 基盤フレームワークです。セーブ、オーディオ、入力、シーンロード、タイマー、トゥイーンなど、あらゆるゲームが必要とする配管部分を、すぐに使える 23 のサービスとしてプロジェクトに提供します。
23 のサービスはすべて、Play を押すと自動的に起動します。1 つのブートストラップコンポーネントが、あなたの最初のスクリプトが走る前にすべてを登録します。シーンにドラッグするものも、設定するものもありません。あなたのコードは、ただサービスを要求して使うだけです:
[SerializeField] private AudioClip clickClip;
private void OnButtonClicked()
{
var audio = ServiceLocator.Resolve<IAudioService>();
audio.PlaySfx(clickClip);
}
CGS はコードのみで構成されています。画面には何も描画せず、アートスタイルも、ジャンルも、プロジェクト構成も押しつけません。ゲームはこれまでどおり自分のやり方で書き続けてください。CGS はその下で動く機構を引き受けます。
1.2 解決する問題
大半の Unity プロジェクトは同じように始まります: 「Managers」フォルダです。前のプロジェクトからコピーした SaveManager。記憶を頼りに書き直した AudioManager。タイムスケール用のシングルトン、フェード用のヘルパー、作りかけのオブジェクトプール。どれもプロジェクトごとに書き直され、テストされることはまれで、毎回違うやり方で配線されます。
CGS は、そのフォルダの完成形です。すべてのサービスは:
- 一貫している。 どのサービスにも同じ方法で、1 つのロケーター経由でアクセスします。パターンを一度覚えれば、23 すべての使い方が分かります。
- テスト済み。 フレームワークには 2,600 以上の自動テストが同梱されています。自分でインポートして実行することもできます(第 3 章を参照)。
- ドキュメント化されている。 すべてのサービスに、パッケージ内
Documentation/Modules/配下の専用リファレンスページがあります — 同じリファレンスが、このサイトのサービスリファレンスとしてオンラインでも読めます。 - 差し替え可能。 すべてのサービスはインターフェイスの背後にあります。1 行で独自実装に差し替えることも、サービスを完全にオフにすることもできます(下記 1.4 節を参照)。
1.3 23 のサービス一覧
各サービスは 1 つのインターフェイスです。以下の表は、ゲームにとっての役割ごとにグループ化しています。各サービス名から完全なリファレンスページへリンクしています。
セーブと設定
| サービス | ゲームのために何をしてくれるか |
|---|---|
ISaveService | 名前つきスロットを持つ JSON セーブファイル。書き込みはアトミックなので、クラッシュしても既存のセーブが壊れることはありません。 |
IConfiguration | セッションをまたいで永続化される、型付きの設定グループ(オーディオ音量、グラフィックスオプションなど)。 |
IAchievementService | ローカルのプレイヤー統計と実績。統計値がしきい値を超えると、実績は自動的に解除されます。 |
入力と UI
| サービス | ゲームのために何をしてくれるか |
|---|---|
IInputService | 名前つきアクションマップ("Gameplay"、"Menu")を通じてゲームパッドとキーボードの入力を読み取り、対話的なキーリバインドにも対応します。 |
IInputKeyMapSource | 入力アクションアセットを供給し、プレイヤーのリバインド変更を保存します。 |
IPanelStack | UI パネル(メニュー、ダイアログ)のプッシュとポップを行い、ゲームパッドとキーボードのフォーカスを常に正しいパネルに保ちます。 |
ILocalizationService | キーで表示テキストを引き、実行時に言語を切り替えます — 再起動は不要です。 |
オーディオ、シーン、アセット
| サービス | ゲームのために何をしてくれるか |
|---|---|
IAudioService | AudioMixer を通じて音楽、効果音、ボイスを再生し、チャンネルごとの音量制御を提供します。 |
ISceneService | ローディング画面、キャンセル、加算ロード/アンロードつきで、シーンを非同期に読み込みます。 |
IAddressableSceneService | ビルドリストではなく Addressables コンテンツにある加算シーンを読み込みます。 |
IAssetProvider | Addressables アセットを読み込んで参照カウントを管理し、誰も使っていなくなったときだけアセットを解放します。 |
時間とモーション
| サービス | ゲームのために何をしてくれるか |
|---|---|
ITimeService | ゲームプレイ、UI、バックグラウンド処理のそれぞれに独立したクロック。メニューをアニメーションさせたまま、ゲームプレイだけをポーズやスロー再生できます。 |
IScheduler | タイマー: 遅延後、一定間隔ごと、または次のフレームに処理を実行します。メインスレッドでの処理実行にも使えます。 |
ITweenService | 31 種類のイージングカーブで任意の値を時間経過とともにアニメーションさせます。トゥイーンはゲームのポーズと連動して停止します。 |
ITweenSequenceService | トゥイーンを連結して、順次または並列のタイムラインにします。複数ステップからなるイントロアニメーションなどに使えます。 |
ロジックとユーティリティ
| サービス | ゲームのために何をしてくれるか |
|---|---|
ILogger | 散らばった Debug.Log 呼び出しを置き換える、カテゴリ分けされたフィルタリング可能なロギング。 |
IEventBus | 型安全なパブリッシュ/サブスクライブ。システム同士は直接参照ではなくイベントで対話します。 |
IDeferredBus | イベントをいまキューに入れ、あなたが指示したタイミングで後から配信します — ローディング中やカットシーン中に便利です。 |
IObjectPoolService | プレハブのインスタンス(弾丸、パーティクル)を毎回生成・破棄するのではなく再利用します。 |
IRandomService | 名前つきストリームを持つシード付き乱数。結果は再現可能で、セーブとロードをまたいでも維持されます。 |
IStateMachineService | AI やゲームフロー用のシンプルなステートマシンを、enter・exit・遷移ルールつきで構築します。 |
IPushdownStackService | 入れ子になったゲームステートを管理します — 例えば、ゲームプレイの上に重ねたポーズ画面を、きれいに取り除くといった処理です。 |
ICommandRegistry | 開発者コンソールやチート用のランタイムコマンドレジストリ。コンソール UI は自分で用意します。動作するサンプルつきです。 |
1.4 すべてのサービスにオフスイッチがある
各サービスには「null」の双子が同梱されています: あらゆる呼び出しを受け入れて何もしないバージョンです。プロジェクトにすでにオーディオソリューションがあるなら、CGS のものを 1 行でオフにできます:
ServiceLocator.Replace<IAudioService>(new NullAudio());
フレームワークの残りの部分はそのまま動き続けます。オーディオサービスと対話するコードはすべてコンパイルも実行もされたまま — ただ無音になるだけです。同じ 1 行のスイッチが 23 すべてのサービスに用意されており、同じ仕組みで null 版の代わりに独自実装を差し込むこともできます(第 7 章に全一覧があります)。
1.5 CGS ではないもの
境界を先に知っておくと時間の節約になります:
- ゲームプレイコンテンツはありません。 キャラクター、インベントリ、ダメージ計算式、レベルは含まれません。CGS が提供するのは仕組みで、コンテンツはあなたのゲームが提供します。(各部品の組み合わせ方は、小さな RPG 風サンプルが示しています。)
- レンダリングはありません。 CGS にはシェーダー、マテリアル、パイプラインコードは含まれません。URP、HDRP、ビルトインパイプラインのいずれでもまったく同じに動作します。
- シングルプレイヤー、PC 中心です。 CGS は Windows、macOS、Linux 上のシングルプレイヤーゲームを対象としています。ネットワーキング層はなく、モバイルやコンソール向けのプラットフォーム対応もありません。
1.6 動作要件
- Unity 6.3 LTS。 CGS は Unity 6.3 LTS 上でビルドおよびテストされています。
- よく使われる 3 つの Unity パッケージ、いずれも任意。 Input System パッケージ(入力サービスが使用)、uGUI(UI パネルスタックとデモシーンが使用)、Addressables(アセットサービスと Addressable シーンサービスが使用)です。Input System と uGUI は新規 Unity プロジェクトに最初から入っており、このパッケージをインポートすると足りないもの — Addressables を含む — が依存関係リストを通じて自動的にインストールされるため、ほとんどのユーザーは手動で何かをインストールする必要はありません。
CGS は 7 つのアセンブリに分割されています。コアアセンブリは 18 のサービスを持ち、Unity 本体以外には何にも依存しません。残りのアセンブリは、それぞれ 1 つの任意パッケージをラップします。パッケージを削除すると — 例えば Addressables を — 対応する CGS アセンブリは静かにコンパイル対象から外れます。フレームワークの残りは変わらずコンパイル・動作し、uGUI がなくなった場合は UI パネルスタックが安全な何もしないサービスに退避します。任意パッケージの欠落が原因でエラーの壁に遭遇することは決してありません。完全なアセンブリマップは第 7.1 章にあります。