$30 off During Our Annual Pro Sale. View Details »

【U/day Tokyo 2025】Cygames流 最新スマートフォンゲームの技術設計 〜『...

Avatar for Cygames Cygames PRO
December 17, 2025

【U/day Tokyo 2025】Cygames流 最新スマートフォンゲームの技術設計 〜『Shadowverse: Worlds Beyond』におけるアーキテクチャ再設計の挑戦~

2025/12/11 U/Day Tokyo 2025

Avatar for Cygames

Cygames PRO

December 17, 2025
Tweet

More Decks by Cygames

Other Decks in Technology

Transcript

  1. 1/74 U/day Tokyo 2025 Cygames 流 最新スマートフォンゲームの技術設計 〜 『 Shadowverse

    : Worlds Beyond 』 におけるアーキテクチャ再設計の挑戦 〜 株式会社 Cygames クライアントサイド マネージャー / 鈴木 元気 ゲームエンジニア / 安田 朋広・ 元橋 智紀
  2. 2/74 鈴木 元気 クライアントサイド / マネージャー 2014 年にCygames に合流。 複数のスマホ向けゲームの新規開発、

    運用に従事。 2019 年からはクライアントサイドの マネージャーとしてスマホ向けタイト ルの開発、運用を横断的にサポートし、 技術力強化に取り組んでいる 自己紹介 安田 朋広 クライアントサイド / ゲームエンジニア 家庭用ゲームの開発を経て 2017 年にCygames に合流。 スマホ向けタイトルの新規開発、 運用を経験後に「 Shadowverse : Worlds Beyond 」の開発に初期 から参画。本作ではクライアント サイドのリーダーを務める 元橋 智紀 クライアントサイド / ゲームエンジニア 2013 年にCygames に合流。 「 Shadowverse 」を含めたスマホ向け ゲームの新規開発、運用を経験後、 「 Shadowverse : Worlds Beyond 」 の開発に参画。本作ではカードバトル の開発全般にエンジニアのリードとし て携わる
  3. 4/74 本セッションについて 記述名称について Shadowverse Shadowverse : Worlds Beyond シャドバ WB

    シャドバ シャドウバース ワールズ ビヨンド シャドウバース ワールズビヨンド スライド上では … 口頭では…
  4. 5/74 1. Cygames のスマホゲーム開発 2. シャドバ WB について 3. シャドバ

    WB 開発事例~パーク~ 4. シャドバ WB 開発事例~バトル~ アジェンダ
  5. 10/74 Cygames で現在採用している技術 UI uGUI 描画 URP バージョン管理 GitHub 動画

    CRI Sofdec CI Jenkins Github Actions リアルタイム通信 Magic Onion マスターデータ Master Memory サウンド Wwise 非同期処理 R3/ UniTask
  6. 11/74 近年のスマホゲームの傾向 品質、ボリュームへの対応 マルチPF ・全世界対応 • 開発規模の増加 • チーム規模の拡大 •

    バランス調整、 QAコストの増加 ・コントローラー対応 ・多言語対応とローカライズ ゲームの品質やボリューム、カバー範囲への要求ラインが高まる
  7. 12/74 • タイトル毎にカスタマイズした Timeline エディター • シーン選択をサポートするダッシュボード • 通信のリクエスト 、レスポンス確認ツール

    • リクエスト、レスポンスデータの内容確認 • 通信内容の改ざんや意図的なエラー発生も • 接続先サーバーの選択、内容確認ツール • 用途、利用期間、担当者、サーバープログラム、リソース情報など 開発の効率化 エディター拡張
  8. 14/74 • プルリクエスト作成時やビルド時に様々なテストを実施 • metaファイルの存在チェック • マスターデータの不整合チェック • 各プラットフォームでのコンパイルエラーチェック •

    Unity Test Runnerでのユニットテスト など 運用の効率化 運用を支えるテスト (参考) ユーザを飽きさせない高頻度の更新を可能にする開発運用ノウハウ ~ハイスピードな開発、リリースを実現するために~( CEDEC2017 ) https://tech.cygames.co.jp/archives/3048
  9. 15/74 • 開発、運用コストの増加を抑える • 基本的な仕組みを用意し、対応範囲、確認範囲の拡大を防ぐ ローカライズへの対応 基本方針 開発方法 • テキストは直接入力せずに

    ID 等で外部ファイルを引用 • テキストの翻訳対応はUnity外で完結 • 単数、複数等の特殊なルールも考慮した設計にする • 「1勝、2勝」や「1 win、2 wins」 など
  10. 18/74 タイトル情報 リリース 概要 プラット フォーム 2025 年6 月17 日

    App Store / Google Play / Steam / Epic Games Store 2016 年6 月17 日 App Store / Google Play / DMM GAMES / Steam 4000 種を超える美麗カード! 本格スマホカードバトル! 「進化」で勝利を! Shadowverse の正統後継作! 新たな次元のデジタルカードゲーム! 「超進化」が実現! シャドバ シャドバ WB
  11. 26/74 パーク内に様々な空間が存在 パーク ギルドラウンジ グループ内で1位を目指せ! 次のバトルへの待ち時間では サッカーも可能 大会専用の空間 ギルドメンバーと 楽しくバトルや

    ミニゲームが遊べる 自分だけの空間 装飾のカスタマイズ機能 様々なユーザーとワイワイ ゆるやかな交流の場 ロビー スペース 今日はどこに 行こう?
  12. 27/74 パーク パーク内ではバトルも可能 ギルドラウンジ 大会専用の空間 より良いユーザー体験のために、今後の拡張や細かい調整も可能な形を目指した 要件 様々な空間に移動可能、空間に適したバトルを楽しめる ロビー スペース

    今日はどこに 行こう? 16 人もしくは 8 人のグループ でマッチングして、 小規模な大会を楽しめる ギルドメンバーとバトル 練習モードで指南もできる フレンドを招いて バトル 同一ロビー内の人とバトル 相手がいなければ、 他のロビーの人とも
  13. 28/74 リアルタイムサーバーの技術選定 Photon: https://www.photonengine.com/ Node.js: https://nodejs.org/en MagicOnion : https://github.com/Cysharp/MagicOnion 過去の社内実績

    Unity との親和性 △ 〇 × 〇 〇 Node.js (前作で利用) 外部サービス ( Photon など) 拡張への柔軟性 MagicOnion △ 〇 〇 × 通信部分以外は実装必要 その分、 拡張に対して柔軟 通信部分以外も機能が揃っている 拡張への柔軟性はゲーム要件次第
  14. 29/74 過去の社内実績 Unity との親和性 △ × 〇 〇 △ 拡張への柔軟性

    リアルタイムサーバーの技術選定 非同期メソッドの呼び出しで通信を送り、結果待ちできる サーバー側も C# で書けるのでコードを共有可 クライアント側のコード例 サーバー側(ハブ)のコード例 〇 外部サービス ( Photon など) MagicOnion 〇 〇 × Node.js (前作で利用)
  15. 30/74 リアルタイムサーバーの技術選定 過去の社内実績 Unity との親和性 △ 〇 × 〇 〇

    外部サービス ( Photon など) 拡張への柔軟性 MagicOnion 長期運用の実績はないが、 開発元のCysharp の協力でカバー △ 〇 〇 × 参考:弊社での MagicOnion 採用例 C# によるクライアント /サーバーの開発言語統一がもたらす高効率な 開発体制 ~プリコネ!グランドマスターズ開発事例~ ( CEDEC2022 ) https://cedil.cesa.or.jp/cedil_sessions/view/2637 Node.js (前作で利用)
  16. 32/74 MagicOnion によるパークの実現方法 サーバー側のゲームループでパークの処理を実行 クライアントと 1:1 切断されたら破棄 リアルタイム双方向通信 ハブ ゲームループ

    パークの処理 MagicOnion の通信を経由して、クライアントから ハブのメソッドが呼ばれるが、 パークの空間に紐づいた処理を直接実装するにはハブは不向き 同じ空間内のクライアント パークサーバー ハブからパークの処理を 非同期で呼ぶ キャラクターの座標同期 大会の進行など
  17. 38/74 配信バトルをパークで描画する方法 パークとバトル共存しない前提だったので、 レイヤーは流用 していた 画面出力 3DObj 用カメラ パークの構成 通常バトルの構成

    バトルシーン 画面出力 3DObj 用カメラ パークシーン パークの GameObject レイヤー: 3DObj バトルの GameObject レイヤー: 3DObj 配信バトルを対応する前 他のレイヤーの オブジェクトもあるが、割愛
  18. 39/74 配信バトルをパークで描画する方法 パークの構成 画面出力 3DObj 用カメラ 配信用スクリーンの RenderTexture Battle3DObj 用カメラ

    パークシーン パークの GameObject レイヤー: 3DObj バトルの GameObject レイヤー: Battle3DObj 配信バトルを対応後 他のバトルのオブジェクトも 専用のレイヤーに ・配信の画面は RenderTexture に描画して、パーク側の配信モニターに設定する ・レイヤーを分けて、パークのカメラにバトルの GameObject が映らないように
  19. 43/74 バトル配信をパークで動かすために 最初に、どれくらい削れば実現できるのかを検討 12ms 500MB 100MB 2ms 処理負荷 メモリ消費 通常バトルの場合

    バトル配信の目標 上記の目標の範囲内であれば、 パークの処理負荷・メモリ消費が増えても、スマホで動かせる
  20. 47/74 DFrame による自動操作 DFrame キャラ移動 し続ける 計測 配信用に バトル開始 プレイヤー作成

    パーク入場 C# でテストシナリオを書ける分散負荷テストフレームワーク 元々サーバーの負荷試験で利用していたものを流用 DFrame でテストシナリオを実装して、計測時に実行するだけに Dframe : https://github.com/Cysharp/DFrame/ この部分を自動化 計測のための手順
  21. 48/74 フレームレート計測の改善 バッテリー温度上昇による影響を考慮した計測を行いたい フレームレートの変化のグラフを自動生成 実機でCSV 出力 CIでグラフ化 結果を自動ポスト ・ FPS

    ・ CPU 処理時間 ・ バッテリー温度 ( Android のみ) iOS の温度はlibimobiledevice を 使って Mac で取得(グラフ化は未対応) フレームレート変化が確認・比較しやすくなった libimobiledevice : https://libimobiledevice.org/
  22. 53/74 アジェンダ 1. カードゲームの開発について 2. シャドバからシャドバ WB へ バトルロジックのサーバー移行 3.

    バトルロジックのサーバー移行結果 4. サーバー移行を活かしたシャドバ WB での開発
  23. 55/74 デジタルカードゲームの開発方針 非公開情報(相手の手札、デッキ情報など) を不正に取得 相手視点で非公開情報を送信しない 対戦相手に不要な疑念を抱かせないため 不正対策は必須 前提 ランダム処理の不正操作 ・好きなカードをドロー

    ・ランダムな能力のコントロール 乱数の算出が適正か検証 公平性の担保が必要 クライアント改ざんによる 不正処理 通信パラメータの解析 による 情報の不正取得
  24. 58/74 シャドバ WB での開発 シャドバ運用中に検討もされたが、運用中の特大改修は厳しかった サーバーにバトルロジックを移行 →バトルロジックと演出ロジック が分離 MagicOnion を採用

    バトルロジックを クライアントから 完全にサーバーへ移行 シャドバでは Node.js で作っていたバトル部分も 再設計が必要
  25. 59/74 処理の流れ(シャドバ) クライアントの通信ベース ①操作した結果の カード能力処理 ②操作情報をサーバーに送信 ③サーバー側でカード情報 検証 ④カード操作情報を相手に送信 ⑤操作した結果の

    カード能力の処理 ⑥操作結果のカード能力の処理結果送信 ⑦自分と相手クライアントの処理結果 検証 処理が多く煩雑 … 自分クライアント ①カード能力処理 相手クライアント ⑤カード能力処理 ② ⑥ ④ 処理結果の通信 カードを手札から場に出す操作 Node.js サーバー ③検証 ⑦検証 カード 操作の通信
  26. 60/74 カード能力処理をサーバーに移動 処理を減らしシンプルに 処理の流れ(シャドバ WB ) ①カード操作情報をサーバーに送信 ②操作した結果 カード能力の処理 を実行し

    再生すべき演出の情報を作成 ③それぞれの クライアント へ送信 演出を再生 相手クライアント ③計算結果送信 MagicOnion サーバー ②カード能力処理 カードを手札から場に出す操作 ①カード 操作の通信 自分クライアント
  27. 61/74 処理の流れ(シャドバ WB ) 処理を減らしシンプルな流れに 自分クライアント 相手クライアント ①カード 操作の通信 ③計算結果送信

    MagicOnion サーバー ②カード能力処理 自分クライアント ①カード能力処理 相手クライアント ⑤カード能力処理 ② ⑥ ④ 処理結果の通信 Node.js サーバー ③検証 ⑦検証 カード 操作の通信
  28. 64/74 手触りを良くするために 通信による待ちが発生 UI やカードで反応に遅れ カードや UI の当たり判定を 可視化して明確に 通信などの処理が

    妨げになっているか確認して改善 バトルロジックの計算結果を 得るために通信による待ちが発生 演出が止まったように見せないよう 最大限最適化 課題として これらをクリアした上で演出のテンポ感や UI の手触りを調整
  29. 70/74 カード能力のマスター の整理 カード能力のマスター は運用が長くなるにつれ 肥大化 カラム・ csv 記述が複雑化 70

    カラム以上 … 600 文字以上の記述… 能力と演出に 関する記述が混在 カードマスターも 分割! サーバーとクライアントで カード能力処理と演出処理が分離 発動ルールに一貫性が必要で システム的でシンプルにしやすい カード能力 カードの見た目 演出 見た目やテンポ感にこだわるため、 能力に応じて独特なパラメータが生まれやすい