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