Verse kullanarak varlıklarına eklemek üzere kendi bileşenlerini oluşturabilirsin. Özel Verse bileşenleriyle sahnede varlıkları oluşturabilir ve kaldırabilir, varlıklara bileşen ekleyebilir veya kaldırabilir, döngüde kaybolan bir varlık gibi kendi davranışlarını oluşturabilir ya da aklına gelebilecek başka her şeyi yapabilirsin!
Yeni Bir Verse Bileşeni Oluşturma
Verse şablon dosyasından yeni bir Verse bileşeni oluşturabilirsin.
Yeni bir Verse bileşeni oluşturmak için:
Varlığının Ayrıntılar panelinde Bileşen Ekle > Yeni Verse Bileşeni’ni seç.
Ayrıca Verse Gezgini aracılığıyla yeni bir Verse dosyası ekleyerek yeni bir Verse bileşeni oluşturabilirsin.
Verse kodu şablonları listesinden Scene Graph Bileşeni’ni seç.
Bileşen Adı değerini Verse ile yazılan bileşeninin adına ayarla. Bu örnekte bileşen
my_verse_componentadını almıştır.Verse bileşen dosyanı oluşturmak için Oluştur butonuna tıkla. Verse ile yazılan bileşenin artık varlığına bir bileşen eklemeyi seçtiğinde bileşen listesinde görünür.
Belirli bir bileşen sınıfı veya alt sınıftan yalnızca bir tanesini ekleyebilirsin. Örneğin, bir varlık üzerinde yalnızca bir tane mesh_component olabilir. Bu kural, bileşenlerin alt sınıflarını da kapsar, yani varlığına bir capsule_light_component eklersen her ikisi de alt sınıf light_component’tan geldiğinden bir rect_light_component ekleyemezsin. Aynı sınırlama Verse’te oluşturulan özel bileşenlerin için de geçerlidir.
Bileşen Yaşam Süresi
Bileşenler varlıklara eklendiklerinde, sahneye eklendiklerinde ve simülasyonda çalışmaya başladıklarında bir dizi yaşam süresi fonksiyonu arasında geçiş yaparlar. Verse ile yazılan bileşenleriniz kurulum ve simülasyonlarını çalıştırmak için bu metotları geçersiz kılmalıdır.
Bir bileşen kapandıktan sonra bu fonksiyonların kapatma sürümleri arasında geçiş yaparak bileşen atılmadan önce bileşen üzerinde kalan durumları temizleme fırsatı sunar.
Bir bileşenin yaşam süresi durumları aşağıda verilmiştir:
Initialized
AddedToScene
BeginSimulation
EndSimulation
RemovingFromScene
Uninitializing
Bileşen yaşam süresi fonksiyonları, cihaz yaşam sürelerinden farklıdır. Bileşen mantığı hem düzenleme hem de oynatma modunda çalışır. Eklediğin her davranış, oturumu başlattığında hemen çalışır. Bileşen mantığının yalnızca oyun başladığında çalışmasını istersen bir Verse cihazının OnBegin() fonksiyonunda prefablar oluşturabilirsin.
Verse ile Varlıkları ve Bileşenleri Sorgulama
Verse kodunda varlıkları ve bileşenleri birkaç farklı yöntemle bulabilirsin. Varlıklarını ve bileşenlerini nasıl yapılandırdığın, Verse kodunda işlevsellikleri nasıl sorguladığını ve geliştirdiğini etkiler.
Verse’te varlıkları ve bileşenleri sorgulamak için bir varlıkla başlayıp hiyerarşide onun üstünde veya altında iç içe yerleştirilmiş varlıkları döndürmen gerekir. Bir varlığın doğrudan üst veya alt öğelerini ve ayrıca tüm üst ve alt varlıklarını sorgulayabilirsin.
Bileşen Türü ile Varlıkları Alma
Sorgulamak istediğin varlık üzerinde çağrı yaparak belirli bir türden bileşene sahip tüm varlıkları bulabilirsin. Sorguladığın varlık simülasyon varlığıysa sahnede o türden bileşenlere sahip olan tüm varlıkları döndürür.
Aşağıdaki örnekte Verse bileşeni, light_component bileşeninin bağlı olduğu tüm varlıkları alır. Bulduğu her varlık için bir particle_sytem_component üretir ve varlıklara ekler. Burada BlowingParticles, Assets.digest.Verse dosyasında referans verilen bir Niagara oluşturucudur.
light_component, varlıklarına ekleyebileceğin tüm farklı light component türleri için bir üst sınıftır. Aşağıdaki sorguda LightComponent, üzerinde herhangi bir türde light component olan varlıkları bulmak için kullanılır.
# Runs when the component should start simulating in a running game.
OnBeginSimulation<override>():void =
# Run OnBeginSimulation from the parent class before
# running this component's OnBeginSimulation logic
(super:)OnBeginSimulation()
for:
LightComponent : Entity.GetSimulationEntity[].FindDescendantEntitiesWithComponent(light_component)
do:
# Create a particle system component and add it to the entity.
Sıradaki örnek, Verse bileşeni eklenmiş varlığın altında iç içe parçacık sistemleri olan tüm varlıkların FindDescendantEntitiesWithComponent() fonksiyonu kullanılarak nasıl sorgulanacağını gösterir. Aynı şekilde, FindAncestorEntitiesWithComponent() kullanarak belirli bir bileşene sahip tüm üst varlıkları da alabilirsin.
# Runs when the component should start simulating in a running game.
# Can be suspended throughout the lifetime of the component. Suspensions
# will be automatically canceled when the component is disposed or the
# game ends.
OnSimulate<override>()<suspends>:void=
# Get all entities that have particle system components nested under the entity this component is attached to.
ParticleSystemEntities := Entity.FindDescendantEntitiesWithComponent(particle_system_component)
# Get all entities with particle system components that are ancestors of this entity.
Sahnenin tamamındaki varlıkları sorgulaman gerekirse simülasyon varlığını alıp sorgularını simülasyon varlığı üzerinde gerçekleştirerek bunu yapabilirsin. Bu işlem, varlık yapısının en üstünde başlar ve sorguyla eşleşen tüm iç içe varlıkları bulur. Simülasyon varlığına erişmek için Verse bileşeninin bağlı olduğu varlık üzerinde GetSimulationEntity[] başarısız olabilir fonksiyonunu çağır.
# Runs when the component should start simulating in a running game.
# Can be suspended throughout the lifetime of the component. Suspensions
# will be automatically canceled when the component is disposed or the
# game ends.
OnSimulate<override>()<suspends>:void=
# Get the simulation entity.
if:
SimulationEntity := Entity.GetSimulationEntity[]
then:
Verse bileşenine varlık ağacında sürekli olarak yukarı ve aşağı baktırmak pahalı olabilir. Davranışın belirli bir varlık yapısına bağlıysa varlık yapındaki herhangi bir küçük değişiklik, davranışının istenmeyen şekillerde değişmesine veya hiç çalışmamasına neden olabilir.
Diğer yandan, bu aynı zamanda bileşeninin daha az ayar gerektirebileceği anlamına gelir çünkü tek yapman gereken Verse bileşenini ekleyip doğru varlık yapısına sahip olmaktır. Varlıklarını oluştururken ve Verse bileşeninin mantığını geliştirirken bu dengeyi aklında bulundur.
Verse’te varlıklar ve bileşenlerle çalışmanın tüm yolları için SceneGraph modülünü incele. Aşağıda, kodundaki varlıkları ve bileşenleri sorgulamanın bazı yaygın yolları açıklanmaktadır.
Bir Varlığın Bileşenlerini Alma
Bir varlık üzerinde GetComponent[] çağrısı yaparak belirli bir türdeki bileşeni almak için Verse kullanabilirsin. Bunu yapmak, başka bileşen davranışına bağlı olan özel bir mantık oluştururken faydalıdır. Örneğin, ışığın rengine bağlı olarak ses çalmak için sound_component kullanmak veya varlığın belirli bir alanda olup olmamasına bağlı olarak efektler uygulamak için bir particle_system_component almak.
Aşağıdaki örnekte Verse bileşeni, bir platformun bir döngüde art arda belirip kaybolmasını sağlar. Bunu, varlık üzerinde örgü bileşenini alıp devre dışı bırakarak, belirli bir süre sonrasında ise yeniden etkinleştirerek yapar.
using { /Verse.org }
using { /Verse.org/Native }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/SceneGraph }
# A Verse-authored component that can be added to entities.
# This component will make the entity appear and disappear on loop.
disappear_on_loop_component := class<final_super>(component):
# How long in seconds the entity should be hidden.
@editable
Başka bir örnekte, Verse bileşeni varlıktaki light_component bileşenini alır ve rengini koyu turuncuyla değiştirir. light_component, varlıklarına ekleyebileceğin her türlü ışık rengi için bir üst sınıf olduğundan bu örnek, ondan alt sınıf oluşturan herhangi bir bileşeni bulur.
# Runs when the component should start simulating in a running game.
# Can be suspended throughout the lifetime of the component. Suspensions
# will be automatically canceled when the component is disposed or the
# game ends.
OnSimulate<override>()<suspends>:void=
# Find any component on this entity that subclasses from light_component.
if:
LightComponent := Entity.GetComponent[light_component]
then:
Tüm Bileşenleri Alma
Varlıktaki tüm bileşenleri döndürmek için GetComponents() fonksiyonunu kullanabilirsin. Kodun bunların ne tür bileşenler olduğunu bilmediğinden her bileşenin türüne göre farklı işlemler gerçekleştirmek için dönüştürmeyi kullanabilirsin. Aşağıdaki örnek, bir varlıktaki tüm bileşenlerden oluşan bir diziyi alır ve bunları enableable türüne dönüştürmeye çalışır. Dönüştürme başarılı olursa bileşen enableable arayüzünü uygular. Ardından bu arayüzü uygulayan her bir bileşeni devre dışı bırakır.
# Runs when the component should start simulating in a running game.
# Can be suspended throughout the lifetime of the component. Suspensions
# will be automatically canceled when the component is disposed or the
# game ends.
OnSimulate<override>()<suspends>:void=
# Get a list of all components on the entity.
ComponentList := Entity.GetComponents()
for:
Component:ComponentList
Oynanış Etiketlerine Göre Varlıkları Bulma
Sahnendeki belirli varlıkları bulabilmek için varlıklarına bir tag bileşeni ekleyebilirsin. Bu işlem, aktörlerine Oynanış Etiketleri eklemeye benzer. Bunu yapmak, sahip oldukları bileşenler veya sahnenin neresinde oldukları gibi değiştirilebilir şeylere bel bağlamak yerine birlikte çalışmak istediğin varlıkları seçerken kullanışlıdır.
Bunun nedeni, değiştirilebilir şeylere bel bağlamanın, projendeki varlıkları değiştirip yeni varlıklar ekledikçe oyununda istenmeyen davranışlara neden olabilmesidir. Editörde varlığına bir tag_component ekleyerek ve Etiketler açılır menüsünden etiketleri seçerek veya Verse kodunda AddTag() fonksiyonunu kullanarak etiket ekleyebilirsin.
Aşağıdaki örnek, tag_component’larında my_tag etiketiyle işaretlenmiş tüm alt öğeler için simülasyon varlığını sorgular.
# Runs when the component should start simulating in a running game.
# Can be suspended throughout the lifetime of the component. Suspensions
# will be automatically cancelled when the component is disposed or the
# game ends.
OnSimulate<override>()<suspends>:void =
# Get the simulation entity.
if:
SimulationEntity := Entity.GetSimulationEntity[]
then:
Çakışan Varlıkları Bulma
Çarpışma etki aktörleri, örgülerin çarpışma şekillerini temsil eden etki aktörleridir. Bunları, bir kuleye çok yaklaşan objelere hasar vermek veya bir futbol topu kaleye girdiğinde algılamak gibi belirli bir şekil içinde çakışan objeleri sorgulamak için kullanabilirsin. Verse’te belirli bir alandaki tüm varlıkları bulmak için FindOverlapHits() fonksiyonunu kullanabilirsin.
Bu alan; varlığın kendisi, küre veya kutu gibi belirli bir çarpışma etki aktörü veya varlığın simüle edileceği bir konum olabilir. Bu daha sonra bir overlap_hit listesi döndürür. Her overlap_hit sana, kaynak bölgenin çakıştığı bileşen veya bölge hakkında bilgi verir ve bu bileşenlerin ilişkili varlığını bulmak için onları sorgulayabilirsin.
Aşağıdaki örnek, varlığın dönüşümünü merkeze alan, yarıçapı 256.0 birim olan bir küre oluşturur. Daha sonra küre içindeki tüm çakışmaları bulur ve bir overlap_hit listesi döndürür. Her overlap_hit bir bileşen veya etki aktörü olduğundan TargetComponent veya TargetVolume değerini sorgulayarak hangi tür olduğunu öğrenebilirsin. overlap_hit bir bileşense kod, bileşenin varlığını alır. Son olarak varlığın bir ışık bileşenine sahip olup olmadığını kontrol eder. Sahipse ışığın rengini mavi yapar. Yeteri kadar büyük bir etki aktörüyle yalnızca birkaç satır kod kullanarak adandaki her ışığın rengini değiştirebilirsin!
# Runs when the component should start simulating in a running game.
# Can be suspended throughout the lifetime of the component. Suspensions
# will be automatically canceled when the component is disposed or the
# game ends.
OnSimulate<override>()<suspends>:void=
# Define a volume to find entities within.
# This is a sphere whose radius is 256.
CollisionSphere:collision_sphere = collision_sphere:
Radius := 256.0
Bu kod, küp varlığının merkezinde 256.0 birim yarıçapa sahip daire şeklinde çakışan bir collision_sphere etki aktörünü simüle eder ve kürenin çakıştığı tüm bileşenleri veya etki aktörlerini döndürür. Ardından çakışan her bir bileşenin üst varlığını alır ve üzerindeki ışık bileşenlerini maviye çevirir. Çakışma başladığında küp collision_sphere içinde olduğu için overlap_hits listesine dahil edilir ve ayrıca maviye döner. En sağdaki kırmızı koni varlığı collision_sphere dışındadır, bu nedenle çakışmaz ve maviye döner.
Süpürmelerle Varlıkları Bulma
Varlıkları sorgulamanın bir diğer önemli yolu da süpürmelerdir. Süpürme, bir objeyi belirli bir vektör üzerinde belirlenmiş bir mesafe boyunca hareket ettirmeyi ifade eder. Örneğin, oyuncuları bir boşluğa itmek için bir bloku platform üzerinde hareket ettirmek veya bir duvarı yok etmek için ileriye doğru bir roket fırlatmak.
Verse’te FindSweepHits() fonksiyonunu kullanarak objeler arasındaki çarpışmaları sorgulamak için süpürmeleri simüle edebilirsin. Bu fonksiyon, bir objeyi süpürmeyi simüle etmek için bir yer değiştirme vektörü alır. Üst varlıkla veya belirli bir çarpışma etki aktörüyle süpürmeler yapabilir ve süpürmenin başlatılacağı başlangıç global dönüşümünü belirtebilirsin.
FindSweepHits() fonksiyonu, bir sweep_hit listesi döndürür. Her sweep_hit sana, bileşen veya bölge isabeti ve süpürmeyi yapan kaynak bölge veya bileşen gibi bir overlap_hit ile aynı bilgileri verir. Ayrıca temas konumu, normal, yüz normali ve süpürme üzerinde isabetin gerçekleştiği mesafe hakkında bilgiler verir.
Aşağıdaki örnek, bir varlığı alıp FindSweepHit()’i çağırarak İleri değeri için 1000,0 uzunluğunda bir vektör iletir. Kod daha sonra varlığın pozitif İleri yönde 1000,0 birim hareket ettirilmesi durumunda hangi çarpışmaların olacağını simüle eder ve bir sweep_hit listesi döndürür.
Her sweep_hit bir bileşen veya etki aktörü olduğundan TargetComponent veya TargetVolume değerini sorgulayarak hangi tür olduğunu öğrenebilirsin. İsabet bir bileşense kod, bileşenin üst varlığını alır. Son olarak varlığın bir ışık bileşenine sahip olup olmadığını kontrol eder. Sahipse ışığın rengini mavi yapar.
for:
# Simulate sweeping this entity 1000 units in the positive X direction, and return any components and volumes it overlaps with.
SweepHit : Entity.FindSweepHits(vector3{Left := 0.0, Up := 0.0, Forward := 1000.0}, Entity.GetGlobalTransform(), CollisionBox)
# Check that the overlap is a component, and if so get its parent entity.
# Then if the entity has a light component, change its color filter.
TargetComponent := SweepHit.TargetComponent
TargetEntity := TargetComponent.Entity
LightComponent := TargetEntity.GetComponent[light_component]
do:
Bu kod, küp varlığını pozitif X yönünde 1000,0 birim kadar süpürmeyi simüle eder ve etki aktörünün çakıştığı tüm bileşenleri döndürür. Ardından çakışan bileşenin üst varlığını alır ve üzerindeki tüm ışık bileşenlerini maviye çevirir. İsabet listesinin süpürme yapan varlığı içermediğini, dolayısıyla küpün maviye dönmeyeceğini unutma. En sağdaki kırmızı koni varlığı da süpürmenin dışında olduğu için maviye dönmez.
Sıradaki örnek, önceki örnek ile benzerdir ancak önce bir collision_box etki aktörü oluşturur ve ardından onu, küp varlığının merkezinden başlayarak pozitif İleri yönde 1000,0 birim kadar taramak için kullanır. Süpürme başladığında küp collision_box içinde olduğundan sweep_hits listesine dahil edilir ve ayrıca maviye döner.
# Define a volume to sweep over entities.
# This box is 1/4th the size of a standard 512x512 grid tile.
CollisionBox:collision_box = collision_box:
Extents := vector3:
Left := 128.0,
Up := 128.0,
Forward := 128.0
for:
# Simulate sweeping the CollisionBox 1000 units in the positive X direction, and return any components and volumes it overlaps with.
SweepHit : Entity.FindSweepHits(vector3{Left := 0.0, Up := 0.0, Forward := 1000.0}, Entity.GetGlobalTransform(), CollisionBox)
Bu kod, sarı kare ile belirtilen bir collision_box etki aktörünü pozitif İleri yönde 1000,0 birim kadar taramayı simüle eder ve etki aktörünün çakıştığı tüm bileşenleri döndürür. Ardından çakışan bileşenin üst varlığını alır ve üzerindeki tüm ışık bileşenlerini maviye çevirir. Süpürme başladığında küp collision_box içinde olduğundan sweep_hits listesine dahil edilir ve maviye döner. En sağdaki kırmızı koni varlığı süpürmenin dışında olduğu için maviye dönmez.
Verse ile Varlıkları Oluşturma ve Kaldırma
Varlık üzerinde RemoveFromParent() çağrısı yaparak sahneden bir varlığı kaldırabilirsin. Üst varlık haline gelen varlık üzerinde AddEntities() çağrısı yaparak sahneye yeni veya daha önce kaldırılmış bir varlık ekleyebilirsin.
Aşağıdaki örnekte Verse bileşeni, my_tag oynanış etiketini taşıyan tüm varlıkları bulur. Bulunan her varlığı üst varlığından ve böylece sahneden kaldırır ve aynı varlığı sahnede tekrar oluşturmak için beş saniye sonra üst varlığına geri ekler.
# Runs when the component should start simulating in a running game.
# Can be suspended throughout the lifetime of the component. Suspensions
# will be automatically cancelled when the component is disposed or the
# game ends.
OnSimulate<override>()<suspends>:void =
# Find all entities tagged and get their parent entity.
for:
TaggedEntity : Entity.GetSimulationEntity[].FindDescendantEntitiesWithTag(my_tag{})
Parent := TaggedEntity.GetParent[]
Aynı şekilde, AddComponents() fonksiyonunu çağırarak ve eklemek istediğin bileşenlerin listesini ileterek bir varlığa bileşenler ekleyebilirsin. Ayrıca varlık üzerinde RemoveFromParent() çağrısı yaparak varlığı kaldırabilir ve bileşen üzerinde RemoveFromEntity() çağrısı yaparak bileşeni varlıktan kaldırabilirsin. Sırasıyla AddEntities() ve AddComponents() ile kaldırılan varlıklar tekrar sahneye geri eklenebilir. Sahneye geri eklediğin kaldırılan bileşenlerin üst varlığını değiştiremezsin.
Prefablar
Projende oluşturduğun prefablar, projendeki Assets.digest.verse dosyasında Verse’e bir sınıf olarak sunulur. Prefabında tanımlanan varlıklar ve bileşenlere, Verse’te bir prefab’da GetEntities() ve GetComponents() çağrıları aracılığıyla erişilebilir.
Prefab sınıfının örneğini oluşturup sahnedeki bir varlığa ekleyerek prefablarının örneklerini oluşturabilirsin. Aşağıdaki örnekte Verse bileşeni, editörde loop_disappearing_platform_prefab adlı bir prefab örneği oluşturur ve sahneye ekler.
# Runs when the component should start simulating in a running game.
# Can be suspended throughout the lifetime of the component. Suspensions
# will be automatically cancelled when the component is disposed or the
# game ends.
OnSimulate<override>()<suspends>:void =
if:
SimulationEntity := Entity.GetSimulationEntity[]
then:
# Create an instance of the disappearing on loop platform from its prefab.
DisappearingPlatform:disappearing_platform_prefab = disappearing_platform_prefab{}
Örnek Uygulamalar ve İpuçları
Verse’te kendi bileşenlerini oluştururken aşağıdaki örnek uygulamaları ve ipuçlarını aklında bulundur:
Diğer bileşenlere bağımlı olan Verse bileşenleri genellikle aynı varlık üzerinde olmalıdır.
Bileşenler her karede gerçekleşen fizik öncesi ve fizik sonrası tik olaylarını ortaya çıkarır. Bunun yapılması, fizikler uygulanmadan önce dönüşümü değiştirmek gibi veya fizikler uygulandıktan sonra objelerin konumlarını okumak gibi belirli bir mantığı gerçekleştirmen gerektiğinde faydalıdır.
Fizik öncesi veya fizik sonrası olaylara özellikle ihtiyacın yoksa belirli bir mantığa dayalı olarak zaman akışını kontrol etmek için Verse eşzamanlılık ifadelerini kullanmaya devam edebilirsin. Daha fazla ayrıntı için Zaman Akışı ve Eşzamanlılık bölümüne göz at.
Bileşen yaşam süresi fonksiyonları, cihaz yaşam sürelerinden farklıdır. Bileşen mantığı hem düzenleme hem de oynatma modunda çalışır. Bileşen mantığının yalnızca oyun başladığında çalışmasını istersen bir Verse cihazının
OnBegin()fonksiyonunda prefablar oluşturabilirsin.