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

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

重命名为

http://www.lryc.cn/news/2398054.html

相关文章:

  • P5684 [CSP-J2019 江西] 非回文串 题解
  • 自适应移动平均(Adaptive Moving Average, AMA)
  • Java密码加密存储算法,SpringBoot 实现密码安全存储
  • 使用 Version Catalogs统一配置版本 (Gradle 7.0+ 特性)
  • 涨薪技术|0到1学会性能测试第95课-全链路脚本开发实例
  • C++文件和流基础
  • Spring AI Alibaba + Nacos 动态 MCP Server 代理方案
  • MCP:让AI工具协作变得像聊天一样简单 [特殊字符]
  • C++ Learning string类模拟实现
  • Message=“HalconDotNet.HHandleBase”的类型初始值设定项引发异常
  • AI炼丹日志-27 - Anubis 通过 PoW工作量证明的反爬虫组件 上手指南 原理解析
  • 阿姆达尔定律的演进:古斯塔夫森定律
  • JavaScript极致性能优化全攻略
  • 批量大数据并发处理中的内存安全与高效调度设计(以Qt为例)
  • Transformer核心原理
  • Grafana-State timeline状态时间线
  • 解决CSDN等网站访问不了的问题
  • 【华为云Astro Zero】组装设备管理页面开发(图形拖拽 + 脚本绑定)
  • PopupImageMenuItem 无响应
  • C++ Vector算法精讲与底层探秘:从经典例题到性能优化全解析
  • Flowith,有一种Agent叫无限
  • 系统思考:短期利益与长期系统影响
  • 大数据 ETL 工具 Sqoop 深度解析与实战指南
  • 【学习记录】Django Channels + WebSocket 异步推流开发常用命令汇总
  • (四)动手实现多层感知机:深度学习中的非线性建模实战
  • HTTP连接管理——短连接,长连接,HTTP 流水线
  • 【免费】2004-2020年各省电力消费量数据
  • Python编程基础(四) | if语句
  • 登录的写法,routerHook具体配置,流程
  • Java-IO流之字节输出流详解