Unreal Engine 4 —— GAS系统学习 (二十二) 用C++代码将GA下所需的GE数据进行收集与打包

欢迎大家加入Unreal Engine C++ & Blueprint群一起交流:1143575617 

当角色的招式过多的时候,会带来一些困扰。一个GA招式,需要至少3个GE的效果。如果这个角色有六个招式,那么它至少需要18个GE的效果。当你对某个GE效果不满意的时候,想去调整,会非常麻烦,也容易混淆。

本节通过C++代码建立一个GameplayAbility类,将它下挂的所有我们想获得的GE的数据进行搜集,然后放到一个结构体中,这样再让其他的GA继承自这个自定义的GameplayAbility类,就能轻松获得所有我们想要的GE的数据。

我们先新建一个Actor类,删除除了头文件以外的所有东西,再建立一个枚举类和一个结构体,这些数据就是我们想要从GE收集的数据。

ACTOR类头文件如下:

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "AbilityInfoType.generated.h"

class UMyGameplayAbility;
class UMaterialInstance;

//把想从GA中获得的GE的所有数据打包到这个ACTOR中的枚举与结构体中了。

UENUM(BlueprintType)
enum class ECostType : uint8 {
	Health,
	Heal,
	Mana
};


USTRUCT(BlueprintType)

struct FGameplayAbilityInfo {
	GENERATED_BODY()

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "FGameplayAbilityInfo")
	float Cost;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "FGameplayAbilityInfo")
	float CoolDownDuration;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "FGameplayAbilityInfo")
	ECostType costType;


	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "FGameplayAbilityInfo")
	UMaterialInstance* MUI;


	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "FGameplayAbilityInfo")
	TSubclassOf<UMyGameplayAbility> AbilityClass;

	FGameplayAbilityInfo();
	FGameplayAbilityInfo(float InCost,float InCoolDownDuration,ECostType IncostType,UMaterialInstance*InMUI, TSubclassOf<UMyGameplayAbility> InAbilityClass);
};

CPP文件内容如下:

// Fill out your copyright notice in the Description page of Project Settings.


#include "AbilityInfoType.h"

FGameplayAbilityInfo::FGameplayAbilityInfo():Cost(0), CoolDownDuration(0), costType(ECostType::Health), MUI(nullptr), AbilityClass(nullptr)
{
}

FGameplayAbilityInfo::FGameplayAbilityInfo(float InCost, float InCoolDownDuration, ECostType IncostType, UMaterialInstance* InMUI, TSubclassOf<UMyGameplayAbility> InAbilityClass)
:Cost(InCost),CoolDownDuration(InCoolDownDuration),costType(IncostType),MUI(InMUI),AbilityClass(InAbilityClass){
}

CPP中内容很简单,主要是对参数进行了初始化。这里定义了两个构造函数是为了一会将打包好的数据返回。

 接下来,我们新建一个GameplayAbility类。

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "Abilities/GameplayAbility.h"
#include "AbilityInfoType.h"
#include "MyGameplayAbility.generated.h"


/**
 * 
 */
UCLASS()
class SHIBI_API UMyGameplayAbility : public UGameplayAbility
{
	GENERATED_BODY()
public:
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "GameplayAbilityInfo")
	UMaterialInstance* Mats;
	
	UFUNCTION(BlueprintCallable, Category = "GameplayAbilityInfo")
	FGameplayAbilityInfo GetGameplayAbilityInfo();
};

这里重要的就是我们定义了一个方法用于返回我们之前定义好的结构体数据类型。 记得把我们ACTOR类的头文件导入。

这是CPP文件内容。

#include "MyGameplayAbility.h"

//这个GA就是用来搜集它下挂的所有GE的属性,那些我们想要的属性,获得后打包到结构体中。

FGameplayAbilityInfo UMyGameplayAbility::GetGameplayAbilityInfo()
{
	UGameplayEffect* CooldownEffect = GetCooldownGameplayEffect();
	UGameplayEffect* CostEffect = GetCostGameplayEffect();
	ECostType costType;


	if (CooldownEffect && CostEffect) {
		float CoolDownDuration = 0;
		CooldownEffect->DurationMagnitude.GetStaticMagnitudeIfPossible(1, CoolDownDuration);
		float CostValue = 0;
		if (CostEffect->Modifiers.Num() > 0) {
			FGameplayModifierInfo selectedModifier = CostEffect->Modifiers[0];
			selectedModifier.ModifierMagnitude.GetStaticMagnitudeIfPossible(1, CostValue);
			FString costAttrName = selectedModifier.Attribute.AttributeName;

			if (costAttrName == "Health") {
				costType = ECostType::Health;
			}
			else if (costAttrName == "Heal") {
				costType = ECostType::Heal;
			}
			else if (costAttrName == "Mana") {
				costType = ECostType::Mana;
			}

		}
		return FGameplayAbilityInfo(CostValue,CoolDownDuration,costType,Mats,this->GetClass());
	}
	return FGameplayAbilityInfo();
}

 现在我们对上述代码重要部分进行逐行解释。

	UGameplayEffect* CooldownEffect = GetCooldownGameplayEffect();
	UGameplayEffect* CostEffect = GetCostGameplayEffect();

这两行代码,定义了两个变量,都是UGameplayEffect类型的,很明显是接收GE对象的。这个GE对象从哪来?

从这里来。

 拿到这两个变量之后,说明咱们从GA中对其下挂的GE产生了联系。

		float CoolDownDuration = 0;
		CooldownEffect->DurationMagnitude.GetStaticMagnitudeIfPossible(1, CoolDownDuration);

先来看技能冷却的GE,调用了DurationMagnitude属性。

其实是想获得Scalable Float Magnitude属性的数值,所以要从DurationMagnitude属性开始获取。

GetStaticMagnitudeIfPossible方法就是用来获取Scalable Float Magnitude属性的数值的,从源码就可以看出来:

 当MagnitudeCalculationType为ScalableFloat类型的时候,就返回其值。

 

然后是获取CostEffect的属性值。

		if (CostEffect->Modifiers.Num() > 0) {
			FGameplayModifierInfo selectedModifier = CostEffect->Modifiers[0];
			selectedModifier.ModifierMagnitude.GetStaticMagnitudeIfPossible(1, CostValue);
			FString costAttrName = selectedModifier.Attribute.AttributeName;
            ......
         }

 CostEffect的属性是在Modifiers下面的,Modifiers是数组,0代表着数组第一位元素。

我们现在想拿到第一位元素的Attribute和Scalable Float Magnitude属性的值。

 首先需要判断数组是否有FGmaplayModifierInfo类型的变量,通过CostEffect->Modifiers[0]拿到第一个元素。

再通过这第一个元素拿到数值。

 

最后想拿到Mana属性的值可以通过Attribute属性下的AttributeName属性或者GetName()方法拿到。

将收集全的数据打包返回。

return FGameplayAbilityInfo(CostValue,CoolDownDuration,costType,Mats,this->GetClass());

 

这样我们就可以轻松从蓝图中获得这些数据用作他用,或者去管理这些数据了。 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 学习使用虚幻引擎4构建游戏的方式是通过实践编写游戏学习C语言。虚幻引擎4是一种强大的游戏开发工具,提供了丰富的功能和工具,方便开发者进行游戏开发。 通过使用虚幻引擎4作为学习工具,学生可以将编写代码与实际游戏开发结合起来,加深对C语言的理解。从创建游戏场景、添加角色和物体、设计游戏逻辑等方面进行实际编码,可以使学生更好地理解编程概念和语法。 使用虚幻引擎4进行游戏开发还可以激发学生的创造力和想象力。学生可以利用引擎中丰富的资源库,包括各种角色、场景和音效,来创建自己的游戏世界。他们可以设计自己的游戏规则和关卡,实现自己的游戏想法。 此外,通过构建游戏,学生还可以学习游戏开发的整个流程,包括项目管理、协作和测试等方面。他们将面临各种开发挑战,并学会解决问题和调试代码。 总之,通过使用虚幻引擎4构建游戏学习C语言,学生不仅能够掌握编程技巧,还能在创意和设计方面得到锻炼。这种学习方式不仅能够提高学生的编程能力,还能激发他们对游戏开发的兴趣,并为未来进一步深入学习游戏开发打下坚实的基础。 ### 回答2: 《通过使用虚幻引擎4构建游戏学习C语言》是一本教你如何通过使用虚幻引擎4来构建游戏学习C语言的书籍。这个教程从基础知识开始,向读者介绍了C语言的基本概念、语法和编程原则。通过学习这本书,读者可以了解如何使用C语言来开发虚幻引擎4中的游戏。 这本书以构建游戏作为学习C语言的主题是非常巧妙的。通过实际动手的方式,读者可以将理论知识应用到实践中,加深对C语言的理解和掌握。而虚幻引擎4作为一款流行的游戏开发引擎,具有强大的功能和广泛的应用,将帮助读者更好地理解C语言在游戏开发中的应用。 本书的内容涵盖了虚幻引擎4的基本概念和工具,包括游戏世界的创建、角色控制、动画效果、碰撞检测等。读者将学习如何使用C语言编写代码来实现这些功能,并通过实际示例进行实践。通过阅读和完成书中的练习,读者将逐步提高他们的编程技能,并对游戏开发有更深入的了解。 这本书还适合那些有一定编程基础但想扩展他们的技能并进一步了解游戏开发的读者。通过结合C语言和虚幻引擎4,读者将能够学习到如何开发高质量和功能强大的游戏。同时,本书也提供了许多实用的技巧和建议,帮助读者解决在游戏开发过程中可能遇到的问题。 总之,通过使用虚幻引擎4构建游戏学习C语言是一种创新和有趣的方式。这本书不仅能够帮助读者系统学习C语言的知识,还能让他们在实践中提高自己的编程技能。无论是对于初学者还是有经验的开发者来说,这本书都是一个值得推荐的资源。 ### 回答3: 通过使用虚幻引擎4构建游戏学习C语言 《通过使用虚幻引擎4构建游戏学习C语言》是一本教程式书籍,旨在帮助读者通过动手实践游戏开发来学习C语言。本书借助强大的虚幻引擎4提供的开发环境,让读者能够充分了解和掌握C语言的相关知识。 通过构建游戏学习C语言具有多重优势。首先,游戏开发是一个非常具有趣味性的项目。与枯燥的理论学习相比,通过动手实践游戏开发,读者可以更好地专注于学习过程,更易于融会贯通。其次,虚幻引擎4是一款广泛应用于游戏开发的强大软件,它提供了丰富的功能和工具,帮助读者更好地理解和应用C语言。 在这本书中,读者将逐步了解C语言的基础知识,并学习如何在虚幻引擎4中应用这些知识来构建游戏。书中通过一系列的实例和案例,引导读者学习如何使用C语言编写游戏逻辑和脚本,如何创建人物角色、场景和动画等。读者将掌握如何使用虚幻引擎4的资源管理系统、物理引擎和图形渲染技术等关键功能,以及如何在游戏中实现交互、音效和视觉效果。 通过学习C语言,读者将能够理解计算机编程的基本原理和概念,并掌握一种常用的编程语言。而通过结合虚幻引擎4的游戏开发,读者将更深入地了解游戏设计和开发的流程,同时也可以提升自己在游戏开发领域的技能和竞争力。 总而言之,《通过使用虚幻引擎4构建游戏学习C语言》是一本既有趣又实用的教材,它为想要学习C语言并对游戏开发感兴趣的读者提供了一个很好的机会和平台。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值