游戏中观察角色的摄影机可以拉近和拉远是一个比较常见的需求,UE4中实现起来也比较简单。这篇文章以TopDown模板为例,讲解如何一步步实现可以Zoom的摄影机。
创建好TopDown模板的C++项目之后,我们会得到3个重要的类。AXXXCharacter类,实现角色的控制和行为。AXXXGameMode类,项目的默认GameMode,定义默认的角色控制器和默认Pawn。AXXXPlayerController,角色控制器类,接受输入控制,并指导角色进行行动。我们主要修改AXXXCharacter类。
说下Zoom实现的原理,UE4专门为摄影机碰撞实现了一个USpringArmComponent类,它能自动处理和摄影机相关的碰撞、缩进等等功能。为了实现Zoom,只需要适当的调节此类的TargetArmLength变量的值即可。很简单。
首先,我们定义Zoom配置参数。在XXXCharacter.h文件中加入下列结构体:
USTRUCT()
struct FZoomData
{
GENERATED_USTRUCT_BODY()
UPROPERTY(EditDefaultsOnly, Category = Config)
float MinCameraLen;
UPROPERTY(EditDefaultsOnly, Category = Config)
float MaxCameraLen;
UPROPERTY(EditDefaultsOnly, Category = Config)
float ZoomStepLen;
};
MinCameraLen,定义摄影机最近距离;MaxCameraLen,定义摄影机最远距离;ZoomStepLen,定义每一小步,Zoom的距离。注意USRUCT()前缀,这个结构体后面在编辑器中可以自己配置。
第二步,为AXXXCharacter类添加配置参数。
UPROPERTY(EditDefaultsOnly, Category = Config)
FZoomData ZoomConfig;
第三步,为AXXXCharacter添加成员ZoomIn和ZoomOut方法。这两个方法,具体实现Zoom功能。
UFUNCTION(BlueprintCallable, Category= Camera)
void ZoomIn();
UFUNCTION(BlueprintCallable, Category = Camera)
void ZoomOut();
第四步,为AXXXCharacter添加重载方法SetupPlayerInputComponent。此方法初始化输入绑定。
protected:
virtual void SetupPlayerInputComponent(class UInputComponent* InputComponent) override;
void AsqxgameCharacter::SetupPlayerInputComponent(class UInputComponent* InputComponent)
{
check(InputComponent);
InputComponent->BindAction("ZoomIn", IE_Pressed, this, &AsqxgameCharacter::ZoomIn);
InputComponent->BindAction("ZoomOut", IE_Pressed, this, &AsqxgameCharacter::ZoomOut);
}
SetupPlayerInputComponent方法,绑定了两个名为ZoomIn和ZoomOut的动作,这两个动作在编辑器中设置。在菜单Edit->Project Settings->Input项目下。
我将两个动作分别绑定到了Mouse Wheel Up和Mouse Wheel Down两个按键上。
void AsqxgameCharacter::ZoomIn()
{
if (CameraBoom->TargetArmLength >= ZoomConfig.MinCameraLen)
{
CameraBoom->TargetArmLength -= ZoomConfig.ZoomStepLen;
}
else
{
CameraBoom->TargetArmLength = ZoomConfig.MinCameraLen;
}
}
void AsqxgameCharacter::ZoomOut()
{
if (CameraBoom->TargetArmLength <= ZoomConfig.MaxCameraLen)
{
CameraBoom->TargetArmLength += ZoomConfig.ZoomStepLen;
}
else
{
CameraBoom->TargetArmLength = ZoomConfig.MaxCameraLen;
}
}
ZoomIn和ZoomOut方法实现很简单,就不解释了。编译代码,并在Character蓝图中设置好ZoomConfig的值,执行游戏,就能看到结果了。
项目源代码:http://git.oschina.net/cloudsource/UE4-Code/tree/master/sqxgame