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

新建第三人称蓝图模板

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

修改角色模板内容。

将新建一个Actor变量,公开,后期角色对这个Actor进行快速穿梭动作。删除CameraBoom和FollowCamera。

UE5 网络摄像头opencv ue4摄像头跟随_调用函数


删减蓝图,只留下必要的节点。

UE5 网络摄像头opencv ue4摄像头跟随_UE5 网络摄像头opencv_02

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

UE5 网络摄像头opencv ue4摄像头跟随_c++_03


添加一个函数

//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,打开。

UE5 网络摄像头opencv ue4摄像头跟随_游戏开发_04


添加两个SpringArm和一个camera,父子关系如图所示。

UE5 网络摄像头opencv ue4摄像头跟随_UE5 网络摄像头opencv_05


在相机碰撞关掉碰撞检测

UE5 网络摄像头opencv ue4摄像头跟随_UE5 网络摄像头opencv_06


两个相机臂是因为避免碰上角色网体碰撞。也可以通过自定义碰撞通道。但是比较麻烦,这里就从简了。

新建Character变量,公开

UE5 网络摄像头opencv ue4摄像头跟随_游戏开发_07


在Tick中调用函数(可能会找不到,需要重启一下编辑器)

UE5 网络摄像头opencv ue4摄像头跟随_游戏开发_08


回到角色蓝图,添加Beginplay事件,添加函数SetViewTargetWithBlend

UE5 网络摄像头opencv ue4摄像头跟随_重启_09

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

敌人Actor(无功能)

UE5 网络摄像头opencv ue4摄像头跟随_重启_10


来一点点特效(白嫖自虚幻商城)

UE5 网络摄像头opencv ue4摄像头跟随_c++_11


动画修饰一下

UE5 网络摄像头opencv ue4摄像头跟随_c++_12


将所有蓝图拖入关卡,设置角色变量

UE5 网络摄像头opencv ue4摄像头跟随_重启_13


感受不同

UE5 网络摄像头opencv ue4摄像头跟随_c++_14


UE5 网络摄像头opencv ue4摄像头跟随_调用函数_15