前言
在刚开始学习UE4时,经常被PlayerStart困惑住。这个东西是什么?有什么用?下面我们就通过源码分析来揭示它的使用过程。
背景知识
- 关于UWorld/APlayerController等游戏框架知识,请参考大钊老师的 UE4 inside系列文章[1]
- 关于相机系统部分,请参考Jerish老师的文章 [2]
使用过程
在UE源码模式下,点击 play按钮后,进入调试后,PlayerStart使用大致分成三个阶段:
- 在AGameModeBase::InitNewPlayer()将PlayerStart位置和旋转信息拷贝给APlayerController
图1
1.1 查找合适的PlayerStart对象
在图1中 731行AActor* const StartSpot = FindPlayerStart(NewPlayerController, Portal) 通过这个FindPlayerStart函数去寻找到Level场景中存在PlayerStart对象。
FindPlayerStart() 函数实现如下:
图2
在FindPlayerStart()中接着再调用ChoosePlayerStart()函数继续查找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对象
图4
在图4中在APlayerController ::SpawnSpectatorPawn()生成Pawn对象时,将APlayerController中的Location和Rotation信息,传递给Pawn对象,对应调用栈如图5所示。
图5
3. 将Pawn中的Location和Rotation用于计算ViewTarget中 POV信息
图5在图5中,通过调用APlayerCameraManger::UpdateViewTarget()来使用Pawn的Location和Rotation信息,从而更新场景中的POV(Point Of View)信息,也就是摄影机参数信息。
在图5中,进一步调用APlayerCameraManager::UpdateViewTargetInteral()
图6
在图6中,进一步调用AActor ::CalcCamera()
图7
在图7中,接着调用APawn ::GetActorEyesViewPoint()和APawn::GetPawnViewLocation 获取到Pawn的Location(pawn位置+BaseEyeHeight)和View信息。
调用堆栈如下图所示:
参考文献
[1] 大钊. https://zhuanlan.zhihu.com/p/22813908
[2] Jerish. https://blog.csdn.net/u012999985/article/details/68947410