遊戲中觀察角色的攝影機可以拉近和拉遠是一個比較常見的需求,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