Upgrade to Pro — share decks privately, control downloads, hide ads and more …

大規模Unityゲーム開発の設計事例 〜ドメイン駆動設計とDIコンテナを導入した一年を振り返る...

大規模Unityゲーム開発の設計事例 〜ドメイン駆動設計とDIコンテナを導入した一年を振り返る〜 / cedec2021-ddd

CEDEC2021 「大規模Unityゲーム開発の設計事例」の資料です。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
セッションの内容
現在開発中タイトルにおける、プログラム設計に関しての知識・経験を共有します。

ソーシャルゲーム開発では、作品を素早く完成させてリリースする事も大切ですが、同時にその後の継続的な運用開発についても考える必要があります。その際に重要になってくるのが設計です。

属人化を避けたり、メンテナンス性、制作スピードを維持するためにはメンバー間で統一された設計思想が必要だと考えました。

そのために私達は「ドメイン駆動設計(DDD)」と「DIコンテナ」という2つの手法を導入しました。

導入から一年が経ち、それらを振り返りつつ事例を紹介します。

https://cedec.cesa.or.jp/2021/session/detail/s60644099db9d6

CyberAgent SGE Engineer

November 17, 2021
Tweet

More Decks by CyberAgent SGE Engineer

Other Decks in Programming

Transcript

  1. 2 自己紹介 【経歴】 広告系Flashコンテンツ開発 → 2011年 アメーバピグ Flash開発で(株)サイバーエージェント入社 → スマホブ

    ラウザゲーム開発 → スマホUnityゲーム開発 → (株)アプリボット所属 【主な仕事】 Unity全般・設計・3D描画関係・昔はFlashでアニメーション作ったり演出・UXも考えたりしていました 畑山 政道 Unityエンジニア 2011年 中途入社
  2. 31 データベース ファイルI/O 物理エンジン UI サウンド処理 描画エンジン ユーザー入力 世界観 キャラのスキル

    成長ロジック ダメージ計算 キャラ性能 通信 行動エリア 地形 システムを構成する要素から、汎用的な部分を抜いて残る部分 キャラ属性 改めてゲーム制作のドメインとは何か考える 「ゲームが表現しようとしている対象領域」
  3. 32 • 自キャラの成長ロジックなど • どうやってレベルアップする? • 武器/防具を装備する? • スキルの存在 •

    インゲーム • ゲームのルール • いつスキルが発動するのか? • ダメージの計算方法は? 改めてゲーム制作のドメインとは何か考える 「ゲームが表現しようとしている対象領域」→ ゲーム独自の概念・ルール・仕様
  4. 33 自分たちが作っているゲームで実現しようとしているもの • アクションゲームだと • ステージ情報 • 何がどこに配置される? • 壊せる・壊せない・移動する

    etc.. • 自キャラ・敵キャラの配置 • 自分・敵キャラのステータス • HP、MP、攻撃方法 etc.. • ジャンプする・敵を踏みつける事で敵を撃退する、のようなゲーム固有のルール 改めてゲーム制作のドメインとは何か考える
  5. 34 将棋ゲームのドメイン知識 の一例 • 登場キャラクター • 40枚の駒 • 駒の性能は8種類。それぞれ動ける範囲が違う •

    成長ロジック • 成駒。動ける範囲が増える • mapの広さ・位置 • 9x9の81マスで戦う • 相手の駒を取り、保持する/使う 改めてゲーム制作のドメインとは何か考える
  6. 35 • 9人 vs 9人 • 選手には打率・防御率・スタミナ、etc…などの能力パラメーターがある • ストライク3つでアウト •

    バッターはボールを打ち返す • 攻撃側・防御側に分かれ、交互に入れ替わる • これらにゲーム特有のルールも加わる • 選手の成長要素、必殺技、アイテムetc.. 野球ゲームのドメイン知識 の一例 改めてゲーム制作のドメインとは何か考える
  7. 58 関連するオブジェクトの集まり。データを変更するための単位として扱われる 4. 集約 OrderItem Create Destroy Price VatRate Value

    to_i to_f Customer Order add_item remove_item total_price Entity Entity Entity Value object 窓口 = 集約Root 集約内部 この中はカプセル化されている Aggregate 窓口を通さないアクセスは認めない 引用 Facade Pattern as the way to implement Aggregate http://rubyblog.pro/2017/05/facade-pattern
  8. 60 Facadeパターン Facade適用後 Subsystem内に、 外から自由にアクセスしている 窓口を通してしかアクセスできない 引用 Facade Pattern as

    the way to implement Aggregate http://rubyblog.pro/2017/05/facade-pattern 窓口を設ける事で、複雑な構造をカプセル化する 4. 集約
  9. 70 ドメイン層 • ドメインロジックの実装 • 値オブジェクト • エンティティ • ドメインサービス

    各パターンがどの層にあてはまるか システムの心臓部 7. レイヤードアーキテクチャ
  10. 74 依存関係逆転の原則 レイヤードアーキテクチャの実装 具象 ではなく、抽象 だけを参照するようにする 具象 → 実装クラス 抽象

    → interfaceやabstractなどの抽象宣言 <参考> Robert C.Martin,角 征典,高木 正弘. Clean Architecture 達人に学ぶソフトウェアの構造と設計
  11. 125 集約の境界が曖昧で、集約内部に直接アクセスを許してしまう ドメイン駆動設計 - つまづいた点 基本的にはデメテルの法則を適用する。 クラスCのメソッドfは、次のオブジェクトのメソッドのみを呼び出すべき • Cそのもの •

    fで生成されたオブジェクト • fの引数で渡されたオブジェクト • Cのインスタンス変数に保持されたオブジェクト fは、上記の許されたメソッドから返されたオブジェクトのメソッドを呼び出し てはいけません。つまり友達とのみ会話し、知らない人とは会話してはいけない のです。 Robert C.Martin,花井 志生. Clean Code アジャイルソフトウェア達人の技 (Japanese Edition) (Kindle の位置No.2626-2631). Kindle 版.
  12. 141 ドメイン駆動設計 良いところ • DDDを導入する事でチーム内で統一された設計思想を共有できるようになった • 悩んだ時 / 説明する際に参照できるリソースが豊富 •

    データと振る舞いがセットで記述される事でコードの保守性・可読性が向上する • ドメインへの理解が推奨される • 一度習得すれば所属プロジェクトが変わっても様々な面で力になる • UnityでなくてもOK。特定の技術にあまり左右されない
  13. 142 ドメイン駆動設計 • 導入のハードルはなかなか高い • 継続的な学習は必要 • チーム内に浸透するまで時間がかかる • まずはプログラムの実装パターン適用からでも効果はある

    • それでも各実装パターンへの正確な理解は必要 • ドメイン駆動の名の通り、ドメインへの理解を深める事が本質 • しかし形から入る事で分かる事も多い 大変なところ・注意したいところ
  14. 146 エリック・エヴァンスのドメイン駆動設計 https://www.amazon.co.jp/dp/B00GRKD6XU ドメイン駆動設計入門 ボトムアップでわかる!ドメイン駆動設計の基本 https://www.amazon.co.jp/dp/B082WXZVPC 実践ドメイン駆動設計 https://www.amazon.co.jp/dp/B00UX9VJGW ドメイン駆動設計 モデリング/実装ガイド

    https://booth.pm/ja/items/1835632 Clean Code アジャイルソフトウェア達人の技 https://www.amazon.co.jp/dp/B078HYWY5X Clean Architecture 達人に学ぶソフトウェアの構造と設計 https://www.amazon.co.jp/dp/B07FSBHS2V オブジェクト指向入門 第2版 原則・コンセプト https://www.amazon.co.jp/dp/4798111112 参考書籍
  15. 147 DDDスコアカード https://www.informit.com/articles/article.aspx?p=1944876&seqNum=2 Domain Driven Design(ドメイン駆動設計) Quickly 日本語版 https://www.infoq.com/jp/minibooks/domain-driven-design-quickly/ DDD

    Reference - Domain Language https://www.domainlanguage.com/ddd/reference/ DDDリファレンス 定義とパターン概要 (鋭意修正中, CC-BY) https://zenn.dev/takahashim/books/fb4cdc32f8e95c ドメイン駆動設計をゲーム開発に活かす https://www.slideshare.net/masuda220/ss-111011089 ゲームで学ぶ「役に立つ」ドメインモデルの考え方 - Qiita https://qiita.com/MinoDriven/items/7b4609d0bc6717769060 DDD難民に捧げる Domain-Driven Designのエッセンス 第1回 ドメイン駆動設計とは https://www.ogis-ri.co.jp/otc/hiroba/technical/DDDEssence/chap1.html より引用 Facade Pattern as the way to implement Aggregate http://rubyblog.pro/2017/05/facade-pattern 参考資料URL
  16. 148 [DDD]ドメイン駆動設計で実装を始めるのに一番とっつきやすいアーキテクチャは何か https://qiita.com/little_hand_s/items/ebb4284afeea0e8cc752 DIコンテナの本当の使いどころ https://www.ulsystems.co.jp/topics/025 48. GoFデザインパターンとDI (前編) w/ twada

    https://fukabori.fm/episode/48 契約による設計の紹介 - Hatena Developer Blog https://developer.hatenastaff.com/entry/2016/09/01/163542 契約による設計、例外、表明の関係について個人的なまとめ https://qiita.com/hiko1129/items/f312212070716f672ff6 値オブジェクトの実装 | Microsoft Docs https://docs.microsoft.com/ja-jp/dotnet/architecture/microservices/microservice-ddd-cqrs-patterns/implement-value-objects DDDで複数集約間の整合性を確保する方法(サンプルコードあり)[ドメイン駆動設計] https://little-hands.hatenablog.com/entry/2021/03/08/aggregation 参考資料URL