RPG20.创建敌人的初始能力和加载武器
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赋予给Enemyif(!EnemyCombatAbilities.IsEmpty()){for (const TSubclassOf<UWarriorEnemyGameplayAbility>& AbilityClass : EnemyCombatAbilities){if (!AbilityClass) continue;//需要使用ASC并使用GiveAbility(),首先创建AbilitySpecFGameplayAbilitySpec 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的子类蓝图
重命名为