程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Unreal Engine 4 C++ 為角色創建一個可以Zoom的攝影機(源代碼)

Unreal Engine 4 C++ 為角色創建一個可以Zoom的攝影機(源代碼)

編輯:C++入門知識

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved