UE4 平滑跟踪式像机C++实现 4.24.2

普通的摄像机绑定Character的做法虽然简单高效,但是有一个弊端,就是当角色使用某个技能在某些位置快速穿梭时,角色动作的潇洒被快速移动带来的眼花缭乱抵消的一干二净,因此需要一种方式平滑跟踪而不是瞬移。于是我就用C++实现了一个。

新建第三人称蓝图模板

老规矩,基操。后面再转C++。

修改角色模板内容。

将新建一个Actor变量,公开,后期角色对这个Actor进行快速穿梭动作。删除CameraBoom和FollowCamera。
UE4 平滑跟踪式像机C++实现 4.24.2_第1张图片
删减蓝图,只留下必要的节点。UE4 平滑跟踪式像机C++实现 4.24.2_第2张图片

新建一个C++类继承自APawn

UE4 平滑跟踪式像机C++实现 4.24.2_第3张图片
添加一个函数

//////////////////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,打开。
UE4 平滑跟踪式像机C++实现 4.24.2_第4张图片
添加两个SpringArm和一个camera,父子关系如图所示。
UE4 平滑跟踪式像机C++实现 4.24.2_第5张图片
在相机碰撞关掉碰撞检测UE4 平滑跟踪式像机C++实现 4.24.2_第6张图片
两个相机臂是因为避免碰上角色网体碰撞。也可以通过自定义碰撞通道。但是比较麻烦,这里就从简了。
新建Character变量,公开
在这里插入图片描述
在Tick中调用函数(可能会找不到,需要重启一下编辑器)
UE4 平滑跟踪式像机C++实现 4.24.2_第7张图片
回到角色蓝图,添加Beginplay事件,添加函数SetViewTargetWithBlend
UE4 平滑跟踪式像机C++实现 4.24.2_第8张图片

这时功能已经完成了,再加点东西测试一下。

敌人Actor(无功能)
在这里插入图片描述
来一点点特效(白嫖自虚幻商城)

UE4 平滑跟踪式像机C++实现 4.24.2_第9张图片
动画修饰一下
UE4 平滑跟踪式像机C++实现 4.24.2_第10张图片
将所有蓝图拖入关卡,设置角色变量
在这里插入图片描述
感受不同

你可能感兴趣的:(UE4,学习)