100. UE5 GAS RPG 显示范围魔法的攻击范围

在这一篇里,我们将制作一个范围魔法,释放魔法时,我们将在鼠标拾取位置绘制一个魔法光圈,用于显示技能释放时攻击的范围,然后再次点击可以释放技能。

创建贴花类

魔法范围标识的光圈,我们采用贴花实现,首先我们创建一个类,用于作为这种类型的贴花的基类,贴花是组件对象,我们需要创建一个基于Actor的类,用于挂载贴花组件。
在这里插入图片描述
命名
在这里插入图片描述
在类里增加一个贴花组件

UCLASS()
class RPG_API AMagicCircle : public AActor
{
	GENERATED_BODY()
	
public:	
	AMagicCircle();
	virtual void Tick(float DeltaTime) override;

	//魔法光环法阵贴花
	UPROPERTY(VisibleAnywhere, BlueprintReadOnly)
	TObjectPtr<UDecalComponent> MagicCircleDecal;
protected:
	virtual void BeginPlay() override;
};

在构造函数里,初始化贴花,并附加到根组件上

AMagicCircle::AMagicCircle()
{
	PrimaryActorTick.bCanEverTick = true;

	MagicCircleDecal = CreateDefaultSubobject<UDecalComponent>("MagicCircleDecal");
	MagicCircleDecal->SetupAttachment(GetRootComponent());
}

编译代码,创建一个基于贴花类的蓝图
在这里插入图片描述
在贴花组件上设置贴花材质
在这里插入图片描述
我们可以设置贴花组件范围缩放,来设置贴花的显示范围,注意,贴花会基于x轴的方向贴到表面,所以,如果想让贴花贴到地面,我们需要x轴垂直到地面。
在这里插入图片描述
将其放置到场景内查看效果。
在这里插入图片描述

实现贴花的显示隐藏以及跟随鼠标移动

接下来,我们要实现贴花的显示隐藏,由于贴花需要跟随鼠标移动,鼠标移动拾取是在PlayerController里实现的,我们将其实例放到PlayerController类里。

在PlayerController里,我们增加两个属性,用于设置贴花的类,并在需要显示时,设置保存贴花实例的属性,并增加一个更新贴花位置的函数,在帧回调里调用。

	//创建奥数光圈使用的类
	UPROPERTY(EditDefaultsOnly)
	TSubclassOf<AMagicCircle> MagicCircleClass;

	//存储魔法光圈的属性,不需要暴露给蓝图
	UPROPERTY()
	TObjectPtr<AMagicCircle> MagicCircle;

	void UpdateMagicCircleLocation() const; //每一帧调用,更新魔法光圈的位置

增加两个public函数,用于玩家角色类调用显示和隐藏贴花

	//显示魔法光圈 并设置光圈贴花材质
	UFUNCTION(BlueprintCallable)
	void ShowMagicCircle(UMaterialInterface* DecalMaterial);

	//隐藏魔法光圈
	UFUNCTION(BlueprintCallable)
	void HideMagicCircle() const; 

在显示贴花时,我们将在实例不存在的情况下创建一个,并修改它的材质。
在隐藏时,我们将贴花销毁掉。

void ARPGPlayerController::ShowMagicCircle(UMaterialInterface* DecalMaterial)
{
	if(!IsValid(MagicCircle)) MagicCircle = GetWorld()->SpawnActor<AMagicCircle>(MagicCircleClass);

	//设置贴花材质
	if(DecalMaterial != nullptr)
	{
		MagicCircle->MagicCircleDecal->SetMaterial(0, DecalMaterial);
	}
}

void ARPGPlayerController::HideMagicCircle() const
{
	if(IsValid(MagicCircle)) MagicCircle->Destroy();
}

接着就是更新贴图的位置,如果贴花实例存在,我们将鼠标拾取的位置设置给贴花

void ARPGPlayerController::UpdateMagicCircleLocation() const
{
	if(IsValid(MagicCircle))
	{
		MagicCircle->SetActorLocation(CursorHit.ImpactPoint);
	}
}

并在每一帧更新里去调用更新贴花位置
在这里插入图片描述
接下来,我们在PlayerController里设置贴花的类
在这里插入图片描述
在playerController里编写一些测试节点,测试贴花是否能够正确显示隐藏
在这里插入图片描述
接着运行测试效果
在这里插入图片描述
我们想让贴花能够自动旋转,先在贴花里,将组件设置为蓝图可视
在这里插入图片描述
然后在贴花类里的帧回调设置基于x轴旋转,每一帧修改,贴花会自己旋转起来。
在这里插入图片描述
这个贴花的显示隐藏不应该是PlayerController的功能,所以,我们将在玩家角色类增加对应的函数。为了方便后续调用,我们将其作为角色接口的函数,后面只需要通过接口调用即可。
我们在player interface里增加两个函数,用于显示和隐藏贴花


	//显示魔法光圈,并设置魔法光圈的贴花材质
	UFUNCTION(BlueprintNativeEvent, BlueprintCallable)
	void ShowMagicCircle(UMaterialInterface* DecalMaterial = nullptr);

	//隐藏魔法光圈
	UFUNCTION(BlueprintNativeEvent, BlueprintCallable)
	void HideMagicCircle();

玩家角色类继承PlayerInterface接口,我们直接覆写

	virtual void ShowMagicCircle_Implementation(UMaterialInterface* DecalMaterial) override;
	virtual void HideMagicCircle_Implementation() override;

并实现对应的函数,函数内获取到PlayerController并调用对应的函数

void ARPGHero::ShowMagicCircle_Implementation(UMaterialInterface* DecalMaterial)
{
	if(ARPGPlayerController* RPGPlayerController = Cast<ARPGPlayerController>(GetController()))
	{
		RPGPlayerController->ShowMagicCircle(DecalMaterial);
	}
}

void ARPGHero::HideMagicCircle_Implementation()
{
	if(ARPGPlayerController* RPGPlayerController = Cast<ARPGPlayerController>(GetController()))
	{
		RPGPlayerController->HideMagicCircle();
	}
}

将PlayerController里的测试节点删除,在玩家角色蓝图里增加使用接口函数调用,并修改一个贴花测试修改材质的函数。
在这里插入图片描述
我们设置一个新的贴花,并将颜色修改掉,运行查看效果即可。
在这里插入图片描述

### UE5 中基于 GAS 架构的 RPG 游戏开发 #### 创建角色属性系统 在 Unreal Engine 5 (UE5) 的游戏中,Gameplay Ability System (GAS) 提供了一种强大的方式来管理游戏角色的能力和属性。为了创建一个基本的角色属性系统,在项目设置中启用插件 `GameplayAbilities` 和 `GameplayTags` 是必要的[^1]。 定义自定义属性集类继承于 `UAttributeSet` 类,用于表示玩家的生命值、法力值和其他统计信息: ```cpp // MyCharacterAttributes.h #pragma once #include "CoreMinimal.h" #include "GameFramework/Actor.h" #include "AbilitySystemComponent.h" #include "MyCharacterAttributes.generated.h" /** * */ UCLASS() class MYGAME_API UMyCharacterAttributes : public UAttributeSet { GENERATED_BODY() public: UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Attributes") FGameplayAttributeData Health; ATTRIBUTE_ACCESSORS(UMyCharacterAttributes, Health) // Other attributes like Mana, Stamina can be added here similarly. }; ``` #### 实现能力框架 接着实现具体的游戏玩法功能——即“能力”。这涉及到编写新的 C++ 或蓝图脚本文件以扩展 `UGameplayAbility` 基础类。这些对象封装了执行特定动作所需的数据逻辑,比如攻击敌人或施放魔法技能等操作。 对于每个想要赋予给角色的新能力,都需要单独创建对应的子类实例并配置其行为参数。例如,可以构建名为 `AGrenadeThrowAbility` 的投掷手雷能力类,并通过编辑器界面指定冷却时间、消耗资源量以及效果范围等相关设定。 #### 设计任务与奖励机制 当考虑如何在游戏中引入任务系统时,可以通过 GAS 来追踪目标进度并向完成挑战的用户提供反馈。利用 `FGameplayTagContainer` 结合标签查询表达式匹配条件触发事件,从而动态调整难度等级或是解锁新区域等内容更新。 此外,还可以借助该系统的灵活性为不同类型的成就设立专属奖赏池,允许开发者轻松定制各种形式的经验加成、道具掉落概率提升等奖励措施。 #### 集成用户界面显示 为了让玩家能够直观了解当前状态变化情况,应该同步修改 HUD 组件以便实时反映最新数值变动。通常做法是在屏幕角落固定位置绘制小型图标条形图等形式展示生命槽、能量棒之类的关键指标;同时也可以采用弹窗提示框的方式告知重要消息通知。 最后值得注意的是,由于 GAS 自身并不直接处理 UI 层面的工作,因此这部分工作往往需要额外投入一定精力去精心打磨用户体验细节部分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值