本教程采用图文教程+视频教程的多元化形式,我会为不同的知识点选择适当的表达方式。教程内容将同步免费发布于开发游戏的老王(知乎|CSDN)的专栏《玩转UE4/UE5动画系统》。教程中使用的资源及工程将以开源项目的形式更新到GitHub:玩转UE4上。
工程文件: 玩转UE4(GitHub)
演示视频:使用GAS和Control Rig实现的受击响应
- 0. 效果演示
- 1. 先导说明
- 2. 原理
- 3. Control Rig端
- 4. GAS端
- 4.1 攻击方技能:GA_Attack
- 4.2 受击方技能:GA_OnHit
- 5. 动画蓝图
- 6. 小结
本文使用了Unreal官方插件:Gameplay Ability System(GAS),对GAS不了解的同学可以先阅读老王的以下教程:
- 《[玩转UE4/UE5动画系统>技能系统(GAS)篇] 一 概要:什么是技能系统(GAS)》
- 《[玩转UE4/UE5动画系统>技能系统(GAS)篇] 二 技能 Gameplay Ability(GA)》
- 《[玩转UE4/UE5动画系统>技能系统(GAS)篇] 三 影响 Gameplay Effect(GE)》
在教程《[玩转UE4/UE5动画系统>技能系统(GAS)篇] 三 影响 Gameplay Effect(GE)》中,我们直接用一个蒙太奇动画实现了受击响应,但这样做有一个问题就是当角色受攻击方向不在正面时,这个蒙太奇动画是无法正确体现受击效果的。比较常规的解决办法是使用Additive动画来实现角色不同方向的倾斜,该方法的最大缺点就是需要准备额外的Additive Pose资源,不够灵活。所以本文尝试使用Control Rig来实现这个功能。
实现原理是非常简单的,在攻击技能中先获得攻击点的法线方向,也就是攻击方向并传递给受击方,在受击技能中开启Control Rig并通过其中的绑定将角色摆出适当的受击姿势就可以了。
分别在头部(head)\大腿(calf)位置添加控制器
定义两个变量:
- Direction:攻击方向。
- HitScale:调整晃动幅度。
ForwardSolve:
- 使用头部(head)\大腿(calf)的动画位置作为对应控制器的初始位置。
- 使用Direction和HitScale对head_ctrl对实施偏移。
- 使用FullbodyIK调整身体弯曲。
GA_Attack的逻辑在前面提到的GAS教程中已经介绍,本文就不再赘述了。这里主要的变化是将攻击方向PunchDirection传递给受击方的动画蓝图。
TraceForTarget
#pragma once
#include "CoreMinimal.h"
#include "RPGCharacterBase.h"
#include "Kismet/GameplayStatics.h"
#include "TraceFunctions.generated.h"
UCLASS()
class UTraceFunctions : public UBlueprintFunctionLibrary
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable, Category = "Trace Functions")
static void TraceForTarget(const AActor* Actor,const FVector Start,const float Distance,const EDrawDebugTrace::Type DrawDebugTrace,bool& Detected,ARPGCharacterBase*& Target,FHitResult& Result);
};
#include "Library/TraceFunctions.h"
#include "Kismet/KismetMathLibrary.h"
#include "Kismet/KismetSystemLibrary.h"
void UTraceFunctions::TraceForTarget(const AActor* Actor,const FVector Start,const float Distance,const EDrawDebugTrace::Type DrawDebugTraceType,bool& Detected,ARPGCharacterBase*& Target,FHitResult& Result)
{
Detected = false;
if(Actor != nullptr)
{
const FVector Forward = Actor->GetActorForwardVector();
const FVector End = Start + Forward*Distance;
const FRotator Orientation = UKismetMathLibrary::MakeRotFromX(Forward);
TArray ObjectTypes;
ObjectTypes.Add(static_cast(ECollisionChannel::ECC_Pawn));
const TArray ActorsToIgnore;
UKismetSystemLibrary::BoxTraceSingleForObjects(Actor,Start,End,FVector(0.0,50.0,10.0),Orientation,ObjectTypes,false,ActorsToIgnore,DrawDebugTraceType,Result,true);
Target = Cast(Result.GetActor());
Detected = Result.bBlockingHit&&Target!=nullptr;
}
}
4.2 受击方技能:GA_OnHit
Delay的时间决定了Control Rig的开启时间,Fullbody IK运算量较大,这样Fullbody IK仅在Control Rig开启的时间内有效。
在动画蓝图中将PunchiDirection传递给Control Rig。
通过Control Rig的Blend Out控制角色由受攻击的姿态回归到正常姿态。
Control Rig的优点一如既往:更加灵活,更加动态,思路更加统一;缺点就是Fullbody IK的运算量较大(我们在实现过程中对它进行了一定的控制),在具体项目中需酌情使用。