Nesneleri Hareketlendirmek

Hareket Fonksiyonları

Oyun yapıyorsak nesnelerimizi hareket ettirmemiz gerekli. Bunu c++ ile yapabilmek için Actor sınıfının bize sağlamış olduğu bazı fonksiyonlar var. Bu fonksiyonlar benzer isimlerle blueprint’te de mevcut.

Objelerimize mutlak konum veya rotasyon atamak için “SetActorLocation” ve “SetActorRotation” fonksiyonlarını kullanabiliriz. Başka bir şekilde ifade etmek gerekirse nesnemiz konumu ve açısını ayarlıyoruz.

Fakat mutlak bir son değer atamak yerine şuanki bulunduğu konuma göre belli bir mesafe/açı ötelenmesini/dönmesini istiyorsak bunun için “AddActorWorldOffset” ve “AddActorWorldRotation” fonksiyonlarını kullanabiliriz.

Buradaki World kelimesi global koordinat sistemine karşılık gelir. Yani sahnenin koordinat sistemi. Aynı işi lokal koordinat sisteminde de yapabilirdik. Yani nesnenin kendi eksenlerine göre.

SetActorLocation(FVector(0, 0, 100)); 
SetActorRotation(FRotator(0, elapsedTime * 50, 0));


AddActorWorldOffset(FVector(0, 5 * DeltaTime, 0));
AddActorWorldRotation(FRotator(0, 50 * DeltaTime, 0));

AddActorLocalOffset(FVector(0, 5 * DeltaTime, 0));
AddActorLocalRotation(FRotator(0, 30 * DeltaTime, 0));
C++
  • SetActorLocation : Aktörü belirtilen mutlak konuma getirir.
  • SetActorRotation : Aktörün rotasyonunu verilen mutlak rotasyona göre ayarlar.
  • AddActorWorldOffset : Aktörü, verilen vektör kadar öteler.
  • AddActorWorldRotation : Aktörü, verilen açı kadar döndürür.

Global & Local Koordinat Sistemleri

Okulda bize öğretilen ilk koordinat sistemi global koordinat sistemidir. Bir başka söyleyişle “world space coordinates”. Burada bir tane orjinimiz yani merkez noktamız bulunuyor. Diğer noktaları da bu merkez noktasını referans göstererek belirtiyoruz. Yani bildiğimz düz koordinat sistemi, herhangi bir esprisi yok.

Gel gelelim local koordinat sistemine. Sahneye yerleştiğimiz her nesne aslında bir koordinat sistemine sahip. Sahnedeki ögelere tıkladığınızda bir koordinat ekseni görürsünüz. İşte o aslında o nesneye ait olan koordinat sistemini ifade ediyor.

Ben yukarıdaki sandalyeyi öne doğru hareket ettirmek için kendi local-x ekseninde ileri doğru götürmem gerekli. Çünkü sandalyenin önü, sandalyenin açısına göre göreceli bir şekilde değişmekte.

💡 Unreal koordinat sistemi olarak Sol El koordinat sistemini kullanır.

Pitch, Yaw, Roll

Bunları ben hep karıştırdım. Rotasyon ile ilgili şöyle kavramlar var.

  • Kırmızı → X ekseni → Roll
  • Yeşil → Y ekseni → Pitch
  • Mavi → Z ekseni → Yaw

Gerek karakterin gerekse başka nesnelerin rotasyonunu ayarlerken buna dikkat etmemiz gerekli

Özellikle FRotator oluşturmak için X, Y, Z eksenlerinin açılarını gireceğiz fakat sıralama yanlış olacak çünkü Y, Z, X diye girmemiz gerekli.

FRotator(pitch, yaw, roll)
C++

Böyle garip bir durum söz konusu. Kodlama yaparken istediğiniz şekilde dönmüyorsa muhtemelen yerini değiştirmeniz gerekli

DeltaTime

Aktörün Tick fonksiyonu bize DeltaTime değişkenini verir

void AItem::Tick(float DeltaTime)
C++

Tick fonksiyonu her frame de 1 kere çalışır. Örneğin 60 fps de 60 kere, 120 fps de 120 kere, 3 fps de 3 kere… DeltaTime değişkeni ise bir önceki frame’den bu frame’e kadar geçen süreyi bize verir.

Peki bu değişken neden önemli?

Aktörümüzü hareket ettirmek istiyoruz. Bunun için tick fonksiyonuna

float speed = 1.0f;
AddActorWorldOffset(FVector(0, 0, speed));
C++

yazdık. Fakat böyle yazdığımızda 1 saniyede 120 fps’lik bir makinada 120 birim; 30 fps’lik bir makinada 30 birim hareket eder. Fakat biz tüm makinalarda aynı oyuncu deneyiminin yaşanmasını istiyoruz. Bu sebepten ötürü kodumuzu kare hızından bağımsız (Frame Rate Independent) hale getirmemiz gerikiyor. Bunu yapmak için deltatime ile çarpmak yeterli:

float speed = 1.0f;
AddActorWorldOffset(FVector(0, 0, speed * DeltaTime));

// şöyle de yazabilirdik: 
AddActorWorldOffset(FVector(0, 0, speed) * DeltaTime);
C++

Trigonometrik fonksiyonlar

FMath kütüphanesi bize çeşitli trigonometrik fonksiyonlar sunuyor:

FMath::Sin(elapsedTime);
FMath::Cos(elapsedTime);
C++

sin ve cos fonksiyonlarını kullanarak dairesel hareket oluşturabilirsiniz.


Comments

Leave a Reply

Your email address will not be published. Required fields are marked *