Part 1の一部になります。
前回の続き
今回はGameplay Ability System (通称GAS)を使って雪玉とHPをAttributeで実装し、Gameplay Effectで影響を与えていきます。
お約束 | |
---|---|
この記事作成にあたって使用した主なUnreal Engine バージョン | UE4.27.2 / UE5 Preview1 |
本日のゴール1
雪玉とHPをAttributeで実装。雪玉を投げた時に、雪玉を消費するようにしたい。
本日のゴール2
雪玉が当たった相手のHPを減らしたい。
参考文献
こちらの記事を参照しました。
実際の実装
まず前提として、おかわりさんのページの内容を実装していただくことが前提です。
こちらのおかわりさんのページを基本で組んでいただきます。
https://okawari-hakumai.hatenablog.com/entry/2018/08/03/082935
Attributeのhファイルの方に追加していきます。
初期設定用のコンストラクタの方に下記を追加。AttributeをReplicateするぞっっていう宣言みたいなもんです。
virtual void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;
その下にこれを記述していきます。太字部分はご自分のUAttributeSet名称に変えていただきます。『名称』はご自分のAttributeSetの名称が入ります。
この赤字の部分ですね。(Uは含まない。) |
『U名称』と書いてあったら、U〜〜〜になるわけです。※まあ正直Categoryの方はご自分のわかりやすいようにすればいいんですが…。
// Yukidama
UPROPERTY(BlueprintReadWrite, Category = "名称", ReplicatedUsing = OnRep_Yukidama)
FGameplayAttributeData Yukidama;
ATTRIBUTE_ACCESSORS(U名称, Yukidama);
FGameplayAttribute YukidamaAttribute();
ついでにHealthも書き換えちゃいましょう。
// Health
UPROPERTY(BlueprintReadWrite, Category = "名称", ReplicatedUsing = OnRep_Health)
FGameplayAttributeData Health;
ATTRIBUTE_ACCESSORS(U名称, Health);
FGameplayAttribute HealthAttribute();
ポイントはRelicatedUsing = OnRep_XXXですね。これで値が変更されたときにOnRep_XXXを呼び出します。続いて最後の};の前にこれを記述していきます。
protected:
UFUNCTION()
virtual void OnRep_Yukidama(const FGameplayAttributeData& OldYukidama);
UFUNCTION()
virtual void OnRep_Health(const FGameplayAttributeData& OldHealth);
上で記述したOnRep_XXXを記述したというわけです。
さて今度はAttributeのcppファイル、中身の方です。
U名称::U名称()
: Health(100.f)
, MaxSpeed(600.f)
, Damage(0.f)
, Yukidama(5.f)
{
}
こんな感じで最初の方にYukidamaの初期値を指定しておきます。5個ですね。なんでintじゃなくてfloatなんだよと言われるかもしれませんが、基本的にAttributeではfloatで変数を扱います。
あとはおかわりさんの記事を元に、これをHealthの下とかに入れていきます。
FGameplayAttribute U名称::YukidamaAttribute()
{
static FProperty* Property = FindFieldChecked<FProperty>(U名称::StaticClass(), GET_MEMBER_NAME_CHECKED(U名称, Yukidama));
return FGameplayAttribute(Property);
}
FGameplayAttribute U名称::HealthAttribute()
{
static FProperty* Property = FindFieldChecked<FProperty>(U名称::StaticClass(), GET_MEMBER_NAME_CHECKED(U名称, Health));
return FGameplayAttribute(Property);
}
あとはcppファイルの最後に下記を追加すればOK。
void U名称::OnRep_Yukidama(const FGameplayAttributeData& OldYukidama)
{
GAMEPLAYATTRIBUTE_REPNOTIFY(U名称, Yukidama, OldYukidama);
}
void U名称::OnRep_Heatlh(const FGameplayAttributeData& OldHealth)
{
GAMEPLAYATTRIBUTE_REPNOTIFY(U名称, Health, OldHealth);
}
void U名称::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
Super::GetLifetimeReplicatedProps(OutLifetimeProps);
DOREPLIFETIME_CONDITION_NOTIFY(U名称, Yukidama, COND_None, REPNOTIFY_Always);
DOREPLIFETIME_CONDITION_NOTIFY(U名称, Health, COND_None, REPNOTIFY_Always);
}
上では、OnRepつまりAttributeが書き換えられたときに値を上書きする処理だけです。
下のほうがReplicateの処理になります。どういう時にRepnotifyのイベントを出すかを設定するみたいですね。(調べてない笑)
次に実行ごとに雪玉が一つ減るというような単純なGameplay Effect(GE)を作ります。
GEファイルを作ります。GE_YukidamaCostとでもしましょう。
まずModifiersを「+」を押して追加して、内容を表示して下記のように設定していきます。
GE_YukidamaCostのプロパティ |
これでOKです。単純に実行するごとに、YukidamaというAttributeから1、減らすという単純なものです。
0 件のコメント:
コメントを投稿