普通的摄像机绑定Character的做法虽然简单高效,但是有一个弊端,就是当角色使用某个技能在某些位置快速穿梭时,角色动作的潇洒被快速移动带来的眼花缭乱抵消的一干二净,因此需要一种方式平滑跟踪而不是瞬移。于是我就用C++实现了一个。
新建第三人称蓝图模板
老规矩,基操。后面再转C++。
修改角色模板内容。
将新建一个Actor变量,公开,后期角色对这个Actor进行快速穿梭动作。删除CameraBoom和FollowCamera。
删减蓝图,只留下必要的节点。
新建一个C++类继承自APawn
添加一个函数
//Camrea_CPP.h
UFUNCTION(BlueprintCallable)
void CameraFollow(AActor* FollowTarget, float Speed, float MaxDistance);
//Camrea_CPP.cpp
#include "Kismet/KismetMathLibrary.h"
void ACamera_CPP::CameraFollow(AActor* Tar, float Speed, float MaxDistance)
{
FVector TarLoc = Tar->GetActorLocation();
FVector SelfLoc = GetActorLocation();
float Dis = FVector::Distance(TarLoc, SelfLoc);//获取相机与目标间的距离
if (Dis < 10)//距离小于一定值时,不需要继续跟踪
return;
float MoveSpeed = UKismetMathLibrary::Lerp(0, Speed, (Dis - 10.0f) / MaxDistance);
//以当前距离与最大距离的商为Lerp函数的Alpha值,距离越远,速度越快。
AddActorWorldOffset(UKismetMathLibrary::GetForwardVector(
UKismetMathLibrary::FindLookAtRotation(SelfLoc, TarLoc)) * MoveSpeed);
//获取目标相对于相机的方向(长度为1),乘以预定的移动速度,每帧向目标偏移
}
编译,新建蓝图,继承自我们自己写的CPP,打开。
添加两个SpringArm和一个camera,父子关系如图所示。
在相机碰撞关掉碰撞检测
两个相机臂是因为避免碰上角色网体碰撞。也可以通过自定义碰撞通道。但是比较麻烦,这里就从简了。
新建Character变量,公开
在Tick中调用函数(可能会找不到,需要重启一下编辑器)
回到角色蓝图,添加Beginplay事件,添加函数SetViewTargetWithBlend
这时功能已经完成了,再加点东西测试一下。
敌人Actor(无功能)
来一点点特效(白嫖自虚幻商城)
动画修饰一下
将所有蓝图拖入关卡,设置角色变量
感受不同