在上一篇我們討論了如何在editor上建立CameraActor,並在C++中找到該actor的instance。這篇將會反過來討論怎麼樣在C++上進行客制化,並將調整完的CameraActor加入到world中。首先我們先建立我們自己的C++類別並繼承自CameraActor:
記得要選Show All Classes,不然會找不到。
在建完我們的MainCameraActor之後,我們必須對裡面的CameraComponent進行設定。
AMainCameraActor::AMainCameraActor(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { GetCameraComponent()->ProjectionMode = ECameraProjectionMode::Orthographic; GetCameraComponent()->OrthoWidth = 2048.0f; }
跟上一篇不同的是,這裡我們將ProjectionMode調整成Orthographic,並將寬度設為2048。調完之後,我們就可以直接把C++ class拉進我們的editor中,並命名為MainCamera:
從上圖中可以看到在我們的MainCamera的instance底下有一個CameraComponent。上面程式碼中的GetCameraComponent()取到的就是這個物件。在引擎中通常會把Actor中可以隨時抽換組合的功能寫成一個Component,可以很方便我們進行功能的復用及重組。在我們的CameraActor中,預設有一個CameraComponent,主要用來描述我們CameraActor的viewpoint以及各種cmera相關的設定,例:projection type、field of view……。Actor本身並不會有transform相關資訊( location、rotation,、scale),這些資訊是保存在RootComponent中。以下是ACameraActor的建構子內容:
ACameraActor::ACameraActor(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { // Setup camera defaults CameraComponent = CreateDefaultSubobject<UCameraComponent>(TEXT("CameraComponent")); CameraComponent->FieldOfView = 90.0f; CameraComponent->bConstrainAspectRatio = true; CameraComponent->AspectRatio = 1.777778f; CameraComponent->PostProcessBlendWeight = 1.0f; // Make the camera component the root component RootComponent = CameraComponent; // Initialize deprecated properties (needed for backwards compatibility due to delta serialization) FOVAngle_DEPRECATED = 90.0f; bConstrainAspectRatio_DEPRECATED = true; AspectRatio_DEPRECATED = 1.777778f; PostProcessBlendWeight_DEPRECATED = 1.0f; // End of deprecated property initialization PrimaryActorTick.bCanEverTick = true; }
從上面的code我們可以看到引擎預設建立了一個CameraComponent,並將這個Component設為RootComponent。另外後面有幾個xxxx_DEPRECATED的參數,其實也都是移進到Component中了。
Leave a Reply