電子書籍の更新より多くのデザインパターンとSOLIDの原則

THOMAS KROGH-JACOBSEN / UNITY TECHNOLOGIESProduct Marketing Core Tech
Jul 23, 2024|10 分
更新された電子書籍 ゲーム・プログラミング・パターンでプログラミングをレベルアップする
このウェブページは、お客様の便宜のために機械翻訳されたものです。翻訳されたコンテンツの正確性や信頼性は保証いたしかねます。翻訳されたコンテンツの正確性について疑問をお持ちの場合は、ウェブページの公式な英語版をご覧ください。

2022年の秋、私たちは電子書籍を発売したゲーム・プログラミング・パターンでコードをレベルアップしようとサンプルコードを含むGitHubリポジトリを発表した。また、電子書籍とサンプル・プロジェクトに付随する5部構成のビデオ・チュートリアル・シリーズも公開した。

これらのリソースについて、皆さんから素晴らしいフィードバックをいただいており、多くの方からさらなるデザイン・パターンの追加を要望されています。ご意見をお寄せいただきありがとうございます。私たちチームと私は、皆さんのコメントを注意深く見守っており、本当に感謝している。

本日、電子書籍「デザイン パターンと SOLIDでコードをレベルアップ」の更新版がリリースされたことをお知らせできることを嬉しく思います。

電子書籍とサンプルプロジェクトの両方がUnity 6に基づいており、より多くの例とパターンが含まれています。また、このサンプル・プロジェクトには、コミュニティからの要望が多かったデータ・バインディングのデモ例など、UI Toolkitの機能がさらに含まれています。

注:ユニティ6は今年後半に利用可能になる予定だ。ガイドの例や付属のデモプロジェクトに従いたい場合は、Unity 6 Previewをダウンロードしてください。

デザインパターンとSOLIDの原則がUnityプロジェクトにどのような恩恵をもたらすか
SOLIDのインターフェイス分離の原則を適用して、インターフェイスをより小さなものに分割する方法を説明している。
SOLIDのインターフェイス分離の原則を適用して、インターフェイスをより小さなものに分割する方法を説明している。

e-bookの新しいコンテンツに飛び込む前に、このコンセプトにあまり馴染みのない人は疑問に思うかもしれない:なぜデザインパターンについて学ぶ必要があるのですか?また、デザインパターンがUnityゲーム開発にどのように適合するのですか?

あなたのフィードバックに戻ると、オブジェクト指向プログラミングの基本は多くの人にとって馴染み深いものですが、これらの原則を自分のコードに適用すると、抽象的で過度に学術的だと感じることがあります。

こう考えてみよう:あなたが直面するソフトウェア設計の問題には、数え切れないほどの開発者が同じような問題に遭遇しています。彼らに直接アドバイスを求めることはできないが、デザインパターンを通して彼らの解決策から学ぶことはできる。

デザインパターンは、ソフトウェア工学における一般的な問題に対する一般的な解決策を提供する。これらは、あなたのコードにコピー&ペーストするための既製のテンプレートではなく、必要なときに活用できるツールボックスの中のツールなのだ。より直感的に理解できるパターンもあるが、どのパターンもそれぞれの文脈で役に立つ。

私たちは、デザイン・パターンを初めて学ぶ人、あるいは復習が必要な人のためにこのガイドを作成した。これらのパターンが適用できる、ゲーム開発における一般的なシナリオを概説する。JavaやC++のような他のオブジェクト指向言語からC#に移行する場合、これらのパターンをUnityに特別に適応させる方法の実践的な例を見つけることができます。

デザインパターンの核心は、単なるアイデアである。これらはすべての状況に当てはまるわけではないが、正しく使えば、スケーラブルなアプリケーションを構築するのに役立つ。これらをプロジェクトに組み込むことで、コードの可読性と保守性が向上する。これらのパターンに慣れるにつれて、開発プロセスを合理化する機会が見つかるだろう。

つまり、私たちのガイドは、あなたのコーディングスキルを向上させ、より良いUnityプロジェクトを作成し、キャリアを通じて持ち運べる一般的な業界のベストプラクティスの理解を確立するために設計されています。

最新の電子書籍をダウンロードする
更新された電子書籍とプロジェクトの中身は?
単一責任のデモは、プレーヤーをより小さなコンポーネントに分離する。
単一責任のデモは、プレーヤーをより小さなコンポーネントに分離する。

デザイン・パターン・リソースに新しく追加された主なものを見てみよう:

SOLIDの原則の導入方法に関するセクションの拡大

SOLIDの5つの基本原則は現在、それぞれ実用的なコード例をサンプルプロジェクトに実装し、電子書籍で解説している。覚えておいてほしいこととして、SOLIDとはソフトウェア設計の5つの核となる基本事項の頭文字をとったニーモニックです。オブジェクト指向の設計を理解しやすく、柔軟で、保守しやすいものに保つために覚えておくべき5つの基本ルールだと思ってください。

簡単な覚え書きとして、SOLIDは「SOLID」の略である:

  • 単一責任の原則:クラスが変わる理由は1つだけであるべきで、つまり仕事や責任は1つだけであるべきなのだ。
  • オープンクローズの原則:クラスは既存のコードを変更することなく拡張できるように、拡張はオープンだが変更はクローズであるべきだ。
  • リスコフの置換原理:スーパークラスのオブジェクトは、プログラムの正しさに影響を与えることなく、そのサブクラスのオブジェクトと置き換えることができなければならない。
  • 界面分離の原理:クライアントは、自分が使わないインターフェースに依存することを強いられるべきではない。これは、単一の汎用インターフェースよりも、特定のインターフェースの作成を促進するものである。
  • 依存関係の逆転原理:高レベルのモジュールは低レベルのモジュールに依存すべきではなく、どちらも抽象化されたものに依存すべきである。
 SOLIDの各原則には、それぞれデモシーンが用意されており、ゲームにおける一般的な使用例に理論を当てはめた具体的な例が紹介されている。
SOLIDの各原則には、それぞれデモシーンが用意されており、ゲームにおける一般的な使用例に理論を当てはめた具体的な例が紹介されている。

この原則に従うことで、ゲーム開発において以下のような利点が得られるというのが、この事例を読み解く上での重要なポイントです:

  • 読みやすい:明確でよく整理されたコードは、プロジェクトの機能を効率的に理解することを容易にする。SOLIDの原則を遵守することで、コードの可読性を高めることができる。コード標準が一貫していれば、チーム内のゲームプログラマー間のコラボレーションが円滑に進む可能性が高まる。
  • スケーラビリティ:SOLIDの原則を実装することで、保守可能なコードが育つ。これは、規模を拡大したいプロジェクトにとって極めて重要だ。これらの原則を守ることで、コードベースのある部分で加えられた変更が、他の部分で予期せぬ問題を引き起こす可能性は低くなる。このアプローチにより、コードの柔軟性が保たれ、進化する要件に適応できるようになる。
  • ベロシティ最終的に、SOLIDの原則はゲーム開発ワークフローの改善に貢献する。SOLIDが強調する重要な側面であるモジュラーコードは、システムをより小さく、管理しやすいコンポーネントに分解することを意味する。このモジュラー・アプローチは、テスト、デバッグ、プロジェクト間でのコードの再利用を容易にし、開発時間の短縮と生産性の向上を実現します。
合計11のパターンが電子書籍とサンプルで紹介されている。
データバインディングと Model-View-ViewModel パターンを健康バーの測定に使用した例
データバインディングと Model-View-ViewModel パターンを健康バーの測定に使用した例

電子書籍とプロジェクトが更新され、新たに4パターンが加わり、合計11パターンとなった。それぞれの概要は以下の通り:

  • 工場出荷時のパターン:典型的な使用例としては、パワーアップ(スピード・ブースト、シールド、余命など)があり、それらはいくつかの属性を共有しながらも、異なる機能を持っている場合がある。ここでは、ファクトリーパターンを使用して、共通のインターフェイスまたは基本クラスから派生したこれらの異なるパワーアップクラスのインスタンスを作成することができ、既存のクライアントコードを変更することなく、新しいパワーアップを柔軟に追加することができます。
  • オブジェクト・プーリング:これをデザインパターンというより、パフォーマンス最適化のテクニックと呼ぶ人もいるだろう。いずれにせよ、オブジェクトを頻繁に生成・破棄するのではなく、再利用することでパフォーマンスを向上させる方法だと考えてほしい。サンプルシーンでは、大量の弾丸を高速で発射する砲塔の例をご覧いただけます。その都度インスタンス化する(そして一旦目的を果たしたら、大きなパフォーマンス・コストをかけてクリーンアップする)のではなく、パターンを使って何度も再利用するのだ。
  • シングルトンシングルトンは、ゲーム開発でよく使われるパターンのひとつだろう。シーン全体のアクションを調整する1つのオブジェクトが必要な場合に便利です。たとえば、メインゲームのループを指示するために、シーンに1人のゲームマネージャーが必要かもしれません。しかし、シングルトン・パターンを使うときに気をつけなければならない落とし穴がいくつかあるので、ガイドで説明する。
  • コマンドパターン:アンドゥ/リドゥ機能を使ったり、入力履歴をリストに保存したりするゲームをプレイしたことがある人なら、このコマンドパターンを見たことがあるだろう。例えば、ユーザーがいくつかのターンを計画してから、入力された順番に実際に実行するような戦略ゲームに活用できるパターンだ。
  • 州のパターンこれにより、オブジェクトの内部状態が変化したときに、そのオブジェクトの振る舞いを変更できるようになり、ゲーム・キャラクタやUIエレメントの状態に依存した複雑な振る舞いの管理が簡単になる。敵のNPCが「アイドル」、「パトロール」、「攻撃」など、マップ上のどこにいるかなどのゲームシナリオによって異なる行動をとることを考えてみよう。
  • オブザーバー・パターンこのパターンは、オブジェクトが動的にイベントをサブスクライブし、それに反応できるような、効率的なイベント・システムを実装するのに役立つ。ユースケースのひとつは、アクションゲームでプレイヤーが弾薬を集めると、サウンドの再生、UIの更新、アニメーションの再生など、さまざまなイベントがトリガーされるというものだ。
  • モデル・ビュー・プレゼンター(MVP):このパターンの核心は、状態の表示を実際の状態から切り離すことであり、モデルの変更に応じてビューが自動的に更新されるリアクティブな設計を可能にし、UIプログラミングにおいて一般的なパターンとなっている。モデルはデータであり、ビューはユーザーインターフェースであり、プレゼンターはビューのロジックを処理し、モデルからのデータを同期するメディエーターである。
  • Model-View-ViewModel (New):名前が示すように、これはMVPパターンに関連しているが、UI要素の更新方法を単純化するランタイム・データ・バインディングを追加することでそれを拡張している。この例では、UI ToolkitとUnity 6 Previewの新しいデータバインディング機能を活用しています。
  • 戦略パターン(新):このパターンは、各アルゴリズムをカプセル化することでアルゴリズムのファミリーを定義し、それらを交換可能にすることで、アルゴリズムを使用するクライアントから独立して変化させることを可能にする。これは、例えばゲームAIで異なる動きの挙動を実装するのに便利なパターンだ。
  • フライ級パターン(新):このパターンを使って、類似のオブジェクトとできるだけ多くのデータを共有することで、メモリ使用量を最適化する。基本的な考え方は、オブジェクト間の共有データを一元化するというものだ。
  • ダーティ・フラッグ(新):このパターンは、オブジェクトが変更されたときに "ダーティ "としてマークし、必要なときだけ再計算や更新を行うことで、パフォーマンスを最適化するのに役立つ。このパターンは、ゲームのループやUIレンダリングのケースで、コストのかかる更新を管理するのに役立つ。
フライウェイト・パターンを使って類似オブジェクト間でデータを共有する
フライウェイト・パターンを使用して、類似したオブジェクト間でデータを共有する。

サンプル・プロジェクトは、11のパターンをそれぞれ実演することで、電子書籍を反映している。The Asset Storeからプロジェクトをダウンロードし、対応するシーンを追って、これらのパターンが実際のシナリオに適用される様子を見ることができる。このプロジェクトにはUnity 6 Preview以降が必要です。

プロジェクトに飛び込む前に、覚えておくと役立つヒントがいくつかある。

メニューをSOLIDとデザインパターンのサンプルに移動します。
メニューをSOLIDとデザインパターンのサンプルに移動します。

Bootstrapのシーンから始めましょう。このシーンは、デモを設定し、メインメニューへのアクセスを提供します(SceneBootStrapperのコンセプトについては、e-bookで詳しく説明しています)。メインメニューから、適切なサンプルに移動することができます。それぞれのシーンは、異なるSOLIDの原則やデザイン・パターンを示している。

サンプルプロジェクトを見る
サンプルプロジェクトをご覧ください。

サンプル・プロジェクトとガイドのコード例には若干の違いがあることをご了承ください。わかりやすさと読みやすさを高めるため、パブリック・フィールドのような簡略化されたコードを使った例もある。

あなたのチームは、このガイドやサンプル・プロジェクトで使われている規約とは異なるコーディング・スタイルを好むかもしれません。特定のニーズに合わせたC#スタイルガイドを作成し、チーム全体で一貫してそれに従うことをお勧めします。詳しくは、独自のスタイル・ガイドを作成する方法についての電子ブックをご覧ください。

更新されたサンプルプロジェクトをダウンロードする

提供された例を検討し、どのデザイン・パターンがあなたのプロジェクトのニーズに最も合致するかを判断してください。これらのパターンに慣れ親しむにつれ、開発ワークフローを合理化し、改善する可能性が見えてくるだろう。

デザイン・パターンの利用に関する電子書籍とサンプル・プロジェクトの両方が無料でダウンロードできる:

最新の電子書籍をダウンロードする

ハッピーなコーディングだ!