1. 基于StartUpAbilitiy基类创建专门用于敌人数据的DAStartUpABility,然后再基于新创建的DA再创建一个蓝图
2.打开 DataAsset_EnemyStartUpData.h
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Data/StartUpData/DataAsset_StartUpDataBase.h"
#include "AbilitySystem/Abilities/WarriorEnemyGameplayAbility.h"
#include "DataAsset_EnemyStartUpData.generated.h"
/**
*
*/
UCLASS()
class ARPG_GRIVITY_API UDataAsset_EnemyStartUpData : public UDataAsset_StartUpDataBase
{
GENERATED_BODY()
public:
virtual void GiveToAbilitySystemComponent(UXMBAbilitySystemComponent* InASCToGive, int32 ApplyLevel = 1) override;
private:
UPROPERTY(EditDefaultsOnly, Category = "StartUpData")
TArray<TSubclassOf<UWarriorEnemyGameplayAbility>>EnemyCombatAbilities;
};
// Fill out your copyright notice in the Description page of Project Settings.
#include "Data/StartUpData/DataAsset_EnemyStartUpData.h"
#include "AbilitySystem/XMBAbilitySystemComponent.h"
void UDataAsset_EnemyStartUpData::GiveToAbilitySystemComponent(UXMBAbilitySystemComponent* InASCToGive,int32 ApplyLevel)
{
Super::GiveToAbilitySystemComponent(InASCToGive, ApplyLevel);
//将数组中的Abilities赋予给Enemy
if(!EnemyCombatAbilities.IsEmpty())
{
for (const TSubclassOf<UWarriorEnemyGameplayAbility>& AbilityClass : EnemyCombatAbilities)
{
if (!AbilityClass) continue;
//需要使用ASC并使用GiveAbility(),首先创建AbilitySpec
FGameplayAbilitySpec AbilitySpec(AbilityClass);
AbilitySpec.SourceObject = InASCToGive->GetAvatarActor();
AbilitySpec.Level = ApplyLevel;
InASCToGive->GiveAbility(AbilitySpec);
}
}
}
3。之前使用同步加载来对玩家角色进行StartUpAbility加载,因为玩家只有一个实例。但是对于敌人不知道有多少个实例需要被创建,所以加载敌人的StartUpAbility需要使用异步加载的方式进行。
打开WarriorEnemyCharacter.h
public:
//~ Begin APawn Interface.
virtual void PossessedBy(AController* NewController) override;
//~ End APawn Interface.
private:
void InitEnemyStartUpData();
WarriorEnemyCharacter.cpp,这里稍微做了小调整,在创建LoadEdData的时候将DA转换成了敌人的DA
void AWarriorEnemyCharacter::PossessedBy(AController* NewController)
{
Super::PossessedBy(NewController);
InitEnemyStartUpData();
}
void AWarriorEnemyCharacter::InitEnemyStartUpData()
{
if (CharacterStartUpData.IsNull())
{
return;
}
//使用异步加载资产
UAssetManager::GetStreamableManager().RequestAsyncLoad(
CharacterStartUpData.ToSoftObjectPath(),// 将 TSoftObjectPtr 转换为 FSoftObjectPath,供异步加载系统使用
FStreamableDelegate::CreateLambda(
[this]()
{
if (UDataAsset_EnemyStartUpData* LoadedData = Cast<UDataAsset_EnemyStartUpData>(CharacterStartUpData.Get()))
{
// 将加载的数据传递给能力系统组件
LoadedData->GiveToAbilitySystemComponent(XMBAbilitySystemComponent);
Debug::Print(FString::Printf(TEXT("Loaded Enemy StartUp Data: %s"), *CharacterStartUpData.Get()->GetName()));
}
}));
}
同时,也把玩家的也改成这样,转化成玩家的DA。
XMBCharacter.cpp
void AXMBCharacter::PossessedBy(AController* NewController)
{
Super::PossessedBy(NewController);
//
if (!CharacterStartUpData.IsNull())
{
//使用同步加载的方式尝试加载数据
if (UDataAsset_XMBStartUpData* LoadedData = Cast<UDataAsset_XMBStartUpData>(CharacterStartUpData.LoadSynchronous()))
{
LoadedData->GiveToAbilitySystemComponent(XMBAbilitySystemComponent);
}
}
}
4。创建敌人武器的Tag
ARPG_GRIVITY_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(Enemy_Weapon);
UE_DEFINE_GAMEPLAY_TAG(Enemy_Weapon, "Enemy.Weapon");
5。创建BP武器,基于父类创建一个敌人的武器基类,再基于敌人武器基类创建Gruntling的武器
6.创建敌人武器Ability的BP。创建这个BP的子类蓝图
重命名为