182.1K Views
October 06, 21
スライド概要
2021年10月2日に行われた「出張ヒストリア! ゲーム開発勉強会2021」にて発表させていただいたスライドです。
イベント詳細
https://historia.co.jp/archives/22783/
講演動画
https://youtu.be/2L1Dor22Kjs
スライド内記事
[UE4] Subsystem, GameplayAbilityに関する講演で使用したC++コードについて
https://qiita.com/EGJ-Kaz_Okada/items/0ae2e8d8ba901c6a978d?fbclid=IwAR2_ygPhJFNGqJ79kFbFmey_k-K3uf00m7fSZc2K_KGOLJeUzN2WixYmd3o
講演者:
エピック ゲームズ ジャパン 岡田 和也 (Developer Relations, Software Engineer)
講演内容:
UE4が持つ様々な凄い機能やグラフィック表現について語られることは多いですが、日々の開発で使用すると少し便利になる地味な機能・フローについては少なめです。
これはプロジェクトの内容・人員など様々な要素により最適なワークフローが変わるため、「話しても参考になるか不安…」「そもそも今のやり方があってるか不安…」
ということで話しづらいのが原因かと思います(僕もそうです)。
とはいえ、こういった部分も開発では非常に重要です!
そこでこういった議論がもっと活発になるように人柱になって、最近自主開発で便利さ・手応えを感じた
DataAsset, Subsystem, GameplayAbilityの使い方についてお話します。
(初心者向けなので比較的簡単な内容です。プロ向けではありませんのでご注意を!)
株式会社ヒストリアは、Unreal Engine専門のソフトウェア開発会社です。ゲーム事業とエンタープライズ事業、2 つの軸でソフトウェアの企画、開発を行っています。また、Unreal Engine の学習を目的とした作品制作コンテスト『UE5ぷちコン』や、『出張ヒストリア! ゲーム開発勉強会』を主催、技術ブログを毎週更新など、Unreal Engine コミュニティを盛り上げる活動も行っております。
目指せ脱UE4初心者!? 知ってると開発が楽になる便利機能を紹介 – DataAsset, Subsystem, GameplayAbility編 – 出張ヒストリア! ゲーム開発勉強会2021 Epic Games Japan 岡田 和也
自己紹介 Epic Games Japan 岡田 和也 Twitter:おかず ( @pafuhana1213 ) Unreal Engineを使っている企業の技術サポートや 勉強会などでの講演が主なお仕事 No Twitter, No Life
本講演の趣旨 知らなくてもUE4を使ったコンテンツ制作はできるけど… 知ってると実装が楽になったり、 より効率的なワークフローを組める(かもしれない)機能を紹介 ● Data Asset ● Subsystem ● Gameplay Ability System ( GAS )
本講演の対象者 ● UE4を使った開発の超基本的な流れが 何となく分かってきた初心者の方 ● DataAsset, Subsystem, GASを 聞いたことはあるけど、 使い方のイメージが分からなかったりで断念した方 可能な限り C++は使わない方向で話します 追記:本スライドにおけるC++コードを コピペ用に記事にしました
メインテーマ 処理・作業を分散・分担しよう!
Data Asset
どんな機能? 様々なパラメータ・アセットを 管理・編集・取得するためのアセット ● ● ● ● ● 武器名 攻撃力 価格 3Dモデル アイコン などなど ● ● ● ● ● ● 名前 体力 防御力 移動速度 ジャンプ力 3Dモデル などなど
BPのプロパティで設定すればいいんじゃないの? Data Tableってやつを使うんじゃないの?
バリエーションが増えると… パラメータだけ違うほぼ同じBPが 大量に並ぶことに! 管理 大変!
バリエーションが増えると… 少しパラメータ弄るたびに BPエディタを開くのは面倒! 誤って 違うパラメータ変えそうで怖い! 調整 大変!
パラメータ調整も少しめんどう… 実行中はBPエディタ上での パラメータ調整はできない F8で抜けてのパラメータ変更は ちょっと面倒。反映忘れも 調整 大変!
Data Tableについて その名の通り、 テーブル形式でデータを管理する機能 大量のデータ、パラメータの管理に便利 CSVファイルと連携できるので Excelを使った調整も可能 実行中のパラメータ変更も可能 ヒストリアブログより
Data Tableの微妙なところ パラメータの取得が少し面倒くさい…
Data Tableの微妙なところ パラメータの取得が少し面倒くさい… 編集エディタの使い勝手が少し悪い… エディタを拡張しづらい… 毎回Excelを開くのもめんどう…
Data Tableの微妙なところ パラメータの取得が少し面倒くさい… 編集エディタの使い勝手が少し悪い… エディタを拡張しづらい… 毎回Excelを開くのもめんどう… 複数人での同時編集ができない 分業しづらい
この辺りの問題・課題を 解決するのが Data Asset!
Data Asset のいいところ ① パラメータ編集に専念できる! 関係のないデータ・処理を誤って編集することがない
Data Asset のいいところ ② 実行しながらパラメータ変更可能! 細かいパラメータ調整が 必要な部分で超便利 ちなみに DataTableでも同じことできます
Data Asset のいいところ ③ パラメータの取得がかんたん! プロパティに設定したData Asset から直接取得できる。Cast不要
Data Asset のいいところ ④ DataAssetのベースはBPなので 変数だけでなく関数も利用可能 例えば 各パラメータに計算式を 適用した結果を取得できたり
Data Asset のいいところ ⑤ プロパティからData Assetを設定できる! 差し替えが簡単!量産もラクラク!
プリセット的なつかいかたも
プロパティなので、様々な箇所で利用可能 パラメータ調整のためだけに 各編集エディタを開く必要が なくなるのは便利!
Data Asset のいいところ ⑥ 作業分担もしやすい! アニメーション編集と パラメータ調整を並行可能! ゲーム デザイナ猫 アニメータ犬
Data Asset のいいところ ⑦ BP, C++で実装した処理を 実行できるボタンを追加可能! 編集・チェック処理を 走らせることで作業を効率化!
ざっくりまとめると データドリブン型の開発ができる! 内部実装を理解・編集しなくても、 データだけで表示・挙動などの追加・変更が可能 作業分担・複数人作業がしやすい! 実装・データを分離できるので、編集を同時にできる ロック解除待ちしなくていい 編集作業を支援・自動化する仕組みを追加できる! 作業効率を上げるだけでなく ヒューマンエラーを回避できる!
Data Asset は いいぞ
Data Asset の つくりかた
Data Asset の つくりかた ① Data Asset のテンプレートとなる BP または C++クラス を作成 UPrimaryDataAsset か UDataAsset (C++のみ) をベースにすること UCLASS(Abstract, BlueprintType) class ACTIONRPG_API URPGItem : public UPrimaryDataAsset { GENERATED_BODY() ... UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Item) FText ItemName; ... } ActionRPGサンプル の RPGItem.h より
Data Asset の つくりかた ② 作成したBP または C++ クラスを元に Data Asset を作成 前ページで作成したものを選択
Data Asset の つかいかた
Data Asset の つかいかた ① BP, C++クラスのプロパティ が Data Assetのプロパティに!
Data Asset の つかいかた ② Call in Editor が有効になっている イベント・関数がボタンに!
Data Asset の つかいかた ③ プロパティの型は 元になったBP, C++クラスを指定
Data Asset の つかいかた ④ Data Asset プロパティから Get / Set ノードを呼び出し可能 Setできるのは Data Tableとの大きな違い!
かんたん! …だけど少し注意点も
アセットのハード参照にはご注意を BPと同じく、アセットを直接参照すると 参照関係の連鎖によるロード・メモリの問題が発生する可能性が! 可能な限り、ソフト参照にすることを推奨
ハード・ソフト参照に関する資料 公式ドキュメント アセットの参照 おかわりのアンリアルなメモ ハード参照とソフト参照 CC2 技術ブログ 第007回UE4のアセットの参照方法について、そのロードの違い HEXA BLOG BPの参照連鎖を断つ手法 参照連鎖によるロード時間が問題になった例 Nintendo Switch『OCTOPATH TRAVELER』はこうして作られた (p79より)
Data Assetを丸ごと(事前)ロードする手も Asset Manager と連携することで Data Asset 単位でロード管理 ↓ 詳しくはこちら! ↓ [UE4] Asset Managerのアセットの 非同期ロード機能について その1 ( 非同期ロードの解説 & レベルの裏読み編 ) Action RPG サンプル も BP_GameInstance の InitializeStoreItems イベント もぜひ
大量のデータを扱うのは少し苦手
Data Table と Data Asset の連携 Data Table ( CSV ) から Data Asset を自動生成・反映する方法 ヒストリア技術ブログ [UE4] 独自に用意したデータアセットを より便利に活用する方法 カリギュラオーバードーズにおける UE4へのデータ移植の手引き 中国語の記事 DataTableからDataAssetを生成する EditorUtiltiyWidgetの解決
Data Asset 用編集エディタ Editor Utility Widget を使って 管理・編集用のエディタを自作するのも手! [UE4]エディタ上で動作する ツール・エディタ拡張をUMGで簡単に作れる Editor Utility Widget について 株式会社アンナプルナ ブログ 【UE4】Editor Utility Widgetについてのあれこれ
Data Asset の まとめ Data Asset を活用することで 作業の分担 と データドリブン型の開発を実現できる! パラメータ調整を頻繁に行う箇所や 複数人が作業する部分に関してはData Asset化すると便利! Data Assetを使うのは非常に簡単! BPのみでも利用可能! 大量のデータを扱う際は注意 プロジェクトにあった編集・管理フローを要検討!
Data Asset に関連する資料 UE4公式 Asset Manager Explained | Inside Unreal Data-Driven Sound Design | Unreal Fest Europe 2019 | キンアジのブログ 【UE4】手軽に独自のデータアセットを作成する 【UE4】4.23でなくなった「Blutility」の拡張ウィンドウを使いたい場合 @unknown_ds さんのQiita記事 UE4 PrimaryDataAssetを使ってみる Unreal Engineのすすめ リアルタイム3DCG入門 データアセットでギャラリーを作る
Subsystem
ネットワーク対応で使う Online Subsystem とは 関係ありません!
どんな機能? エンジンによって自動的に管理(生成・保持・破棄)される インスタンス( UObject ) Engine, Editor, Game Instance, World, Local Playerと 同じライフサイクルで管理可能
○○○ Manager, Systemを作りたい気持ち プロジェクトに要素が増えていくと それらを個別に管理 & どこからでもアクセスできる仕組みが欲しくなります スコア Manager サウンド Manager バトル Manager レベル Manager エフェクト Manager ● ● ●
Actorで ○○○ Manager を作る場合 実装かんたん! レベルに配置、または動的に生成する必要がある レベルを追加した際に忘れがち…
Actorで ○○○ Manager を作る場合 アクセスするのが面倒… プロパティ公開して設定するのは面倒。忘れがち Get All Actors…は処理が重いので避けたい
Game Mode , Game Instance の場合 どこからでもアクセスできる! ただし、Cast または BP インターフェイスが必要 Cast は 負荷・参照関係の問題があり、 BPインターフェイス は BPノードの候補を汚す
Game Mode , Game Instance の場合 Game Mode, Game Instance は 1つしか存在できないので 実装・データが集中して大変なことになりがち。複数人での作業もしづらい 参照関係が複雑になり、ロード・メモリ問題が発生しやすい問題など スコア Manager バトル Manager エフェクト Manager
Singleton の場合 GameInstance のように永続的なオブジェクトを作成・使用する方法 複数のクラスを用意できるので、役割ごとに実装を分担できる C++側での実装がメインになり、 BP上での作業、BPとの連携がしづらい [UE4]GameInstance以外で永続的なオブジェクトを扱う UE4 GameInstance、Singletonへc++からアクセスする UE4/C++: C++er が UE4型のシングルトンを作る際に気をつける事
この辺りの問題・課題を 解決するのが Subsystem!