Platform oyun modlarında, her satırda yalnızca birkaç platformun atlamaya uygun olduğu benzersiz bir platform ızgara sekansı oluşturmak yaygın kullanılan bir yoldur. Bu, oyuncuların yavaşlayıp sekansı anlamasını gerektirir.
Bu eğitimde, her satırda rastgele seçilen platformların çarpışmaya ve ışık rengine sahip olduğu, diğerlerininse çarpışma ve ışık rengine sahip olmadığı bir platform ızgarasının nasıl oluşturulacağı gösteriliyor.
Platform Prefabını Oluşturma
Verse’te yazacağın bir platform prefab’ı oluşturmak için şu adımları takip et:
Yeni bir varlık yerleştir ve onu choose_one_platform_prefab adlı bir prefab olarak yükselt. Talimatlar için Prefab ve Prefab Örnekleri sayfasına bakabilirsin.
Prefab Editöründe varlığa aşağıdaki bileşenleri ekle:
Transform_component: Platformu konumlandırmak için dönüşüm bileşeni.
Mesh_component: Platformun statik örgüsünü ayarlamak için kullanılan örgü bileşeni. Bu örnekte Fab Marketplace’teki Stilize Mısır Dünya Paketi öğesinden SM_block_02 örgüsü kullanılıyor.
Collision_component: Platformda çarpışmayı etkinleştirmek ve devre dışı bırakmak için çarpışma bileşeni.
Parent_constraint_component: Verse kullanılarak dünyada bu prefab oluşturulurken dönüşümü üst varlığa göre kolayca ayarlamak için üst kısıtlama bileşeni.
Bir alt varlık ekle ve Işık olarak adlandır.
Işık alt varlığına aşağıdaki bileşenleri ekle:
Transform_component: Varlığı platformun üzerinde konumlandıran dönüşüm bileşeni.
Point_light_component: Platformun çarpışması olup olmadığına göre renk değiştiren bir ışık kaynağı eklemek için nokta ışığı bileşeni.
Parent_constraint_component: Bu varlığın dönüşümünü üst varlığa göre kısıtlayan üst kısıtlama bileşeni.
Prefabı kaydet.
Prefabın şimdi Assets.digest.verse dosyasında prefabınla aynı şekilde choose_one_platform_prefab adını taşıyan bir sınıf olarak görünecek.
Platformlardan Bir Izgara Oluşturma
Platform prefab’ından yapılmış bir ızgara oluşturmak için şu adımları takip et:
Choose_one_component adlı bir Verse bileşeni oluştur. Bir Verse bileşeni oluşturma adımları için Kendi Verse Bileşenini Oluşturma bölümüne bakabilirsin.
Aşağıdaki düzenlenebilir özellikleri ekle:
Izgarada kaç tane platform olacağını tanımlamak için
GridSizeadında bir tamsayı 2D vektör olanvector2ialanı. X, ızgaradaki satır sayısı, Y ise sütun sayısıdır.Satır ve sütunlarda platformlar arasındaki boşluğu belirtmek için
PlatformSpacingadlı kayan sayı 2D vektörvector2alanı.~~~(verse) GridSizeTip<localizes>:message = "Izgara X birim genişliğinde ve Y birim derinliğindeyken ızgaranın boyutu." PlatformSpacingTip<localizes>:message = "Izgaradaki platformlar arasındaki mesafe."
choose_one_component<public> := class(component):
# Izgaranın boyutu; ızgara X birim genişliğinde ve Y birim derinliğindedir. @editable_vector_number(int): ToolTip := GridSizeTip MinComponentValue := option{0} GridSize:vector2i = vector2i{X := 3, Y := 10}
# Izgara üzerindeki her bir platform arasındaki mesafe. @editable_vector_number(float): ToolTip := PlatformSpacingTip MinComponentValue := option{0.0} PlatformSpacing:vector2 = vector2{X := 256.0, Y := 256.0} ~~~
OnSimulatefonksiyonunda, kaç tane platform oluşturulacağını bilmek içinGridSizevektörü boyunca yinele. Döngüde, prefab sınıfının bir örneğini oluştur ve prefab’ı dünyada ortaya çıkarmak için bu Verse bileşeninin bağlı olduğu varlığa ekle.~~~(verse) GridSizeTip<localizes>:message = "Izgara X birim genişliğinde ve Y birim derinliğindeyken ızgaranın boyutu." PlatformSpacingTip<localizes>:message = "Izgaradaki platformlar arasındaki mesafe."
choose_one_component<public> := class(component):
# Izgaranın boyutu; ızgara X birim genişliğinde ve Y birim derinliğindedir. @editable_vector_number(int): ToolTip := GridSizeTip MinComponentValue := option{0} GridSize:vector2i = vector2i{X := 3, Y := 10}
# Izgara üzerindeki her bir platform arasındaki mesafe. @editable_vector_number(float): ToolTip := PlatformSpacingTip MinComponentValue := option{0.0} PlatformSpacing:vector2 = vector2{X := 256.0, Y := 256.0}
OnSimulate<override>()<suspends>:void= # Izgarayı yapmak için platformlar oluştur. for (Column := 0..GridSize.Y - 1): for (Row := 0..GridSize.X - 1): # Bir prefab’ın örneğini oluşturmak ve onu mevcut bir varlığa eklemek prefab’ın dünyada ortaya çıkmasını sağlar. ChooseOnePlatform := choose_one_platform_prefab{} Entity.AddEntities(array{ChooseOnePlatform}) ~~~
Kodu şimdi yürütürsen tüm platformlar aynı yerde çıkacaktır. Prefab, dönüşüm bileşenine ve üst kısıtlama bileşenine sahip olduğundan, dönüşüm bileşeninde InitialRelativeTransform özelliğini, prefabı eklediğin varlığın konumuna göre bir uzaklıkta oluşturacak şekilde ayarlayabilirsin. Oluşturduğun varlıktaki üst kısıtlama bileşeni olmasaydı dünya uzayındaki konumu (kök varlığa göre değil) belirtmen gerekirdi.
VerseGridSizeTip<localizes>:message = "Size of the grid, where the grid is X units wide by Y units deep." PlatformSpacingTip<localizes>:message = "The distance between each platform on the grid." choose_one_component<public> := class(component): # Size of the grid, where the grid is X units wide by Y units deep. @editable_vector_number(int): ToolTip := GridSizeTip MinComponentValue := option{0} GridSize:vector2i = vector2i{X := 3, Y := 10}Kodunu kaydet ve derle.
Bu Verse bileşenini bir varlığa ekleyip bir oturum başlatırsan o varlığın konumunda platformlardan oluşan bir ızgara belirecektir.
Geçerli Platformları Rastgele Seçme
Artık dünyada ortaya çıkan, platformlardan oluşan bir ızgaran olduğuna göre, platformlara daha fazla işlevsellik ekleyebilirsin. Aşağıdaki adımlarda, oyuncunun üzerinden atlayabileceği benzersiz ve değişen bir platform sekansı oluşturmak için çarpışmaya sahip olacak platformların rastgele nasıl seçileceği gösteriliyor.
Izgaradaki geçerli platformları rastgele seçmek için şu adımları takip et:
Verse bileşenine aşağıdaki düzenlenebilir özellikleri ekle:
Çarpışmaya sahip minimum platform sayısını belirtmek için
MinCorrectPlatformsPerRowadlı bir tamsayı değişkeni.Çarpışmaya sahip maksimum platform sayısını belirtmek için
MaxCorrectPlatformsPerRowadlı bir tamsayı değişkeni.Çarpışma etkinse platformun rengini ayarlamak için
ChosenColoradlı bir renk değişkeni.Çarpışma etkin değilse platformun rengini ayarlamak için
NotChosenColoradlı bir renk değişkeni.Verseusing { /UnrealEngine.com/Temporary/SceneGraph } using { /UnrealEngine.com/Temporary/SpatialMath } using { /Verse.org } using { /Verse.org/Colors } using { /Verse.org/Native } using { /Verse.org/Random } using { /Verse.org/Simulation } GridSizeTip<localizes>:message = "Size of the grid, where the grid is X units wide by Y units deep." PlatformSpacingTip<localizes>:message = "The distance between each platform on the grid."
Bir
forifadesinin sonucu, her bir yinelemenin dizisidir. Bir satır için oluşturulan tüm platformları bir dizide depola ve platformları rastgele ayarlamak için bu diziyiRandomizeCollidablePlatformsPerRow()adlı bir fonksiyona ilet.VerseOnSimulate<override>()<suspends>:void= # For each row, spawn multiple platforms and pick a number of them to have collision while the others don't. # The platforms with collision will have the Chosen color for their light component. # The platforms without collision will have the NotChosen color for their light component. for (Row := 0..GridSize.Y - 1): EntitiesInRow := for (Column := 0..GridSize.X - 1): # The prefab has a parent constraint component so set the InitialRelative Transform # on the transform component to offset each platform relative to this entity. # This means the platform prefabs will spawn same distance from each other # but moving the root entity will change where the platforms originate.Çarpışmaya sahip varlıkları rastgele seçecek ve tüm varlıklarda çarpışmayı devre dışı bırakacak
RandomizeCollidablePlatformsPerRowadlı bir fonksiyon oluştur. Nokta ışığı bileşeni prefabın alt varlığında olduğundan, nokta ışığının rengini değiştirmek içinFindComponents’ı kullanarak varlığın alt öğeleri arasında arama yapabilirsin.Verse# Randomly choose platforms to have collision in the row. RandomizeCollidablePlatformsPerRow(Entities:[]entity):void= # Disable all the entities before choosing which ones to enable. # It disables an entity by disabling the collision on the entity, # and finding a point light in its child entities to change its color. for: EntityPlatform : Entities Collision := EntityPlatform.GetComponents(collision_component)[0] Light := EntityPlatform.FindComponents(point_light_component)[0] do:Diziden rastgele bir eleman seçmek için
ChooseOneadında bir dizi genişletme metodu oluştur. Bu yöntem, hem seçilen elemanı içeren hem de seçilmeyen diğer tüm elemanların dizisini içeren bir demetle sonucunu verir.Verse# An extension method for an array to get a randomly selected element from the array. (Input:[]t where t:subtype(comparable)).ChooseOne()<decides><transacts>:tuple(t, []t)= ChosenElement := Input[GetRandomInt(0, Input.Length - 1)] NotChosenElements := Input.RemoveFirstElement[ChosenElement] (ChosenElement, NotChosenElements)Çarpışmaya sahip olacak bir varlığı seçmek ve rengini değiştirmek için
RandomizeCollidablePlatformsPerRowfonksiyonundanChooseOneçağrısı yap.Verse# Randomly choose platforms to have collision in the row. RandomizeCollidablePlatformsPerRow(Entities:[]entity):void= # Disable all the entities before choosing which ones to enable. # It disables an entity by disabling the collision on the entity, # and finding a point light in its child entities to change its color. for: EntityPlatform : Entities Collision := EntityPlatform.GetComponents(collision_component)[0] Light := EntityPlatform.FindComponents(point_light_component)[0] do:Düzenlenebilir özelliklere dayalı olarak çarpışmaya sahip olan birden fazla varlığı seçmek için
RandomizeCollidablePlatformsPerRow’u güncelle. Önce, her satırdaki doğru platformların minimum ve maksimum sayısı arasında rastgele bir değer al ve bir varlığı istediğin kez seç, ardından seçilen varlığı bir sonraki seçilecek adaylar listesinden çıkar.Verse# Randomly choose platforms to have collision in the row. RandomizeCollidablePlatformsPerRow(Entities:[]entity):void= # Disable all the entities before choosing which ones to enable. # It disables an entity by disabling the collision on the entity, # and finding a point light in its child entities to change its color. for: EntityPlatform : Entities Collision := EntityPlatform.GetComponents(collision_component)[0] Light := EntityPlatform.FindComponents(point_light_component)[0] do:Kodunu kaydet ve derle.
Artık bir oturum başlattığında dünyada çarpışmaya ve seçilen renge sahip benzersiz bir platform sekansıyla bir platform ızgarası oluşturulur.
Tam Kod
using { /UnrealEngine.com/Temporary/SceneGraph }
using { /UnrealEngine.com/Temporary/SpatialMath }
using { /Verse.org }
using { /Verse.org/Colors }
using { /Verse.org/Native }
using { /Verse.org/Random }
using { /Verse.org/Simulation }
GridSizeTip<localizes>:message = "Size of the grid, where the grid is X units wide by Y units deep."
PlatformSpacingTip<localizes>:message = "The distance between each platform on the grid."