在上一篇我們討論了如何在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