UE4 C++实现人物攻击

Posted Vincent_0000

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UE4 C++实现人物攻击相关的知识,希望对你有一定的参考价值。

效果展示

使用动画蒙太奇实现人物攻击
按下左键之后,人物会进行攻击动作:



随机输出攻击动画。

创建动画蒙太奇

把我们的动画插入其中:

右击后点击新建蒙太奇部分:

在Sections部分点击Preview 就可以分为多段:

拉到最下面:
在Notifies中创建通知,通知移动到与动画结束相对应的部分,通知代表的意思是动作结束了。


点击那个放大镜可以看到插槽管理,第二个就是我们当前的这个动画,可以进行重命名也可以进行添加。

在动画蓝图中添加动画蒙太奇

打开动画蓝图,看到状态机部分:

这个是最顶端的状态,在状态中添加我们的那段蒙太奇部分。

绑定按钮及实现触发函数

在项目设置中绑定按钮:

左键点击攻击。

打开角色C++文件:

.h文件

  • 声明动画蒙太奇,给任务绑定动画蒙太奇
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
	class UAnimMontage* _AnimMontage;

  • 储存是否处于攻击状态,处于攻击状态其他的一些状态就会受到限制 bool bAttacking;

  • 储存是否处于鼠标左键点击状态,用于判断是否可以进行连续攻击, bool bClicking;

  • 鼠标点击开始、结束

UFUNCTION()
	void OnClickBegin();

UFUNCTION()
	void OnClickEnd();
  • 攻击开始、结束
void AttackBegin();

UFUNCTION(BlueprintCallable)
	void AttackEnd();

.cpp 文件

先将一些东西进行一下限制:

  • OnInteract()、MoveForward(float Value)、MoveRight(float Value)
    添加:if (bAttacking) return;,攻击的时候不能移动,拾取东西。

  • 攻击开始函数, 将开启攻击状态、获取动画实例,判断是否有动画蒙太奇、实例是否存在、实例是否在进行播放动画蒙太奇,符合条件的话就开始播放动画蒙太奇,接下来就要让动画跳转到我们需要的部分进行播放,使用随机函数输出我们要输出哪一个动作。

添加头文件:

#include "Components/SkeletalMeshComponent.h"
#include "Animation/AnimInstance.h"
void ARole::AttackBegin()
{
	bAttacking = true;
	UAnimInstance* Instance = GetMesh()->GetAnimInstance();
	if (_AnimMontage && Instance && !Instance->Montage_IsPlaying(_AnimMontage)) {
		Instance->Montage_Play(_AnimMontage);

		switch (FMath::RandRange((int32)1, 3)) {
		case 1 : 
			Instance->Montage_JumpToSection(FName("Attack1"), _AnimMontage);
			break;
		case 2 : 
			Instance->Montage_JumpToSection(FName("Attack2"), _AnimMontage);
			break;
		case 3 : 
			Instance->Montage_JumpToSection(FName("Attack3"), _AnimMontage);
			break;
		}
	}
}
  • 攻击结束
void ARole::AttackEnd()
{
	bAttacking = false;
	// 鼠标还是按着的状态,那么就继续攻击
	if (bClicking && EquiqedWeapon) { 
		AttackBegin();
	}
}
  • 鼠标按下,开始调用攻击函数
void ARole::OnClickBegin()
{
	bClicking = true;
	if (!bAttacking && EquiqedWeapon) {
		AttackBegin();
	}
}
  • 鼠标松开
void ARole::OnClickEnd()
{
	bClicking = false;
}
  • SetupPlayerInputComponent 绑定按键

按下就调用按下函数,松开就调用松开函数。

// 攻击动作
PlayerInputComponent->BindAction("Click", IE_Pressed, this, &ARole::OnClickBegin);
PlayerInputComponent->BindAction("Click", IE_Released, this, &ARole::OnClickEnd);

首尾工作

在动画蓝图中将我们的结束通知与结束函数联系起来。

整体思路就是:鼠标按下 - OnClickBegin - AttackBegin - 播放动画 - 动画结束通知 - AttackEnd - ……(连续攻击)- 鼠标松开 - OnClickEnd - 结束。

以上是关于UE4 C++实现人物攻击的主要内容,如果未能解决你的问题,请参考以下文章

UE4 C++第三人称人物创建的基本代码(上)

UE4 C++第三人称人物创建的基本代码(下)

UE4 C++ 实现敌人追逐与攻击

UE4 C++实现近战攻击,精准检测与碰撞检测

UE4 C++实现发出伤害与接收伤害

AdvancedLocomotionSystemV第二篇 C++ 实现镜头跟随人物缓慢移动