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++实现人物攻击的主要内容,如果未能解决你的问题,请参考以下文章