Unreal Engine 4 C++ 为角色创建一个可以Zoom的摄影机(源代码)

游戏中观察角色的摄影机可以拉近和拉远是一个比较常见的需求,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

发布了69 篇原创文章 · 获赞 32 · 访问量 22万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章