UE4动作游戏实例RPG Action解析三:实现效果,三连击Combo,射线检测,显示血条,火球术

这篇具有很好参考价值的文章主要介绍了UE4动作游戏实例RPG Action解析三:实现效果,三连击Combo,射线检测,显示血条,火球术。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、三连Combo

实现武器三连击,要求:

1.下一段Combo可以随机选择,

2.在一定的时机才能再次检测输入

3. 等当前片段播放完才播放下一片段

1.1、蒙太奇设置

通过右键-新建蒙太奇片段,在蒙太奇里创建三个片段,并且移除相关连接,这样默认只会播放第一个片段

不同片段播放动画从 资产浏览器拖入,

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4

1.2、创建JumpSection 动画通知类

重载NotifyBegin和NotifyEnd方法

NotifyBegin 设置一个bool变量 开启检测攻击输入

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4

NotifyEnd 设置bool变量为false,关闭检测攻击输入

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4

创建一个数组,用于编辑下段Combo可选的名字

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4

1.3、在攻击期间检测 输入,实现连击

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4

主要函数 蒙太奇设置下个片段, 如果想立刻跳转也可以设置 蒙太奇调至片段

目标 是当前 动画实例

Section Name to Change是当前正在播放的片段

Next Section是要跳转的片段

Montage 是当前激活的蒙太奇

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4

至此,三连击的功能就实现完了。

二、射线检测获取目标

2.1、创建球体射线检测TargetType

BlueprintNativeEvent 表示希望蓝图里被重载,这样定以后,会优先调用蓝图中的Event,如果蓝图中该Event没有方法体,则调用C++的方法_Implementation

/** Called to determine targets to apply gameplay effects to */
	UFUNCTION(BlueprintNativeEvent)
	void GetTargets(ARPGCharacterBase* TargetingCharacter, AActor* TargetingActor, FGameplayEventData EventData,
		TArray<FHitResult>& OutHitResults, TArray<AActor*>& OutActors) const;

主要方法:对象的多球体检测

注意!!!

UCLASS(Blueprintable, meta = (ShowWorldContextPin))
class ACTIONRPG_API URPGTargetType : public UObject

加了ShowWorldContextPin之后,对于继承UObject的RPGTargetType 蓝图 才能显示对象的多盒体检测等方法 ,需要指定WorldContextOject对象

Start :初始位置,添加一个OffsetFromActor向量

End:结束位置 Actor向前向量,添加一个长度 变量

SphereRadius, 检测半径

ObjectTypes :

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4

DrawDebug 可以绘制检测框

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4

根据检测的结果 获取命中结果信息列表 作为返回值,中间判断了一下Hit Actor是否有效

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4

2.2、蒙太奇 创建Send EventTag 动画通知类事件

发送EventTag, Payload数据为空

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4

蒙太奇 添加该动画通知类事件,并编辑EventTag

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4

通过解析八可知,在Player攻击的GameplayAbility添加GameplayEffects,这样收到EventTag后,就会根据TargetType获取目标,然后应用对应的TargetGameplayEffect效果

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4

2.3、结果如下

第三段攻击创建了一个胶囊体碰撞框,绿色是检测到了目标

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4

三、AttributeSet

3.1、Attribute Set 介绍:

PreAttributeChange : 任意属性发生变化前都会调用,通常用于强加规则给数值

PostGameplayEffectExecute: 任意影响Attribute的GameplayEffect执行之后都会调用,通常用于clamp数值,触发游戏中的事件

原文链接:GAS - Gameplay Attributes

Attribute
属性,记录Actor数值信息,类型为FGameplayAttributeData(目前就是float),常见的属性有血量、蓝量、攻击力、移动速度等等。通常使用Gameplay Effect来作用于Attribute,对属性值进行修改。
Gameplay Attribute可以说是这个系统的数据核心了,我们使用GAS的目的就是改变Actor的数值属性和状态(状态通常就是个二进制数Yes or No,使用Gameplay Tag)。设计技能也是从Actor拥有的属性出发的。


Attribute Set
Define and Configure attribute(定义和配置属性)
如何给Actor添加属性呢?这里要使用AttributeSet类,顾名思义,属性集类。在这个类中定义的float(被UPROPERTY标记)就是Attribute。

 

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4



RPGAttributeSet,h

上图中的Health,MaxHealth,Mana都是属性,当然还有一些函数和宏定义,它们的功能后面细说。
创建好自己的AttributeSet类之后,必须使用AbilitySystemComponent注册它。实现方式有两种:
1、将其设为拥有AbilitySystemComponent的Actor的SubObject。

 

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4



RPGCharacterBase.h


在构造函数中:
 

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4



RPGCharacterBase.cpp


2、将类传给Ability System Component的GetOrCreateAttributeSubobject函数。
 

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4



AbilitySystemComponent.cpp


相关的响应函数(不知道该如何称呼,暂且定这个叫法)
当属性值发生变化时,或是施放GameplayEffect时,我们希望做一些处理,此时就需要系统提供的响应函数来进行操作。如ActionRPG中,实现了两个函数:
 

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4



RPGAttributeSet.h


插播:写override是个好习惯!!!
响应函数主要有:

  • PreAttributeBaseChange
  • PreAttributeChange
  • PreGameplayEffectExecute
  • PostGameplayEffectExecute

这里要提一下,Base value和(Current) value的区别。Base value是永久修改的,而value是暂存,这里应该涉及到网络相关,GAS是支持客户端回滚的。
各函数描述:
注意!!只能应用修改符和Setter来改变属性值(current value),应该也是为同步服务的
PreAttributeBaseChange:在base value修改前调用。因为是永久修改,不允许使用temporary modifiers(修改符也是一个类,通常修改属性是使用GameplayEffect,里面定义了基本的修改符,也可以自己拓展),不应该在游戏逻辑中使用。最多用来做数值的Clamp。
PreAttributeChange:同上,只是这里可以使用temporary modifiers。例子:

 

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4



RPGAttributeSet.cpp

PreGameplayEffectExecute,PostGameplayEffectExecute:顾名思义,技能释放前、后会被调用。
 

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4



官方描述


Replication(网络)
需要在UPROPERTY中添加ReplicatedUsing = OnRep_MyAttribute,同时要在GetLifetimeReplicatedProps函数中设置LiftTime,于是最后会变得像是这样。

 

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4


 

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4



ActionRPG中是这样的,LifeTime的设置不一样,如果上图中说的无误,则ActionRPG这样设置在联机时可能会出现Error。

 

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4



RPGAttributeSet.cpp

相关宏(Macro)
在前面的响应函数实现中,我们发现要使用许多Get函数,来获得属性或是属性值。幸好,引擎为我们准备好了宏。

 

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4



AttributeSet.h

数据驱动
你可以用数据表来初始化你的AttributeSet。

 

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4

3.2、RPGAction Health属性解析

3.2.1 定义 一个Health 属性 和一个 MaxHealth属性:

// Uses macros from AttributeSet.h
#define ATTRIBUTE_ACCESSORS(ClassName, PropertyName) \
	GAMEPLAYATTRIBUTE_PROPERTY_GETTER(ClassName, PropertyName) \
	GAMEPLAYATTRIBUTE_VALUE_GETTER(PropertyName) \
	GAMEPLAYATTRIBUTE_VALUE_SETTER(PropertyName) \
	GAMEPLAYATTRIBUTE_VALUE_INITTER(PropertyName)

/**
 * 
 */
UCLASS()
class ACTIONRPGCOPY_API URPGAttributeSet : public UAttributeSet
{
	GENERATED_BODY()
	
public:

	URPGAttributeSet();
	virtual void PreAttributeChange(const FGameplayAttribute& Attribute, float& NewValue) override;
	virtual void PostGameplayEffectExecute(const FGameplayEffectModCallbackData& Data) override;

	/** Current Health, when 0 we expect owner to die. Capped by MaxHealth */
	UPROPERTY(BlueprintReadOnly, Category = "Health")
	FGameplayAttributeData Health;
	ATTRIBUTE_ACCESSORS(URPGAttributeSet, Health)

	/** MaxHealth is its own attribute, since GameplayEffects may modify it */
	UPROPERTY(BlueprintReadOnly, Category = "Health")
	FGameplayAttributeData MaxHealth;
	ATTRIBUTE_ACCESSORS(URPGAttributeSet, MaxHealth)
};

3.2.2 PreAttributeChange : 任意属性发生变化前都会调用,通常用于强加规则给数值

RPGAction添加了函数 AdjustAttributeForMaxChange , 其作用是,当属性最大值发生改变时,按比例改变当前值。

void URPGAttributeSet::AdjustAttributeForMaxChange(FGameplayAttributeData& AffectedAttribute, const FGameplayAttributeData& MaxAttribute, float NewMaxValue, const FGameplayAttribute& AffectedAttributeProperty)
{
//获得UAbilitySystemComponent实例
    UAbilitySystemComponent* AbilityComp = GetOwningAbilitySystemComponent();、
//Getter方法获取的都是current value而不是base value
    const float CurrentMaxValue = MaxAttribute.GetCurrentValue();
    if (!FMath::IsNearlyEqual(CurrentMaxValue, NewMaxValue) && AbilityComp)
    {
        // Change current value to maintain the current Val / Max percent
        const float CurrentValue = AffectedAttribute.GetCurrentValue();
        float NewDelta = (CurrentMaxValue > 0.f) ? (CurrentValue * NewMaxValue / CurrentMaxValue) - CurrentValue : NewMaxValue;
                //      通过UAbilitySystemComponent实例
        AbilityComp->ApplyModToAttributeUnsafe(AffectedAttributeProperty, EGameplayModOp::Additive, NewDelta);
    }
}


我们要注意到对属性值的修改是通过调用GameplayAbilityComponent的ApplyModToAttributeUnsafe方法实现的。

3.2.3 PostGameplayEffectExecute: 任意影响Attribute的GameplayEffect执行之后都会调用,通常用于clamp数值,触发游戏中的事件

void URPGAttributeSet::PostGameplayEffectExecute(const FGameplayEffectModCallbackData& Data)
{
	Super::PostGameplayEffectExecute(Data);

//GameplayEffectContext结构体存有关于GameplayEffectSpec创建者(Instigator)和TargetData的信息
	FGameplayEffectContextHandle Context = Data.EffectSpec.GetContext();
	UAbilitySystemComponent* Source = Context.GetOriginalInstigatorAbilitySystemComponent();
	const FGameplayTagContainer& SourceTags = *Data.EffectSpec.CapturedSourceTags.GetAggregatedTags();

	float DeltaValue = 0;
	if (Data.EvaluatedData.ModifierOp == EGameplayModOp::Type::Additive)
	{
		DeltaValue = Data.EvaluatedData.Magnitude;
	}

	AActor* TargetActor = nullptr;
	ARPGCharacterBase* TargetCharacter = nullptr;
	if (Data.Target.AbilityActorInfo.IsValid() && Data.Target.AbilityActorInfo->AvatarActor.IsValid())
	{
		TargetActor = Data.Target.AbilityActorInfo->AvatarActor.Get();
		TargetCharacter = Cast<ARPGCharacterBase>(TargetActor);
	}

	if (Data.EvaluatedData.Attribute == GetHealthAttribute())
	{
		SetHealth(FMath::Clamp(GetHealth(),0.0f,GetMaxHealth()));

		if (TargetCharacter)
		{
			TargetCharacter->HandleHealthChanged(DeltaValue,SourceTags);
		}
	}
}

四、创建血条

4.1、创建一个血条UI

1.1 创建一个控件蓝图如下,右下角可以调节大小,

添加一个进度条

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4

1.2 在图表层,添加SetProgress方法,输入参数是 float型,设置百分比

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4

1.3 把控件蓝图 拖入到BP_EnemyCharacter对象上,调整到合适位置

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4

控件类 设置成 刚刚创建的血条控件

空间 设置成屏幕类型

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4

4.2、获取敌人生命值百分比

在上一节中在BP_CharacterBase创建了一个函数OnHealthChanged

	UFUNCTION(BlueprintImplementableEvent)
	void OnHealthChanged(float DeltaValue,const FGameplayTagContainer& EventTags);

当生命值发生变化时,这个函数会调用到

在BP_EnemyCharacter蓝图实现函数:血条百分比 = Health值/MaxHealth值

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4

4.3、创建一个GameplayEffect 扣除Health 效果

在Player 的攻击GA 添加该效果,打到敌人就会扣10点血,BP_Character默认Health值设置100

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4

4.4、最终效果

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4

五、火球术

5.1、创建一个Actor火球

创建一个Actor蓝图类,BP_AbilityProjectileBase,作为远程武器的蓝图基类,

添加球体碰撞组件,箭头组件,

ProjectileMovement组件:具有赋予场景内组件初速度的功能

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4

设置初速度,并且把 发射物重力范围 数值调整为0 这样便不会 受重力影响了

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4

创建一个子蓝图BP_FireBall,添加一个粒子效果,

注意!!!如果材质里元素2 赋值不了,可以重启引擎

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4

把FireBall拖入场景中运行即可看到火球超前飞去

设置FireBall 的生命周期为10s

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4

5.2、在命中到WorldStatic和WorldDynamic对象时,发射一个粒子事件,并销毁自身

设置FireBall 球体碰撞的 碰撞事件,和墙壁等发生阻挡,Pawn触发重叠事件

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4

事件命中:此Actor与阻挡物体发生碰撞,或阻挡另一个与之碰撞的Actor时调用的事件

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4

5.3、添加输入

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4

BP_CharacterBase增加一个激活方法

bool ARPGCharacterBase::ActivateAbilitiesWithTag(FGameplayTagContainer AbilityTags, bool bAllowRemoteActivation)
{
	if (AbilitySystemComponent)
	{
		return AbilitySystemComponent->TryActivateAbilitiesByTag(AbilityTags,bAllowRemoteActivation);
	}

	return false;
}

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4

通过AbilityTags激活技能

5.4、创建释放远程武器技能GameplayAbility

创建一个远程武器技能基类,GA_SpawnProjectileBase,

前面和近战播放技能一样,在收到蒙太奇 发送的技能EventTag之后,调用EventReceived方法

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4

创建一个RPGGameplayEffectContainerSpec结构,再根据ProjectileClass生成Actor, ProjectileClass是刚刚创建的火球基类类型BP_AbilityProjectileBase,获取Actor信息作为生成位置,

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4

DoesEffectContainerSpecHaveEffects 是判断是否有GameEffect

继承GASpawnProjectileBase 创建一个子类GA_PlayerSkillFireBall,设置参数

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4

在蒙太奇播放的选定时间发送EventTag,

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4

5.5、火球在飞行过程中,触发重叠事件和命中事件

重叠事件中,把技能释放中生成的EffectContainerSpec 应用到Actor, 这样Actor便会应用GamepalyEffect效果

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4

在子类的重叠事件中也加一个播放粒子效果并销毁Actor效果

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4

至此,效果便完成了

ue rpgaction解析,UE4动作游戏实例RPG Action解析,ue4文章来源地址https://www.toymoban.com/news/detail-832043.html

到了这里,关于UE4动作游戏实例RPG Action解析三:实现效果,三连击Combo,射线检测,显示血条,火球术的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • DNF类游戏动作实现(C语言)

    没有接触制作小游戏前,感觉做游戏很不可思议,游戏里的人物是怎么移动的,怎么攻击,释放技能。。。。。。现在逐渐了解到之后,发现2d游戏人物的动作更多是图片的拼接,动作是否精细,由这个动作的帧数决定。这篇博客会简单实现2d人物的动作,效果如下。 2d人物动

    2024年02月04日
    浏览(43)
  • 【unity】制作一个角色的初始状态(左右跳二段跳)【2D横板动作游戏】

            hi~ 大家好!欢迎大家来到我的全新unity学习记录系列。现在我想在2d横板游戏中,实现一个角色的初始状态-闲置状态、移动状态、空中状态。并且是利用 状态机 进行实现的。         本系列是跟着视频教程走的,所写也是作者个人的学习记录笔记。如有错误请联系

    2024年02月04日
    浏览(46)
  • 《勇士传说》横版卷轴动作类游戏笔记-2.素材导入和整理

    该笔记为M_Studio老师今年免费更新的面向初学者的教程的笔记,只会更新老师免费更新的部分,中文课堂独有的部分不会更新。教程中所有的演示均为付费版下的演示,观看免费版的小伙伴可能会出现和笔记不同的情况,欢迎提问。 课程介绍: https://www.bilibili.com/video/BV1zY41

    2024年02月14日
    浏览(39)
  • 横版动作闯关游戏:幽灵之歌 GHOST SONG 中文版

    在洛里安荒凉的卫星上,一件长期休眠的死亡服从沉睡中醒来。踏上发现自我、古老谜团和宇宙骇物的氛围2D冒险之旅。探索蜿蜒的洞穴,获得新的能力来揭开这个外星世界埋藏已久的秘密。 游戏特点 发现地下之物 探索这个广阔而美丽如画,充满密室和诡异历史的2D世界的扭

    2024年01月16日
    浏览(48)
  • 低成本动作捕捉解决方案及虚幻VR网络游戏开发

    大家好,我叫人宅,很高兴和大家一起分享一下本套直播课程。 课程名称:元宇宙VR技术研发 低成本动作捕捉解决方案及虚幻VR网络游戏开发 主要介绍: 在过去我们做动画,需要具备动画师能力才可以去做,K了一天动画,差不多就几秒。如果是公司,需要招聘动画师,每位动

    2023年04月11日
    浏览(35)
  • 【Python搞笑游戏】因蔡徐坤打篮球动作超火,被某程序员写成了一款游戏,画面美到不敢看,成功学到了精髓~(附源码免费)

    之前网络最火的梗,非“C徐坤打篮球”莫属。个人感觉,只有多年前的“春哥纯爷们”堪与匹敌! 虽然说C徐坤打篮球是一个老梗了,但是确实非常搞笑,今天就跟着小编一起来回忆一下吧! “我是练习两年半的个人练习生— C 徐坤,喜欢,唱、跳、RAP、 打篮球......” 那么

    2023年04月16日
    浏览(43)
  • UE4 中可全局获取的变量(例如游戏实例、玩家控制器等) 详解

    🙋‍♂️ 作者:海码007 📜 专栏:UE虚幻引擎专栏 💥 标题:UE4 中可全局获取的变量(例如游戏实例、玩家控制器、游戏模式等) 详解 ❣️ 寄语:加油,一次专注一件事! 🎈 最后: 文章作者技术和水平有限,如果文中出现错误,希望大家能指正,同时有问题的话,欢迎

    2024年02月06日
    浏览(101)
  • UE4动画系统,蒙太奇动画使用,添加动作

    提示:仅供学习参考 前言 一、什么是蒙太奇? 二、实现步骤 1.使用第三人称游戏c++模板创建一个项目,创建动画蒙太奇 2.在动画蓝图中添加蒙太奇 3.绑定鼠标左键输入  4.添加c++代码 5.设置动画蒙太奇  6.点击播放,鼠标右键就能看到挥手效果了 总结 本文介绍如何使用UE4的

    2024年02月05日
    浏览(50)
  • UE4游戏保存

    在游戏运行过程中由于某些事情需要暂停一下游戏,那就需要把游戏当前的进度保存起来,下次打开的时候还可以再次玩,我们这里主要保存的就是。所有需要有一个游戏保存的机制。UE4提供了这样的机制。 首先新建一个类继承在SaveGame,命名为FirstSaveGame 打开VS2019编辑代码

    2024年02月12日
    浏览(53)
  • ue4游戏dump

    链接 UE4Dumper:https://github.com/kp7742/UE4Dumper 游戏示例: https://www.bilibili.com/video/BV12v41167Gy 定义 GWorld 指向游戏世界对象 GNames 指向游戏字符串数组 GUObject 指向游戏对象数组 UE4版本 查看AndroidManifest.xml 游戏版本为 U E 4 + R e l e a s e - 4 . 2 5 指针怎么找 GWorld 切换到Exports 搜索【

    2024年02月04日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包