天天看點

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