Hedef işaretleyiciler, bir oyuncuyu bir sonraki hedefe veya konuma yönlendirmek için birçok oyunda kullanılır. Bu eğitimde Harita Göstergesi cihazı ve Verse kullanarak yeniden kullanılabilir bir hedef işaretleyiciyi nasıl yapacağını öğreneceksin.
Kullanılan Verse Dili Özellikleri
Yapı: Farklı türlerdeki değişkenleri bir yapı halinde gruplayabilirsin.
Uzatma metodu: Var olan bir sınıfın veya türün bir üyesi gibi hareket eden ancak yeni bir tür veya alt sınıf oluşturulmasını gerektirmeyen özel bir fonksiyon türüdür. Bu eğitimde yapı için bir uzatma metodu oluşturacaksın.
Adlandırılmış bağımsız değişken: Bir fonksiyon çağrısına parametre adı belirtilerek gönderilen bir bağımsız değişken.
Kullanılan Verse API’leri
creative_prop API:
creative_propAPI (Uygulama Programı Arabirimi), nesne hareketi için metotlar sağlar.Düzenlenebilir Özellikler: Hızlı test için hem cihazlara referans vermek hem de değişken değerlerini güncellemek için çeşitli özellikler kullanılır.
Talimatlar
Birden fazla hedefe veya konuma hareket edebilen bir hedef işaretleyici cihazının nasıl kurulacağını öğrenmek için bu adımları takip et. Tam kodlar referans olması için bu kılavuzun sonuna eklenmiştir.
Bölümü Kurmak
Bu örnekte aşağıdaki nesne ve cihazlar kullanılıyor.
1 adet Bina Nesnesi: Harita Göstergesi cihazını hareket ettirmek için kullanılacak nesne.
1 adet Harita Göstergesi cihazı: Mini haritada ve genel bakış haritasında özel işaretleri görüntüleyecek cihaz.
1 adet Oyuncu Doğma Karesi cihazı: Oyuncunun nesnenin yakınında doğması için bu cihazı nesnenin yakınına ekle.
Nesne API’sini Kullanma
Bir cihazı Verse ile hareket ettirmenin ilk adımı, Nesne API’siyle bir nesneyi hareket ettirmektir. Bölümünde bir nesneyi hareket ettirmek için aşağıdaki adımları izle.
objective_coordinator_device adlı yeni bir Verse cihazı oluştur.
Verse dosyasının üst kısmındaki varsayılan
usingifadeleri altına SpatialMath modülü için birusingifadesi ekle. Bu modül, nesneleri hareket ettirmek için referans vereceğin kodu içerir.Verseusing { /UnrealEngine.com/Temporary/SpatialMath }Şu iki düzenlenebilir özelliği ekle:
Hareketli nesneye verilen referansı depolamak için
RootPropadlı bircreative_propsabiti.Nesnenin ona doğru hareket edeceği konumu depolamak için
Destinationadlı birtransformsabiti.Verseobjective_coordinator_device<public> := class<concrete>(creative_device): @editable RootProp<public> : creative_prop = creative_prop{} @editable Destination<public> : transform = transform{}
Bu kodu çalıştırıp objective_coordinator_device cihazını bölümüne sürüklediğinde bu iki özelliği Ayrıntılar panelinde göreceksin.
Bir nesneyi hareket ettiren asıl şey,
TeleportTo[]metodudur. Metodu bir if ifadesi içinde çağırmalısın veTeleportTo[]bir başarısız olabilir ifade olduğundan parantez yerine köşeli ayraç kullanmalısın.ififadesi bir başarısızlık bağlamı oluşturur.Verseif(RootProp.TeleportTo[Destination.Translation, Destination.Rotation]): Print("Prop move successful") else: Print("Prop move failed")TeleportTo[]metodunun bağımsız değişkenleri Yer Değiştirme veDönme’dir. Her ikisi de Varış noktası özelliğinden gelir.Editöre geri dönüp İçerik Tarayıcısı’nda Fortnite > Galeriler > Nesneler altından bir nesneyi editöre sürükle. Bu eğitimde Coastal Buoy 02B adlı nesneyi kullanıyoruz ancak Nesneler klasöründeki herhangi bir şeyi kullanabilirsin.
Anahat Düzenleyicisi’nde hedef koordinatör cihazını seç. Ayrıntılar panelinde RootProp bileşenini nesnene ayarla. Bu örnekte RootProp bileşeni Coastal Buoy 02B olarak ayarlanır.
Ayrıntılar panelinde Varış Noktası öğesini genişlet. Varış Noktası
transformtüründe olduğundan Ölçek, Dönme ve Yer Değiştirme’den oluşur. Nesneyi hareket ettirmek için yalnızca Yer Değiştirme ayarını değiştirmen gerekir, bu nedenle bu ayarı genişlet. X ile biten alanı 5000,0 olarak ayarla.Kodu test ederken etkisinin fark edilir olması için değerlerde büyük değişiklikler yapmak işe yarar bir yoldur. Küçük değişikler, kodunun istediğin gibi çalışıp çalışmadığını görmeni zorlaştırabilir.
Verseusing { /Verse.org/Simulation } using { /Fortnite.com/Devices } using { /UnrealEngine.com/Temporary/SpatialMath } objective_coordinator_device<public> := class<concrete>(creative_device): @editable RootProp<public> : creative_prop = creative_prop{} # Where the marker will be moved toVerse ve ardından Verse Kodu Oluştur seçeneğine tıkladıktan sonra Oturumu Başlat düğmesine tıkla. Son olarak, Oyunu Başlat düğmesine tıkla. Şimdi nesnenin hareket ettiğini görüyor olmalısın.
Üst Öğeler ve Yapılar
Artık bölümünde hareket eden bir nesneye sahipsin ancak asıl amaç, oyuncuların bir ara nokta olarak kullanabilmesi için Harita Göstergesi cihazını hareket ettirmek. Bölümüne bir Yapı Nesnesi ve Harita Göstergesi cihazı ekleyip, Harita Göstergesi cihazını Yapı Nesnesine tutturmak için aşağıdaki adımları izle.
Bağlam menüsünü açmak için İçerik Tarayıcısı içinde sağ tıkla.
Bağlam menüsünden Blueprint Sınıfı’nı seç.
Üst Sınıf Seç penceresinde Bina Nesnesi’ne tıkla.
İçerik Tarayıcında yeni bir Blueprint Sınıfı görünür. Bu sınıfı BuildingProp olarak yeniden adlandır.
Yapı Nesnesini bölümüne sürükle. Bu nesnenin örgüsü yoktur, bu nedenle yalnızca onun dönüştürme gizmosunu göreceksin.
Anahat Düzenleyicide, Harita Göstergesi Cihazını Yapı Nesnesinin üzerine sürükle. Bu, Yapı Nesnesini Harita Göstergesi Cihazının üst öğesi yapar. Şimdi, Yapı Nesnesi hareket ettiğinde Harita Göstergesi Cihazı da onunla birlikte hareket eder.
Verse kullanarak cihaz oluşturmayı zaten biliyorsun ancak kendi cihazı olmayan Verse dosyaları da oluşturabilirsin.
Yeni bir Verse dosyası oluştur ve objective_marker olarak adlandır. Bu dosya, cihaz oluşturmayacak. Bunun yerine, daha önce oluşturduğun Verse cihazının kullanımına verilecek olan bir
structtanımı içerecek.İlk olarak objective_marker adlı bir
structbildirerek başla. Bu yapının iki üyesi olacak:RootPropveMapIndicator. Bu üyelerin ikisi de@editablebelirleyicisine sahip olmalıdır.Verseobjective_marker<public> := struct<concrete>: @editable RootProp<public> : creative_prop = creative_prop{} @editable MapIndicator<public> : map_indicator_device = map_indicator_device{}
Uzatma Metotları ve Adlandırılmış Bağımsız Değişkenler
RootProp üyesini ve buna tutturulan Harita Göstergesi cihazını hareket ettirecek olan MoveMarker metodunu bildir. Bu yöntem, uzatma yöntemleri ve adlandırılmış bağımsız değişkenler olmak üzere iki dil özelliğini getirir.
(Marker : objective_marker).MoveMarker<public>(Transform : transform, ?OverTime : float)<suspends> : void =Uzatma metotları:
MoveMarker()metodunuobjective_markeryapısına ekliyorsun. Bir uzatma yöntemi, bir parantez içinde bir tanımlayıcı ve iki noktayla ayrılan tür kullanılarak bildirilir. Örneğimizde şu şekilde bildiriliyor:(Marker : objective_marker).Adlandırılmış bağımsız değişkenler: İkinci bağımsız değişken
?OverTime,MoveMarkerfonksiyon çağrısında adlandırılması gerektiğini?karakteriyle belirtir. Bu,MoveMarkerçağrısını okuyan veya yazan herhangi bir geliştiricininfloatbağımsız değişkeninin ne yaptığını anlamasına yardımcı olur.
MoveMarker(), Nesne API’sinden iki metottan birini çağırır: Daha önce kullandığın TeleportTo[] veya MoveTo(). OverTime parametresinin 0.0 değerinden büyük olup olmadığını anlamak için bir if..else bloku oluştur. Büyükse MoveTo() metodunu çağır. Bu, hedefin anında ışınlanmak yerine bir sonraki konumuna belirlediğin süre boyunca gitmesini sağlar.
(Marker : objective_marker).MoveMarker<public>(Transform : transform, ?OverTime : float)<suspends> : void =
if (OverTime > 0.0):
Marker.RootProp.MoveTo(Transform.Translation, Transform.Rotation, OverTime)
else:
if:
Marker.RootProp.TeleportTo[Transform.Translation, Transform.Rotation]Kodu şimdi derlersen başarılı olur ancak İçerik Tarayıcısı’ndaki CreativeDevices klasöründe yeni bir cihaz görülmez. Bunun nedeni, objective_marker cihazının creative_device üst sınıfından devralan bir sınıf değil bir struct (yapı) olmasıdır.
Hedef Koordinatörü Cihazını Güncelleme
Artık referans verilecek yeni bir türe sahip olduğuna göre, buna referans vermek için objective_coordinator_device öğesini güncellemen gerekiyor.
RootPropözelliğini silip yerineobjective_markertüründePickupMarkeradlı bir özellik getir. Bu, burada oluşturduğun türdür.MoveMarker()metodufloattüründe bir bağımsız değişken gerektirdiğinden, bu değişkeniMoveTimeadlı bir düzenlenebilir özellik olarak oluştur.TeleportTo[]çağrısını sil. Bunun yerine,objective_markeriçin oluşturduğunMoveMarker()metodunu çağır. Bu metot,?OverTimeadlandırılmış bağımsız değişkenini gerektirir.Verseobjective_coordinator_device<public> := class<concrete>(creative_device): @editable PickupMarker<public> : objective_marker = objective_marker{} # Where the marker will be moved to @editable Destination<public> : transform = transform{} # How much time the marker should take to reach its new location
Bu kodu derle ve hedef koordinatörü cihazının Ayrıntılarını kontrol et. PickupMarker ve MoveTime özellikleri bulunmalı ve PickupMarker özelliği, RootProp ve MapIndicator alanlarını içermelidir.
RootProp alanını BuildingProp olarak, MapIndicator alanınıysa Harita Göstergesi Cihazı (Map Indicator Device) olarak ayarla.
Kodunu derleyip Oturumu Başlat düğmesine tıkla. Oyunun başladıktan kısa bir süre sonra mini haritanda hareket eden bir işaretleyici görmelisin. İşaretleyicinin hareketini,
MoveTimealanını0,0dahil farklı değerlere ayarlayarak dene. Farklı senaryolar için hangi hareketin en iyi düzeyde uygun olacağını düşün.
GetPlayers() ve ActivateObjectivePulse()
Oyuncularına bir sonraki hedeflerine ulaşmaları için biraz daha yardım etmenin bir yolu var. Buna hedef atımı adı verilir ve etkinleştiğinde oyuncudan Harita Göstergesi Cihazı’na doğru hareket eden noktalı bir çizgi gösterir. Hedef koordinatörü cihazına bir hedef atımı eklemek için aşağıdaki talimatları izle.
Hedef atımını etkinleştirmek için kullanacağın metot, agent türünde bir bağımsız değişken gerektiren ActivateObjectivePulse() adlı metottur. Oyuncu karakterini temsil eden agent örneğini almak için metodu oluşturarak işe başla.
Dönüş değeri
voidolan ve<private>olarak ayarlananFindPlayer()adlı bir fonksiyonu bildir.Self.GetPlayspace().GetPlayers()ile bölümündeki tüm oyuncuları içeren bir diziyi al. DiziyiAllPlayersadlı bir değişkende depola.VerseFindPlayer<private>() : void = AllPlayers := Self.GetPlayspace().GetPlayers()Bölümündeki tek oyuncuya referans almak için ilk dizi öğesini kendi değişkenine ata. Bir diziye erişim, bir başarısız olabilir ifadedir, bu nedenle onu bir
ififadesi içine yerleştir.Verseif (FirstPlayer := AllPlayers[0]):Oyuncunu (
player) bir değişkene atamak başarısız olabileceğinden, kodunda oyuncuya referans verirken option (seçenek) türünde bir değişken kullanmalısın. İsteğe bağlı bir?playeroyuncu değişkeni bildir. Bu değişken, diğer üye değişkenlerle uyumlu olmalıdır.Verseobjective_coordinator_device<public> := class<concrete>(creative_device): var PlayerOpt<private> : ?player = false @editable PickupMarker<public> : objective_marker = objective_marker{} # Where the marker will be moved to @editable Destination<public> : transform = transform{}Yeni değişkenini ayarlayıp bir oyuncunun bulunamadığını sana söyleyecek olan bir
Print()ifadesine sahip birelsebloku oluştur. ArtıkFindPlayer()fonksiyonun tamamlandı.VerseFindPlayer<private>() : void = # Since this is a single player experience, the first player [0] # should be the only one available. AllPlayers := Self.GetPlayspace().GetPlayers() if (FirstPlayer := AllPlayers[0]): set PlayerOpt = option{FirstPlayer} Print("Player found")
Şimdi OnBegin() fonksiyonuna geri dönüp iki değişiklik daha yapman gerekiyor:
FindPlayer()fonksiyonunu çağır.VerseOnBegin<override>()<suspends> : void = FindPlayer()MoveMarker()çağrısından sonra, isteğe bağlı oyuncu değişkenini yeni bir değişkene ayarlamak için başka birififadesi kullan ve onuPickupMarker.MapIndicator.ActivateObjectivePulse()fonksiyonuna bağımsız değişken olarak ilet.Verseif (FoundPlayer := PlayerOpt?): PickupMarker.MapIndicator.ActivateObjectivePulse(FoundPlayer)
Şimdi kodu çalıştırdığında bölümde karakterinden hedef işaretleyicinin bulunduğu konumu işaret eden hedef atımını göreceksin!
Tam Kodlar
Objective_marker.verse
using { /Verse.org/Simulation }
using { /Fortnite.com/Devices }
using { /UnrealEngine.com/Temporary/SpatialMath }
using { /Fortnite.com/Devices/CreativeAnimation }
objective_marker<public> := struct<concrete>:
# The prop that will be moved
@editable
RootProp<public> : creative_prop = creative_prop{}
Objective_coordinator_device.verse
using { /Verse.org/Simulation }
using { /Fortnite.com/Devices }
using { /Fortnite.com/Playspaces }
using { /UnrealEngine.com/Temporary/SpatialMath }
objective_coordinator_device<public> := class<concrete>(creative_device):
var PlayerOpt<private> : ?player = false
@editable
Kendi Kendine Yapabileceklerin
Burada yazdığın hareket ettirme kodunun tüm nesneler için çalışacağını unutma. Hareket edebilir bir nesneyi bir cihazın üst öğesi yapabilirsen cihaz da nesneyle birlikte hareket edecektir. Başka nesneleri ve cihazları hareket ettirmeyi dene ve bunlardan başka hangi oyunlarda yararlanabileceğini düşün.
Sonraki Adımlar
Bu kılavuzu bir Toplama / Dağıtma oyunu inşa etmek için kullanıyorsan bir sonraki adımın Geri Sayım Süreölçeri özelliğini nasıl oluşturacağını öğrenmek olacak.