
このページでは、eBook『Create modular game architecture in Unity with ScriptableObjects』のコンパニオンデモ プロジェクトであるPaddleBallSOの概要と、それがコード アーキテクチャでデザイン パターンとモジュール性をどのように使用しているかを説明します。
これは、e ブックに付属するデモで Unity 開発者を支援するために作成された 6 つのミニガイドシリーズの第 1 弾です。このデモは、古典的なボールとパドルを使ったアーケードゲームメカニクスに着想を得たもので、ScriptableObject がテスト可能でスケーラブル、かつデザイナーにとって使いやすいコンポーネントの作成にどのようにヘルプつかを示しています。
この e ブック、デモプロジェクト、およびこれらのミニガイドは、プログラミングデザインパターンを Unity プロジェクトで ScriptableObject クラスと併用するためのベストプラクティスを提供します。これらのヒントは、コードを簡素化し、メモリ使用量を削減し、コードの再利用性を促進するのにヘルプます。
このシリーズには、次の記事が含まれています。
ScriptableObject デモプロジェクトとこのミニガイドシリーズを掘り下げる前に、その中核をなすデザインパターンは単なるアイデアに過ぎないことを覚えておいてください。すべての状況に当てはまるわけではありません。これらのテクニックは、Unity と ScriptableObject の新しい使い方を学ぶのにヘルプます。
それぞれのパターンには長所と短所があります。特定のプロジェクトにとって意味のあるものだけを選びましょう。デザイナーは Unity エディターに大きく依存していますか?ScriptableObject ベースのパターンは、開発者とのコラボレーションのヘルプに適しています。
結局のところ、最高のコードアーキテクチャは、皆さんのプロジェクトやチームに合ったものです。

PaddleBallSO は、2 人のプレイヤー、2 つのパドル、1 つのボールが登場する、最新のビデオゲームを生み出したクラシックゲームを中心にしています。
ここでは、ゲームメカニクスよりもインフラストラクチャに重点を置いています。これは「ゲーム 配管」と考えてください。アプリケーションの実行を維持するうえで、華やかさは劣るものの非常に重要です。
このプロジェクトでは、ScriptableObject を裏で動作させて統合アプリケーションをビルドする方法に焦点を当てます。これを使用して、プロジェクトメンテナンスを簡素化し、コードの再利用性を促進する、汎用性の高いゲームシステムを構築できます。また、プレイヤーデータ、ゲームステート管理、ゲーム内動作などにも使用できます。
PaddleBallSOプロジェクトは、最新バージョンのUnity長期サポート(LTS)、現在2022 LTSと互換性のあるプロジェクトです。ランタイム UI を作成するための UI Toolkit とユーザー入力を処理する Input System が組み込まれています。

GitHub リポジトリでプロジェクトを探してダウンロードします。
Bootloader_scene をロードするか、「GameSystems」メニューから「Load Bootstrap Scene on Play」を有効にします。再生モードを開始してください。
これらは ScriptableObject に固有のものではありませんが、デモプロジェクトでは、一貫性のある予測可能な状態でゲームアプリケーションを開始するヘルプとして、いくつかの一般的なテクニックを使用しています。
Scene Bootstrapper(またはブートローダー)は、ゲームの初期状態を設定するエディター拡張子スクリプトです。この初期化コードはゲームロジックから分離されており、シーン内のオブジェクトに対するすべての依存関係が正しく設定されます。
依存関係の問題を回避するために、Boottrapper はシーンのロード時に重要なゲームオブジェクト、マネージャー、またはサービスを設定します。
Unityアプリケーションが複数のシーンにまたがる場合、ブートローダーは特定のブートストラップシーンを強制的にロードできます。これはビルド設定の最初のシーンです。再生モードを終了すると、前のシーンが再ロードされます。
ブートストラップシーンの別のコンポーネントである Sequence Manager は、シーンロード時に必須のプレハブをインスタンス化できます。このデモプロジェクトでは、カメラ、スプラッシュスクリーン、UI メニュー、SceneLoader など、ゲームの作成に必要なすべてがプレハブです。
その後、SceneLoader は必要に応じてゲームプレイシーンを追加的にロード (およびアンロード) します。ほとんどの場合、これらのシーンは主にプレハブで構成されます。
プロジェクトシーン
各ミニゲーム レベルは個別のUnityシーンであり、ビルド設定に表示されます。個々のシーンを探る場合は、「GameSystems」メニューで SceneBootstrapper を無効にします。
多くのプロジェクトには、ブートストラップシーンの後にメインメニュー用のステージング領域もあります。この簡略化されたデモプロジェクトでは、メインメニューシーンが省略されています。

「Play」メニューと「Pattern」メニューを使用して、次の PaddleBallSO をテストします。
Core フォルダーには、基本パターンスクリプト、シーン管理、UI ロジックなど、コードベースのアプリケーション固有ではない部分が含まれます。これらは、さまざまなアプリケーションに適用できる、より一般的なクラスです。

サンプルゲームでは、代表的な 2D 物理シミュレーションを再現し、ScriptableObject ベースのデザインパターンの可能性を紹介しています。
ただし、パターンについて説明する前に、アプリケーションを構成する MonoBehaviour について理解しておく必要があります。ご想像の通り、Paddle、Ball、Bouncer、ScoreGoal スクリプトなどのコンポーネントが基本的なゲームプレイを制御します。
ゲームフローを制御するいくつかの上位レベルのマネージャースクリプト:
これらの MonoBehaviour は ScriptableObject と連動します。これらのコンポーネントを橋渡しして、コンポーネント間で通信およびデータ共有できるようにする重要な役割を果たします。
イベントは、プロジェクトのさまざまな部分間のコミュニケーションに役立ちます。これらのマネージャースクリプトを、ほかのシーンオブジェクトやユーザーインターフェースと接続します。このイベント駆動型のアーキテクチャは、コードをより整理してデバッグしやすくするのにヘルプます。
また、最も一般的な ScriptableObject パターンごとに簡略化されたデモ例も提供しています。ScriptableObject に慣れると、ミニゲームのアーキテクチャを支える ScriptableObject の理解を開始できます。
もっと少ないコード行で、注目のミニゲームを作ることもできましたが、このデモでは特に ScriptableObject を使ったデザインパターンに焦点を当てています。これらのパターンの多くは、ScriptableObject なしでも実装できます。
チームで各パターンをプロジェクトにどのように適用するかを決め、自分に最も適したアプローチを選択します。

ソフトウェア開発のモジュール性には、アプリケーションをより小さく独立した部分に分割することが含まれます。これらのモジュールは特定の目的に適しており、個別に開発およびテストできます。
各小さなオブジェクトセットは 1 単位として機能し、ゲームの 1 つの側面を処理します。これには、プレイヤー入力の制御、物理演算の処理、スコアの集計などが含まれます。
プロジェクトスクリプトを探るする際には、以下のキーなポイントに注意してください。
大きなモノリシックスクリプトを小さなピースにリファクタリングすることで、再利用性とスケーラビリティビリティが向上します。これにより、チームのコラボレーションが向上し、テストが簡素化されます。

ScriptableObject のユースケースを実演するために、PaddleBallSO プロジェクトを作成しました。ここでは、これらのツールのアクションを実際に目にする具体的な場所をいくつか紹介します。
デザインパターンのデモもぜひご覧ください。

ScriptableObjectは、ゲームデータを保存し、ワークフローを効率化するための強力なツールですが、プロジェクトを乱雑にしないためには、それらを効果的に使用することが不可欠です。
UnityでScriptableObjectを使用するためのベストプラクティスをいくつか紹介します。
これらのガイドラインに従うことで、よくある開発上の落とし穴を回避できます。

ScriptableObject を使ったデザインパターンの詳細については、e ブック「Create modular game アーキテクチャ in Unity with ScriptableObjects」をお読みください。また、一般的な Unity 開発のデザインパターンについては、e ブック「Level up your コード with game programming patterns」をご覧ください。