前言

在刚开始学习UE4时,经常被PlayerStart困惑住。这个东西是什么?有什么用?下面我们就通过源码分析来揭示它的使用过程。

背景知识

  • 关于UWorld/APlayerController等游戏框架知识,请参考大钊老师的 UE4 inside系列文章[1]
  • 关于相机系统部分,请参考Jerish老师的文章 [2]

使用过程

在UE源码模式下,点击 play按钮后,进入调试后,PlayerStart使用大致分成三个阶段:

  1. 在AGameModeBase::InitNewPlayer()将PlayerStart位置和旋转信息拷贝给APlayerController

ue4相机_UE4.24源码分析 – PlayerStart-编程知识网

图1

1.1 查找合适的PlayerStart对象

图1中 731行AActor* const StartSpot = FindPlayerStart(NewPlayerController, Portal) 通过这个FindPlayerStart函数去寻找到Level场景中存在PlayerStart对象。

FindPlayerStart() 函数实现如下:

ue4相机_UE4.24源码分析 – PlayerStart-编程知识网

图2

在FindPlayerStart()中接着再调用ChoosePlayerStart()函数继续查找PlayerStart对象,

ue4相机_UE4.24源码分析 – PlayerStart-编程知识网

图3

在ChoosePlayerStart实现函数中,通过遍历UWorld中的Actor对象拿到PlayerStart对象的。拿到对象后,直接获取PlayerStart对象的位置和旋转信息(见图3中1051-1052行),然后返回找到的PlayerStart对象的。

1.2 将PlayerStart的Location和Rotation信息赋值给刚生成PlayerController对象

见图1中735-737行代码

2. 将APlayerController中的Location和Rotation信息拷贝给场景中Pawn对象

ue4相机_UE4.24源码分析 – PlayerStart-编程知识网

图4

图4中在APlayerController ::SpawnSpectatorPawn()生成Pawn对象时,将APlayerController中的Location和Rotation信息,传递给Pawn对象,对应调用栈如图5所示。

ue4相机_UE4.24源码分析 – PlayerStart-编程知识网

图5

3. 将Pawn中的Location和Rotation用于计算ViewTarget中 POV信息

ue4相机_UE4.24源码分析 – PlayerStart-编程知识网

图5图5中,通过调用APlayerCameraManger::UpdateViewTarget()来使用Pawn的Location和Rotation信息,从而更新场景中的POV(Point Of View)信息,也就是摄影机参数信息。

图5中,进一步调用APlayerCameraManager::UpdateViewTargetInteral()

ue4相机_UE4.24源码分析 – PlayerStart-编程知识网

图6

图6中,进一步调用AActor ::CalcCamera()

ue4相机_UE4.24源码分析 – PlayerStart-编程知识网

图7

图7中,接着调用APawn ::GetActorEyesViewPoint()和APawn::GetPawnViewLocation 获取到Pawn的Location(pawn位置+BaseEyeHeight)和View信息。

ue4相机_UE4.24源码分析 – PlayerStart-编程知识网

ue4相机_UE4.24源码分析 – PlayerStart-编程知识网

调用堆栈如下图所示:

ue4相机_UE4.24源码分析 – PlayerStart-编程知识网

参考文献

[1] 大钊. https://zhuanlan.zhihu.com/p/22813908

[2] Jerish. https://blog.csdn.net/u012999985/article/details/68947410