Mais conteúdo relacionado Semelhante a 目指せ脱UE4初心者!?知ってると開発が楽になる便利機能を紹介 - DataAsset, Subsystem, GameplayAbility編 - (20) Mais de historia_Inc (20) 目指せ脱UE4初心者!?知ってると開発が楽になる便利機能を紹介 - DataAsset, Subsystem, GameplayAbility編 -2. 自己紹介
Epic Games Japan
岡田 和也
Twitter:おかず ( @pafuhana1213 )
Unreal Engineを使っている企業の技術サポートや
勉強会などでの講演が主なお仕事
No Twitter, No Life
19. Data Asset のいいところ ②
実行しながらパラメータ変更可能!
細かいパラメータ調整が
必要な部分で超便利
ちなみに
DataTableでも同じことできます
21. Data Asset のいいところ ④
DataAssetのベースはBPなので
変数だけでなく関数も利用可能
例えば
各パラメータに計算式を
適用した結果を取得できたり
30. 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 より
31. Data Asset の つくりかた ②
作成したBP または C++ クラスを元に Data Asset を作成
前ページで作成したものを選択
33. Data Asset の つかいかた ①
BP, C++クラスのプロパティ が Data Assetのプロパティに!
34. Data Asset の つかいかた ②
Call in Editor が有効になっている
イベント・関数がボタンに!
36. Data Asset の つかいかた ④
Data Asset プロパティから
Get / Set ノードを呼び出し可能
Setできるのは
Data Tableとの大きな違い!
40. Data Assetを丸ごと(事前)ロードする手も
Asset Manager と連携することで
Data Asset 単位でロード管理
↓ 詳しくはこちら! ↓
[UE4] Asset Managerのアセットの
非同期ロード機能について その1
( 非同期ロードの解説 & レベルの裏読み編 )
Action RPG サンプル も BP_GameInstance の
InitializeStoreItems イベント もぜひ
42. Data Table と Data Asset の連携
Data Table ( CSV ) から
Data Asset を自動生成・反映する方法
ヒストリア技術ブログ
[UE4] 独自に用意したデータアセットを
より便利に活用する方法
カリギュラオーバードーズにおける
UE4へのデータ移植の手引き
中国語の記事
DataTableからDataAssetを生成する
EditorUtiltiyWidgetの解決
43. Data Asset 用編集エディタ
Editor Utility Widget を使って
管理・編集用のエディタを自作するのも手!
[UE4]エディタ上で動作する
ツール・エディタ拡張をUMGで簡単に作れる
Editor Utility Widget について
株式会社アンナプルナ ブログ
【UE4】Editor Utility Widgetについてのあれこれ
44. Data Asset の まとめ
Data Asset を活用することで
作業の分担 と データドリブン型の開発を実現できる!
パラメータ調整を頻繁に行う箇所や
複数人が作業する部分に関してはData Asset化すると便利!
Data Assetを使うのは非常に簡単!
BPのみでも利用可能!
大量のデータを扱う際は注意
プロジェクトにあった編集・管理フローを要検討!
45. 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入門
データアセットでギャラリーを作る
51. Actorで ○○○ Manager を作る場合
アクセスするのが面倒…
プロパティ公開して設定するのは面倒。忘れがち
Get All Actors…は処理が重いので避けたい
52. Game Mode , Game Instance の場合
どこからでもアクセスできる!
ただし、Cast または BP インターフェイスが必要
Cast は 負荷・参照関係の問題があり、
BPインターフェイス は BPノードの候補を汚す
53. Game Mode , Game Instance の場合
Game Mode, Game Instance は 1つしか存在できないので
実装・データが集中して大変なことになりがち。複数人での作業もしづらい
参照関係が複雑になり、ロード・メモリ問題が発生しやすい問題など
スコア Manager
バトル Manager
エフェクト Manager
58. Engine
Game
Instance World Local Player
Editor
各システムに対して
Subsystemがぶら下がる形
(Componentようなイメージ)
各システムと同じタイミングで
生成・破棄される
(ライフサイクルが同じ)
Score
Subsystem
Gimmick
Subsystem
GameInstance
Subsystem
World
Subsystem
63. Subsystem のいいところ ③
プロジェクトの独自BP から 実装を切り離せる!
実装の管理や複数人での作業が楽に!
プロジェクト本体への依存度が減るので、参照関係の整理もしやすい!
Game State
Subsystem
Score
Subsystem
Battle
Subsystem
Game
Instance
65. UE4.27 が持つSubsystem一覧
- UGameInstanceSubsystem
- UReplaySubsystem
- ULocalPlayerSubsystem
- UEnhancedInputLocalPlayerSubsystem
- UDynamicSubsystem
- UEngineSubsystem
- UAssetTagsSubsystem
- UDMXPixelMappingSubsystem
- UDMXSubsystem
- UEnhancedInputEngineSubsystem
- UGerstnerWaterWaveSubsystem
- UHLODEngineSubsystem
- UMoviePipelineQueueEngineSubsystem
- UText3DEngineSubsystem
- UTimedDataMonitorSubsystem
- UVCamInputSubsystem
- UVirtualCameraSubsystem
- UWindowsMixedRealityInputSimulationEngineSubsystem
- UDataDrivenCVarEngineSubsystem
- UCommonUISubsystemBase
- URCPropertyContainerRegistry
- UCameraCalibrationSubsystem
- UEditorSubsystem
- UAssetEditorSubsystem
- UBrushEditingSubsystem
- UClassTemplateEditorSubsystem
- UContentBrowserDataSubsystem
- UDisplayClusterConfiguratorEditorSubsystem
- UEditorUtilitySubsystem
- UEditorValidatorSubsystem
- UImportSubsystem
- UStylusInputSubsystem
- ULayersSubsystem
- UMoviePipelineQueueSubsystem
- UPanelExtensionSubsystem
- UVPScoutingSubsystem
- UWaterEditorSubsystem
- UWorldSubsystem
- UColorCorrectRegionsSubsystem
- UGPULightmassSubsystem
- UNetworkPredictionWorldManager
- UObjectTraceWorldSubsystem
- UViewportStatsSubsystem
- UTickableWorldSubsystem
- UWaterSubsystem
- UQuartzSubsystem
- ULandscapeSubsystem
- UAutoDestroySubsystem
- UConversationRegistry
- UDisplayClusterWorldSubsystem
- UNetworkPhysicsManager
- UBlueprintContextBase
68. GameInstance Subsystemの場合 - 準備 -
UCLASS()
class ○○○_API UMyGameInstanceSubsystem
: public UGameInstanceSubsystem
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable)
int32 GetScore(){ return Score; }
private:
int32 Score;
};
72. ① Subsystem を BP化する方法
(自己責任コース)
② Subsystem に 拡張用BP を持たせる方法
(Epic 推奨はこちら)
73. Subsystemを継承した新規C++クラスを作成
// Copyright Epic Games, Inc. All Rights
Reserved.
#pragma once
#include "CoreMinimal.h"
#include "Subsystems/WorldSubsystem.h"
#include "MyWorldSubsystem.generated.h"
/**
*
*/
UCLASS()
class ACTIONRPG_API UMyWorldSubsystem :
public UWorldSubsystem
{
GENERATED_BODY()
};
74. BPから作成可能に(要コンパイル)
// Copyright Epic Games, Inc. All Rights
Reserved.
#pragma once
#include "CoreMinimal.h"
#include "Subsystems/WorldSubsystem.h"
#include "MyWorldSubsystem.generated.h"
/**
*
*/
UCLASS(Blueprintable, Abstract)
class ACTIONRPG_API UMyWorldSubsystem :
public UWorldSubsystem
{
GENERATED_BODY()
};
75. 問題点 ①
C++側 の Subsystem クラスのGetノードが候補に並んでしまう
中身(インスタンス)は同じなので
複数のSubsystemが生成されている問題はないが… 混乱を招く可能性がある
76. 問題点 ②
GameInstance ( Local Player ) Subsystem場合、
GameInstnace の 初期化時 などの早いタイミングで
その Subsystem を 同期ロードしないとパッケージで正常に動作しない
79. ① Subsystem を BP化する方法
(自己責任コース)
② Subsystem に 拡張用BP を持たせる方法
(Epic 推奨はこちら)
82. 拡張用BPのプロパティを持たせるには
// 拡張用BPのベースとなるクラス
UCLASS(Abstract, Blueprintable, MinimalAPI, meta = (ShowWorldContextPin))
class UMyGameInstanceSubsystemHelperBase : public UObject
{
GENERATED_BODY()
};
UCLASS()
class SUBSYSTEMBP_API UMyGameInstanceSubsystem : public UGameInstanceSubsystem
{
GENERATED_BODY()
public:
// 拡張用BPのプロパティ
UPROPERTY(Transient, BlueprintReadWrite)
UMyGameInstanceSubsystemHelperBase* SubsystemHelper;
};
84. C++側で生成と設定をする手も ( .h側 )
UCLASS()
class SUBSYSTEMBP_API UMyGameInstanceSubsystem : public UGameInstanceSubsystem
{
GENERATED_BODY()
public:
UMyGameInstanceSubsystem();
virtual void Initialize(FSubsystemCollectionBase& Collection) override;
virtual void Deinitialize() override;
UPROPERTY(Transient, BlueprintReadOnly)
UMyGameInstanceSubsystemHelperBase* SubsystemHelper;
private:
TSubclassOf< class UMyGameInstanceSubsystemHelperBase > SubsystemHelperClass;
};
85. C++側で生成と設定をする手も ( .cpp側 )
#include "MyGameInstanceSubsystem.h"
#include "Runtime/CoreUObject/Public/UObject/ConstructorHelpers.h"
UMyGameInstanceSubsystem::UMyGameInstanceSubsystem()
{
// 拡張用BPのクラス情報を検索・取得。パスの指定には注意
// .ini や プロジェクト設定でBPアセットのパスを設定できるようにしておくと親切
static ConstructorHelpers::FClassFinder<UMyGameInstanceSubsystemHelperBase>
BluePrintFile(TEXT("/Game/Subsystem/BP_MyGameInstanceSubsystemHelper"));
if (BluePrintFile.Class)
{
SubsystemHelperClass = (UClass*)BluePrintFile.Class;
}
}
86. C++側で生成と設定をする手も ( .cpp側 )
void UMyGameInstanceSubsystem::Initialize(FSubsystemCollectionBase& Collection)
{
SubsystemHelper = nullptr;
if (SubsystemHelperClass)
{
// 拡張用BPを生成・設定
SubsystemHelper =
NewObject<UMyGameInstanceSubsystemHelperBase>(GetTransientPackage(),
SubsystemHelperClass);
}
}
void UMyGameInstanceSubsystem::Deinitialize()
{
SubsystemHelper = nullptr;
}
87. 注意点
プロパティの型 は C++側の Base クラスなので
BP側で新規追加したプロパティや関数を直接呼ぶことは出来ません
Cast を使って型変換をするか、
C++側で関数の準備をする必要があります
91. Subsystem で Tick を使いたい!
FTickableGameObject か FTickableEditorObject も
継承させればOK!
UE4 プログラミングサブシステムを試してみる#Tick処理を実装する (@unknown_dsさん)
Subsystem に Tick処理を実装する際の注意点について
UE4.27 で
Tick 付きの WorldSubsystem が追加されました!
UTickableWorldSubsystem
97. ここまでのまとめ
Subsystemを活用することで
使いやすい ◯◯◯ Manager を 効率良く作成できます!
更に複数人での作業 や 参照関係の整理にも有用です
ただし、下準備で C++ が少し必要です
(個人的には Unreal C++ を触る / 勉強するいいキッカケになる気がします)
万能な機能ではなく、注意するべき部分もあります
とはいえ、非常に強力な機能なので
特に中規模・大規模プロジェクトでは是非導入をご検討ください!
115. Gameplay Tag で リクエストするメリット
安全に使えるだけでなく、拡張性が高い!
列挙型も便利ですが、頻繁に項目が追加・変更される場合は不向き
特にBPとC++が混在するプロジェクト
130. .h 側
#pragma once
#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "AbilitySystemComponent.h"
#include "MyBlueprintFunctionLibrary.generated.h"
UCLASS()
class ACTIONRPG_API UMyBlueprintFunctionLibrary : public UBlueprintFunctionLibrary
{
GENERATED_BODY()
UFUNCTION(BlueprintCallable, meta = (DefaultToSelf = "Target"))
static void GiveAbilityToComponent(AActor* Target, UAbilitySystemComponent* AbilitySystem,
TArray<TSubclassOf<class UGameplayAbility>> AbilityList);
};
131. .cpp 側
#include "MyBlueprintFunctionLibrary.h"
void UMyBlueprintFunctionLibrary::GiveAbilityToComponent(AActor* Target, UAbilitySystemComponent* AbilitySystem,
TArray<TSubclassOf<class UGameplayAbility>> AbilityList)
{
if (AbilitySystem && Target)
{
int32 inputID(0);
if (AbilityList.Num() > 0)
{
for (auto Ability : AbilityList)
{
if (Ability)
{
AbilitySystem->GiveAbility(FGameplayAbilitySpec(Ability.GetDefaultObject(), 1,
inputID++));
}
}
}
AbilitySystem->InitAbilityActorInfo(Target, Target);
}
}
146. ここまでのまとめ
GAS と Gameplay Tag の設定を調整するだけで
ギミック や キャラクタ などの挙動・処理を変えることが可能に
取り扱うデータ・条件が多いプロジェクトでは特に強力!
リクエストを送信・受信側の両方の実装がシンプルに
149. こちらの資料・記事も是非
公式ドキュメント・動画
ゲームプレイ アビリティ システム
Action RPG のゲームプレイ アビリティ
Using the Gameplay Ability System | Unreal Fest Europe 2019
Hero AI – Gameplay Abilities Meet Behavior Trees | Unreal Fest Europe 2019
Action RPG: Gameplay Abilities System | Inside Unreal
A Guided Tour of Gameplay Abilities | Inside Unreal
非公式ドキュメント
GASDocumentation ( 日本語訳 )
おかわりのアンリアルなメモ
GameplayAbilitiesの使い方(セットアップ編)
@O_Y_G さんによる GAS関連資料まとめ
UE4 BPプロジェクトに Gameplay Ability System を導入する方法
150. 本日のまとめ
Data Asset を活用することで
作業の分担 と データドリブン型の開発を実現できる!
Subsystem を活用することで
使いやすい ◯◯◯ Manager を 効率良く作成できる!
複数人での作業 や 参照関係の整理にも有用
Gameplay Ability System を活用することで
データのみで挙動の制御 や 実行の可否を設定できる!
複数人での作業 や 参照関係の整理にも有用
155. UE4 Cinematic Dive Online (10/16(土) 14:00~17:30)
https://www.unrealengine.com/ja/blog/epicgamesjapan-onlinelearning-14