如何设置一个RTS风格的摄像机

-
创建一个空工程,如图:

-
因为是创建的代码工程,所以创建成功后会直接打开
vs2013,工程打开后,把编译配置改成DebugGame Editor,这是为了可以在编辑器中调试代码,然后先编译一下工程,如图:
-
编译成功后,
Ctrl + F5运行编辑器,然后选择File->Add Code to Project...,在弹出的对话框中勾选Show All Classes,然后选择父类为SpectatorPawn,再点击Next按钮,在下一步中选择类名和位置,然后选择CreateClass按钮,创建完成后在VS中重载工程,这样添加一个新类就完成了,如图:


-
UE4中,摄像机是绑定在角色身上的(FPS引擎),SpectatorPawn顾名思义就是一个旁观者角色,这个角色就是RTS游戏中开了上帝视角的一个角色,因此还需要创建一个摄像机组件,绑定到这个SpectatorPawn身上 -
再次走一遍添加代码的流程,只不过父类换成了
CameraComponent,创建完成后再重载一下VS工程,然后关掉编辑器,回到VS中编辑代码 -
在
RTSCameraComponent.h中重载一个获取摄像机视图的函数,如下代码:UCLASS() class RTSCAMERA_API URTSCameraComponent : public UCameraComponent { GENERATED_UCLASS_BODY() /** 重载获取摄像机视图函数 */ virtual void GetCameraView(float delta_time, FMinimalViewInfo& view); private: /** 返回拥有这个摄像机组件的游戏物体对象(pawn) */ APawn* getOwnerPawn(); /** 返回这个摄像机组件的拥有者的PlayerController */ APlayerController* getPlayerController(); } -
在
RTSCameraComponent.cpp中添加3个函数的实现代码,如下:void URTSCameraComponent::getOwnerPawn() { return Cast<APawn>(GetOwner()); } void URTSCameraComponent::getPlayerController() { APlayerController* controller = nullptr; APawn* owner = getOwnerPawn(); if (owner) { controller = Cast<APlayerController>(owner->GetController()); } } void URTSCameraComponent::GetCameraView(float delta_time, FMinimalViewInfo& view) { FRotator fixed_camera_angle; fixed_camera_angle.Yaw = -45.f; fixed_camera_angle.Pitch = -45.f; fixed_camera_angle.Roll = 0.f; APlayerController* controller = getPlayerController(); if (controller) { view.FOV = 30.f; view.Location = controller->GetFocalLocation() - fixed_camera_angle.Vector() * 8000; view.Rotation = fixed_camera_angle; } } -
在
RTSCameraSpectatorPawn.h中,创建一个自定义的摄像机组件,如下:UCLASS() class RTSCAMERA_API ARTSCameraSpectatorPawn : public ASpectatorPawn { GENERATE_UCLASS_BODY() //摄像机组件 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = CameraActor) TSubobjectPtr<class URTSCameraComponent> m_main_camera; } -
在
RTSCameraSpectatorPawn.cpp中,实现构造函数,如下:#include "RTSCameraComponent.h" ARTSCameraSpectatorPawn::ARTSCameraSpectatorPawn(const class FPostConstructInitializeProperties& PCIP) : Super(PCIP) { CollisionComponent->SetCollisionProfileName(UCollisionProfile::NoCollision_ProfileName); bAddDefaultMovementBindings = false; m_main_camera = PCIP.CreateDefaultSubobject<URTSCameraComponent>(this, TEXT("MainCameraComponent")); } -
然后打开
RTSCameraGameMode.cpp在构造函数中注册使用新创建的SpectatorPawn类,如下:#include "Pawn/RTSCameraSpectatorPawn.h" ARTSCameraGameMode::ARTSCameraGameMode(const class FPostConstructInitializeProperties& PCIP) : Super(PCIP) { SpectatorClass = ARTSCameraSpectatorPawn::StaticClass(); DefaultPawnClass = ARTSCameraSpectatorPawn::StaticClass(); } -
编译工程,
Ctrl + F5运行编辑器,打开WorldSettins,将GameMode改成RTSCameraGameMode,然后点击Play按钮,这时视角就变成45度俯视的RTS视角了,如图:



- 运行结果:





