游戏中观察角色的摄影机可以拉近和拉远是一个比较常见的需求,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;
UFUNCTION(BlueprintCallable, Category= Camera) void ZoomIn(); UFUNCTION(BlueprintCallable, Category = Camera) void ZoomOut();
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方法实现很简单,就不解释了。
项目源代码:http://git.oschina.net/cloudsource/UE4-Code/tree/master/sqxgame