8 Mayıs 2017 Pazartesi

İlk Minik Uygulama

Selamlar Herkese,

Allah sizi inandırsın bugün küçücük de olsa gerçek bir C++ uygulaması yapacak ve ekranda oynar vaziyette çıktısını göreceğiz. Resmi dökümantasyondaki QuickStart örneğini biraz da kendi bilgim ile zenginleştirerek bu mini uygulamayı elde ettim. Umarım beğenirsiniz;

e hadi başlayalım  :)


1-Adım:

yeni proje oluştururken  C++  tabına geçin. Basic Code template ini seçin.  "with starter content" seçeneği aktif olsun; çünkü örneğimizde starter content e ihtiyaç duyacağız; sonra proje adını girin ve Create Protect deyin !
CreateProject.png

adından unreal editör yeni projemizi oluşturacak ve C++  templeti seçtiğmiz için otomatik olarak Visual studio açılacak ve yarattığımız projenin solution u yüklenecektir. (Bu başta biraz zaman alabiliyor.)


2 - Adım: 
burada projemize yeni bir C++ sınıfı ekleyeceğiz:
file menüsü içinde  New C++ Class  komutu ile yeni sınıf yaratmaya başlayabiliriz:



Yeni C++ class dediğimiz anda bizden bu sınıfın tipini seçmemiz isteyen  "Choose Parent Class" penceresi açılacaktır:



burada Unreal Engine in oyun için temel class ları listeleniyor; şayet istersek burada tüm class ları listeleyerek ilk başta görünmeyen sınıflardan birini de seçebiliriz; elbette yine bizim daha önce yaratmış olduğumuz bir sınıf da olabilir bu sınıf.   

Şimdilik Unreal Engine level içindeki en temel class tipi olna Actor sınıfını kullanacağız. 
Actor sınıfını seçtikten sonra yeni actor yartma penceresi gelecek, ismine FloatingActor diyelim;
aşağı yukarı sürekli bir döngüde salınım yapan bir obje yaratacağımızdan adına FloatingActor dedik.ve ardından  "Create Class" buttonuna basalım.



tam bu noktada bilgisayarımıza yüklü olan Visual Studio açılır; ve içinde yeni bir C++ sınıfı hazır bir biçimde yaratılır ve solution a eklenir; adı da bizim yukarıda vermiş olduğumuz FloatingActor.cpp dir.


3 - Adım:  
şimdi biraz C++ kodlaması yapmaya başlayabiliriz; Visual Studio nun  Solution Exploere panelinden yeni eklediğimiz class dosyalarını bulalım; örneğimizde bunlar malum FloatingActor.cpp  ve  FloatingActor.h  dosyalarıdır.



Şimdi bir değişken bir de fonksyon eklemesi yapacağız. Ekleyeceğimiz değişken Actor ün ömrü boyunca geçirdiği süreyi tutacak;

bunun için önce FloatingActor.h içine en sona float RunningTime; kodunu ekleyelim; bu değişkenin değerini her bir zaman birimi adımında sürekli artıracağız; böylece her hangi bir zamanda Actor ün ne kadar yaşamış olduğunu ölçebileceğiz. Bu sürekli artımı da malumunuz Actor ün Tick fonksyonu içinde yapacağız. Bu fonksyon aksi belirtilmemişse sürekli ard arda çağrılır; ve her çağrılmada geçen "birim zamanı" parametre alarak alır, böylece her bir mini zaman adımında (Tick) yapılmasını istediklerimizi kodlayabilme imkanı bize verir. Böylece oyun içindeki her objenin canlı akışını sağlayabiliyoruz; dolayısı ile bu AFloatingActor::Tick  fonksyonunu da FloatingActor.cpp  dosyasında yine en sona ekleyelim, ve içine aşağıdaki kodları yazalım:
FVector NewLocation = GetActorLocation();
float DeltaHeight = (FMath::Sin(RunningTime + DeltaTime) - FMath::Sin(RunningTime));
NewLocation.Z += DeltaHeight * 20.0f;       //Scale our height by a factor of 20
RunningTime += DeltaTime;
SetActorLocation(NewLocation);

yukarıdaki kod FloatingActor ün yumuşak bir şekilde yukarı aşağı salınımını sağlayacaktır; yarattığımız RunningTime değişkeninin kullanımı hareketlerimizi belli bir zamanda takip edebilmek içindir. 

Şimdi derleme aşamasına geçelim, Solution üzerindeki projemiz üzerine  (tüm solution a değil) sağ tıklayıp Build diyelim. 



veya Unreal Editör içindeki Compile buttonuna tıklayalım:



Derleme işlemi succsess ise Editör yeni ve son hali ile otomatik olarak yüklenecektir.



Kodun tamamı aşağıdadır:

FloatingActor.h
// Copyright 1998-2017 Epic Games, Inc. All Rights Reserved.

#pragma once

#include "GameFramework/Actor.h"
#include "FloatingActor.generated.h"

UCLASS()
class QUICKSTART_API AFloatingActor : public AActor
{
    GENERATED_BODY()

public: 
    // Sets default values for this actor's properties
    AFloatingActor();

protected:
    // Called when the game starts or when spawned
    virtual void BeginPlay() override;

public:
    // Called every frame
    virtual void Tick( float DeltaSeconds ) override;

    float RunningTime;
};

FloatingActor.cpp
// Copyright 1998-2017 Epic Games, Inc. All Rights Reserved.

#include "QuickStart.h"
#include "FloatingActor.h"

// Sets default values
AFloatingActor::AFloatingActor()
{
    // Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
    PrimaryActorTick.bCanEverTick = true;

}

// Called when the game starts or when spawned
void AFloatingActor::BeginPlay()
{
    Super::BeginPlay();

}

// Called every frame
void AFloatingActor::Tick( float DeltaTime )
{
    Super::Tick( DeltaTime );

    FVector NewLocation = GetActorLocation();
    float DeltaHeight = (FMath::Sin(RunningTime + DeltaTime) - FMath::Sin(RunningTime));
    NewLocation.Z += DeltaHeight * 20.0f;       //Scale our height by a factor of 20
    RunningTime += DeltaTime;
    SetActorLocation(NewLocation);
}

4 - Adım:
şimdi Unreal Editör içinde Content Browser penceresini açtığınızda  "C++ Classess" isimli folder in içinde bizim ürettiğimiz proje ile aynı isimde bir folder daha göreceksiniz, biz buna başta  "QuickStart" demiş idik, folder ismi de dolayısı ile bu olacaktır;  onun da içine girdiğimizde az önce yarattığımız class olan FloatingActor ümüzü ikon olarak görebiliyoruz:



artık FloatingActor ümüzü level içine doğrudan sürükleyip bırakabiliriz; hatırlayın Actor ler level içine konumlandırılabilir idi; bunu yaptığımızda da artık editör içindeki World Outliner penceresinde de görünür ve seçili durumdadır; ve ismi de muhtemelen: "FloatingActor1" dir; ve seçili iken ona ait diğer component ler ve diğer özellikler Details Panel içinde görülebilir durumdadır:



burada şunu da eklemek istiyorum; dikkat ettiniz mi derleme sonrası Content Browser içinde görünmeye başlayan yeni Actor ümüzün ismi FloatingActor  iken, onu level içine sürüklediğimizde Word Outliner penceresi içinde FloatingActor1 veya FloatingActor2 veya 3..  gibi bi isim aldı;

peki neden?

çünkü Content Browser içinde görünen şey bir Sınıf (class) tipi iken, level içinde görünen o sınıfan türetilmiş bir nesne (object) dir. Tıpkı kodlamada bir sınıftan değişkenler yaratır gibi Content Browser içindeki bir tipi (Type) tutup level içine her sürüklediğinizde o sınıftan bir nesne kopyası yaratılır ve otomatik olarak en sonu sınıf adı + 1, 2, 3 vs.. şeklinde isimlendirilir. Yani Level içindeki herşey belli sınıfların nesneleridir. 




İyi güzel de bir sorun var,, Actor ümüz level içinde görünmüyor; bunun nedeni kendilerinin henüz bir görsel öğeye sahip olmamasıdır; dilerseniz hemen ona bir görünüm verelim, bunun da yolu bir görünüme sahip olan bir nesneyi ona Attach etmektir; bunun için onu önce World Outliner penceresinden kensini seçelim, arından Details Panel den Add Component deyip bir görsel şekil belirtelim;

burada bir static mesh de belirtebiliriz, ancak ilk örneğimizin daha basit olması açısından primitif şekillerden birini seçelim, biz örneğimizde koni kullanacağız; böylece actor ümüz görsel anlamda kendisini koni biçiminde ifade edecek:



şimdi artık actor ümüz hazır, onu istediğimiz gibi level içine sürükleyip bırakabilir ve konumlandırabiliriz; konumlandırma işini Level içinden mouse yordamı ile yapabileceğimiz gibi daha kesin değerler için onu önce yine Word Outliner penceresinden de seçip sonra da Details Panel in transform kısmından Lokasyon değerleri verebiliriz;

isterseniz başlangıç olarak actorümüzü level e  X: -200 ,  Z: 200  olarak set edelim; bu onu sahnede uygun yükseklikte görünür yapacaktır.




şimdi play buttonuna basıp durumu görelim :)




elbette başka componentler de ekleyebiliriz, mesela bir particle sistemi ekleyebiliriz; eklediğimiz her component Actor ümüze başka özellikler katacaktır.

Son olarak UPROPERTY makrosu ile etiketlediğimiz değişkenlerin verdiğimiz parametrelere göre editör özelliklerinde çıkmasını sağlayabildiğimizi de yineleyelim.

ve şimdi artık işin en zevkli kısmı olan editör içinde yarattığımız Actor e ait objele(ler) yaratabiliriz; istediğimiz sayıda...  :)

benzer bir uygulamayı yaparak ben şöyle bir çıktı elde ettim:

bu basit Actor yaratma makalesi bi çok konuda işin mantıksal temeli olabilir.
Daha karmaşık ve de güzel örneklerde görüşmek üzere şimdilik hoşça kalın..

Yorum Gönder