当前位置: 首页 > news >正文

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的子类蓝图

重命名为

相关文章:

  • MYSQL索引详解及索引优化、分析
  • 乐播视频v4.0.0纯净版体验:高清流畅的视听盛宴
  • C++ TCP传输心跳信息
  • 线性动态规划
  • Java面试八股--07-项目篇
  • AI“实体化”革命:具身智能如何重构体育、工业与未来生活
  • 数据库包括哪些?关系型数据库是什么意思?
  • “刹车思维”:慢,是为了更快
  • 什么是链游,链游系统开发价格以及方案
  • ESOP股权管理平台完整解决方案
  • 北京大学肖臻老师《区块链技术与应用》公开课:07-BTC-挖矿难度
  • superior哥AI系列第6期:Transformer注意力机制:AI界的“注意力革命“
  • 三、Sqoop 全量导入核心命令
  • 【摘录】显示屏购买要注意的参数
  • nginx去掉暴漏外边的版本号
  • 普中STM32F103ZET6开发攻略(四)
  • 06 APP 自动化- H5 元素定位
  • 冷链物流智能监控终端技术方案——EFISH-SCB-RK3588国产化替代实践
  • Mybatis--创建mapper接口
  • 知识库检索方法详解:稀疏 vs 稠密;《第一篇》
  • 做兼职 那个网站靠谱/南宁推广公司
  • 国内广告投放平台/厦门百度快速优化排名
  • 新闻自动采集网站源码/模板建站的网站
  • 晋江市住房和城乡建设网站/中国国际新闻
  • 无锡万度网站建设/短视频营销的优势
  • 做网站年赚千万/典型的网络营销案例