Component Nedir?
Blueprint editörde sol tarafta aktörümüze eklediğimiz, staticmesh, collider vb unsurlara component diyoruz. Her aktörün en azından bir tane componenenti olur (default scene root).
- ActorComponent : Component’lerin base class’ı yani tüm diğer component sınıfları bu sınıftan türetirmiştir. Herhangi bir transforma sahip değildir.
- SceneComponent : Transforma sahip olan şeyler için kullanılır. Sttaic mesh skeletal mesh vb şeyleri aratıp hangi componentin hangi grupta olduğunu inceleyebilirsiniz.


Var olan componentler dışında kendi componentlerimizi de üretebiliriz.
Component Nasıl Eklenir
Hali hazırda blueprint editörün sol panelinde Add butonu ile ekleyebiliriz. Fakat biz burada C++ ile nasıl ekleyebileceğimizi göreceğiz.
//.h
class UCapsuleComponent; //Forward declarations
class TFOX_API AItem : public AActor{
GENERATED_BODY()
//...
protected:
UPROPERTY(EditAnywhere);
UStaticMeshComponent* itemMesh;
UPROPERTY(EditAnywhere)
UCapsuleComponent* capsuleComp;
//...
};C++- Hangi komponentleri ekleyeceksek o türün pointerını sınıfımıza ekliyoruz. Eğer tür tanımlı değilse:
- #include ile o türün tanımlı olduğu dosyayı ekleyebiliriz
- Forward declaration yapabiliriz.
- Ayrıca UPROPERTY() ekleyerek blueprint’e expose ediyoruz
//.cpp
#include "Item.h"
#include "Components/StaticMeshComponent.h"
#include "Components/CapsuleComponent.h"
// Sets default values
AItem::AItem(){
PrimaryActorTick.bCanEverTick = true;
capsuleComp = CreateDefaultSubobject<UCapsuleComponent>(TEXT("Capsule Component"));
RootComponent = capsuleComp;
//SetRootComponent(capsuleComp); // yukarıdaki ile aynı işi yapar
//GetRootComponent(); // bu aktörünü root componentini döner
itemMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Item Mesh"));
itemMesh->SetupAttachment(RootComponent);
}C++- CreateDefaultSubobject template fonksiyonu ile istediğimiz türde bir obje oluşturup pointera atamasını yapıyoruz.
- TEXT makrosu ile objenin blueprintte görünen ismini yazıyoruz.
- RootComponent bir pointer olduğu için yeni oluşturduğumuz objeyi = operatörü ile root component yapabiliriz
- SetRootComponent() fonksiyonu’da aynı işlevi görür
- itemMesh->SetupAttachment(RootComponent) : itemMesh nesnesini, root componente bağlar. root parent olurken, itmemesh child olur.
Class Forward Declaration
Bu Unreal’dan bağımsız olarak C++’a ait olan bir kavram. Compilation yapılmadan önce .h dosyaları .cpp dosyalarına yazılıyor. Biz her şeyi .h dosyasına #include ettiğimizde bu sefer bu sınıftan türetilen diğer sınıflara da bu #include yükü geçiyor. Yani bir çığ gibi tepeden aşağı büyüyerek geliyor.
Bunu önlemek için de forward declaration yaparak aslında bu isimde bir sınıfımızın olduğunu compiler’a belirtiyoruz. Elbette bunun belli başlı sınırlamaları var. Bizler pointer için kullanıdık fakat normal bir değişken olarak kullanamazdık çünkü compiler bu nesnenin boyutunu bilmiyor. Doğal olarak sınıfın bellekte nasıl bir layout oluşturacağını da bilemez. O zaman da sınıfı üretemez.

Leave a Reply