Bu Scene Graph özelliği deneysel durumdadır. Scene Graph’taki bu deneysel özelliklere erişmek için Proje Ayarları’nda kutuyu işaretleyerek Deneysel Scene Graph Özellikleri ayarını etkinleştir.
Projen deneysel Scene Graph özellikleri içeriyorsa bunlar İçerik Üreticisi Portalı’ndaki doğrulama işlemi sırasında yakalanır. Adanı yayınlamanı kısıtlayan öğeler hakkında bir bildirim alırsın. Adanı yayınlamak için Proje Ayarları’ndaki deneysel özellikleri devre dışı bırak.
Scene Graph, tüm varlıklarda ve bileşenlerde bulunan, Scene Graph’inde Sahne Olayları adı verilen ayrı olaylar veya bir olaylar zinciri oluşturma özelliğine sahiptir. Sahne olayları, bir Scene Graph’in farklı parçalarının varlıklar ve bileşenler için davranışları geçersiz kılıp yeni davranışlar tanımlayarak birbirleriyle konuşmalarını sağlayan iletişim protokolleridir.
Sahne olaylarını projelerin arasında tekrar kullanabilirsin. Ek olaylar ekleyerek veya bir olay zincirindeki varlıkların ve bileşenlerin davranışını biraz daha farklı bir şey yapacak şekilde değiştirerek sahne olaylarını genişletebilirsin.
Tek bir sahne olayına birden fazla bileşen yanıt verebilir ve olaylar Sahne Grafiği hiyerarşisinde yukarıya veya aşağıya gönderilebilir. Bunları, Scene Graph genelinde aktarılan, böylece her bileşenin mesaja tepki verebildiği mesajlar olarak düşünebilirsin.
Örneğin, Scene Graph kullanarak bir mezarlık kurduysan statik örgü mezarlık kapıları açıldığında başlayan bir olaylar zincirini tanımlamak için sahne olaylarını kullanabilirsin. Kapıların açılması, hayalet parçacık efektinin mezar taşlarının arkasından uçmasına ve ürkütücü bir müziğin başlamasına yol açan bir olaylar zincirinin başlangıç noktası olabilir.
Bu, mezarlıkta birden fazla kez kullandığın bir sahne olayı olabilir veya sahne olayının temel fonksiyonlarını kullanabilmek için olayda ince ayarlamalar (açılan ve bunu takip eden bir dizi olaya neden olan bir statik örgü kapı gibi) yapabilirsin.
Sahne olayları, Scene Graph parçalarını birbirinden ayırmaya dayalıdır; böylece doğrudan birbirlerine bağlanmaksızın mesajlar aracılığıyla iletişim kurmalarına olanak sağlanır.
Sahne Olayları nasıl çalışır?
Scene Graph genelinde belirli varlıklara ve bileşenlere olay yayınlamak için Verse kullanılır. Bir component’teki bir sahne olayını işlemek için component içindeki mevcut OnReceive(scene_event):logic fonksiyonu geçersiz kılınır. Bileşenden geçen her sahne olayı bu fonksiyonu çağırarak olaya tepki vermen için bir yol sağlar.
Sahne olayı, scene_event arayüzünü uygulayan herhangi bir sınıftır. Sahne olayları şu üç yoldan biriyle gönderilebilir: SendUp, SendDown veya SenoDirect.
SendUp
SendUp, olayı hedeflenen varlığa ve onun üst varlığına gönderir. Ardından üst varlık, dünyandaki varlıkların üst öğesi olan Simülasyon Varlığına ulaşana kadar bu olayı kendi üst varlığına aktarır.
Gönderici, olayı tam olarak hangi alıcının işleyeceğini veya olaya herhangi bir şeyin tepki verip vermeyeceğini bilemez. Bu tür gönderme, telemetri göndermek, daha üst seviye sistemlere sinyal göndermek veya işlenebilecek ya da işlenemeyecek çeşitli türlerde istekler için çok uygundur.
Örneğin bir karakterin, hiyerarşide daha aşağıda olan ayaklarına bir kılıçla vurduğunu hayal et. Bacak, hasarı hiçbir şekilde işlemeyebilir, bu nedenle olay, karakterin hasar olayını alabilen ve isabeti işleyebilen bir damage_receiever_component yerleştirmiş olduğun temel varlığına kadar yayılır.
Aşağıdaki diyagramda üst varlık, ilk yeşil varlıkta tetiklenen 1 olarak etiketlenmiş olaydır. SendUp çağrısı, hiyerarşideki üst varlık üzerinde başlar ve olayı yukarıya doğru simülasyon varlığına gönderir.
SendDown
Alternatif olarak, simülasyon varlığını hızlandırıcı olarak kullanabilir ve bir dizi değişikliği varlıklar ağacından aşağıya doğru gönderebilirsin. SendDown, olayı hedeflenen varlığa ve tüm alt öğelerine gönderir. Her alt öğe daha sonra bu olayı kendi alt öğelerine iletir.
Bu, global bir olayın meydana geldiği ve sahnedeki her şeyin buna tepki verme fırsatına sahip olması gereken bir durumda kullanılabilir.
SendDirect
SendDirect, bir olayı doğrudan hedeflenen varlığa gönderir fakat olayı üst veya alt varlıklara iletmez. Bu fonksiyon, aşağıdaki diyagramda gösterildiği gibi belirli bir varlığı veya bileşeni doğrudan hedeflemek için kullanılır.
Olayları Tüketme
Bir varlık hiyerarşisinin yukarısına veya aşağısına bir olay gönderilirken, bireysel bileşenler olaya tepki vermemeyi seçebilir. Bileşen, olayı tamamlandı olarak işaretler ve esasen bir kapatma anahtarı rolü oynayarak olayı alt veya üst varlıklarına göndermez.
Olayları tüketme, bir olayın efekt kapsamını kontrol etmene olanak sağlar. İki şekilde çalışır:
Olayı varlığın alt veya üst öğeleriyle değil, yalnızca bir varlıkla ilgili hale getirir.
İlgili olayı doğrudan bir varlığın alt öğelerine veya üst öğelerine göndermekten kaçınır.
Bir alt öğeye veya üst öğeye olay göndermekten kaçınarak, varlığın üst öğeleri ve alt öğeleri için bu olayın ne anlama geldiğine karar verebilir ve varlıkların bu başlangıçtaki olaya nasıl tepki vereceği üzerinde daha fazla kontrol sağlamak amacıyla bunu, onlara manuel olarak farklı bir olay göndermek için kullanabilirsin.
Örneğin, bir varlık SendDown aracılığıyla bir hasar olayı alır. Bir varlık üzerindeki bir bileşen, buna canı alarak tepki vermeye karar verebilir ve alt varlıkların hasar alması gerekli olmadığından bu olayı varlık hiyerarşisinde daha ileriye göndermez.
Ancak, alan varlık üzerinde bir puanlama sisteminin geçerli olduğu durumlarda rakip takıma hasar veren oyuncuya madalya vermek için varlık üst zincirine hasar bilgilerini göndermesi gerekir. Bu durumda, alıcı varlıkta, puanlama bilgisini dinleyerek hasar puanını bir üst bileşene gönderen özel bir olayla bir SendUp çağrısı kullanılabilir.
SendUp ve SendDown Sırasında Olayları Tüketme
Olaylar, bir bileşenin OnReceive(SceneEvent:scene_event):logic uygulamasından true değeri döndürülerek SendUp veya SendDown tarafından tetiklenen olay yayılımı sırasında tüketilebilir.
Bir varlıktaki herhangi bir bileşen, SendUp sırasında bir olayı tüketmeyi seçerse varlıktaki tüm bileşenler yine de kendi ilgili OnRecieve geri çağrılarını yapar. Bu durumda yayma durur ve varlığın üst öğesine iletilmez.
Bir varlıktaki herhangi bir bileşen, SendDown sırasında bir olayı tüketmeyi seçerse varlıktaki tüm bileşenler yine de kendi ilgili OnRecieve geri çağrılarını yapar. Olay, varlığın alt öğelerine iletilmez. Ancak olay yine de aynı seviyedeki geri kalan varlıklara iletilir.
Aşağıdaki diyagramda, sahne olayı 4 olaylar zincirinde aşağıya doğru iletilmeye devam ederken, sahne olayı 3’ün devam etmediğini göreceksin.
Sahne Olayı Oluşturma
Sahne olaylarını oluşturmadan önce yapılması gereken bazı başlangıç ayarları ve sekans işleri vardır. Örgü bileşenlerini ağaçlarla ve uygun efektleri içeren parçacık efektleriyle doldurmak için aşağıda listelenen öğeleri derle. Parçacık efekti öğelerini kaydettiğinde, bunlar otomatik olarak Assets.digest.verse adlı bir Verse dosyasına, kodunda referans verebileceğin Verse objeleri olarak kaydedilir.
Yıldırımların bir varlık üzerindeki gökyüzünde rastgele bir noktada başlaması ve yerdeki bir Scene Graph varlığında bitmesi için yıldırım görsel efektini aşağıdaki gibi değiştir:
Işın Oluşturucu Kurulumu > Işın Başlangıcı seçeneğini Pozisyona Vektör Ekle olarak ayarla, Pozisyon seçeneğini SimulationPosition olarak ayarla, Vektör ayarını Rastgele Aralıkta Vektör olarak seçip Minimum değerini (-200,0, -200,0, 1000) ve Maksimum değerini (200,0, 200.0, 2000.0) olarak belirle.
Işın Oluşturucu Kurulumu > Işın Sonu seçeneğini SimulationPosition olarak ayarla.
Artık yıldırım, varlığın üzerinde, gökyüzünde bir yerde başlayacak ve
particle_system_componentöğesinin eklendiği varlıkta sona erecektir.Statik Örgü Ağaçlar ve Çimen
Modelleme Modu ile kendi ağaçlarını modelle.
Bu öğeleri varlıklara ekle, ardından Scene Graph genelinde yıldırımın düşebileceği yerlere birden fazla Yıldırım Hedefi varlığı yerleştir. Bu Yıldırım Hedefi varlıklarının her biri, sahne olayında tanımladığın talimatları almaya hazır bir yıldırım particle_system_component’a sahiptir. Ek bir kurulum gerekmez.
Varlıklar bir prefab’da iç içe yerleştirilebilir veya sahnede tamamen ayrı ve dağınık olabilir.
Ateş görsel efekti oluşturmak için UE Başlangıç İçeriği paketinden öğeler taşıyabilirsin veya UE’de Yıldırım ve Ateş görsel efektlerini (VFX) oluşturup bu varlıkları UEFN projene taşıyabilirsin.
Sahneye varlıkları eklemeden önce tüm öğelerini yap; böylece oluşturduğun tüm statik örgü öğeleri örgü bileşeni menüsünde görünür.
Varlıkları yerleştirdikten sonra orman yangınına neden olan olaylar zincirini hayal et, ardından olaylara, olayın ne yaptığını açıklayan adlar bul. Ardından, Davranışı Kodlama bölümündeki Verse eğitimini takip et.
Sahne Olayı Adlandırma Kuralları
Bir sahne olayının adında istediğin sayıda karakter kullanabilirsin. Adı, olayı açıklamalı ve olayın amacını açık bir şekilde belirtmelidir (örneğin damage_taken_event, health_power_up_event vb.).
Orman yangını olay zincirinde iki ana olay vardır:
Yıldırım Düşmesi
Ateşin Yayılması
Bu olayların ne yaptığını açıklamak için yıldırım olayını struck_by_lightning_event, ateşin yayılma olayını ise fire_propagation_event olarak adlandır.
Olay Zinciri
Bir sahne olayı oluştururken bunu, varlıklardan ve bileşenlerden oluşan bir hiyerarşide yukarı ve aşağı doğru efektlere sahip bir arayüz olarak ele al. Ayrıca, sahne olayları başkaları tarafından da kullanılabildiğinden, başka bir geliştiricinin olayını nasıl geliştirebileceğini veya olayını kendi Scene Graph’inde nasıl kullanabileceğini göz önünde bulundur.
Oluşturduğun sahne olayı, üst olayla ilgili başka bir olayı başlatmadan önce gerçekleşen önemli olayları bildirecektir. Buna göre olay zinciri aşağıdaki gibi olacaktır:
Dünyada
struck_by_lightning_eventadlı bir sahne olayı meydana gelir.Varlıklar,
struck_by_lightning_eventtarafından vurulup vurulmadığını bildirir. Yıldırımın isabet ettiği varlıklar,fire_propagation_event’i tetikler.fire_propagation_event, diğer varlıkların,fire_propagation_event’e tutuşmalarına yol açacak kadar yakın olup olmadıklarına karar vermelerine neden olur.fire_propagation_eventdiğer örgü bileşenlerine yayılır.
fire_propagation_event, fire_propagation_event’e yeterince yakın olduğuna karar veren her örgü bileşeni yanmaya başlayana kadar çalışmaya devam eder. Bu zincir, sahnede işlerken gerçek bir orman yangınını andırmalıdır.
Bir Zinciri Genişletme
struck_by_lightning_event, fire_propagation_event’e yol açarken ateşi yayan yeni şeyler ekleyerek oyunu uzatmayı seçebilirsin. Örneğin, patladığında fire_propagation_event gönderen bir explosive_event ekleyebilirsin.
Sahne olaylarıyla ilgili bir başka ilgi çekici şey de, fire_propagation_event olayını işleyen varlıkların yangına neyin sebep olduğunu bilmesinin gerekmemesi, yalnızca bir şeyin onların yanması gerekip gerekmediğini düşünmelerine neden olmasıdır. Bu, kodu iki nedenden dolayı daha kolay sürdürülebilir hale getirir:
Dünyada
struck_by_lightning_eventadlı bir sahne olayı meydana gelir.fire_propagation_eventolayını dikkate alan varlıkları bozmadan yalnızcastruck_by_lightning_eventolayının davranışı kolaylıkla değiştirilebilir.Bir
explosive_eventyazmak daha kolaydır çünkü yanabilir şeyler yalnızcafire_propagation_eventile ilgilenir.
Davranışın Kodlanması
Scene Graph gerekli tüm varlıklarla tamamlandığında, bir yıldırım düşmesiyle başlayan ve ağaçlar arasında yangın çıkmasına ve yangın hasarına yol açmasına neden olan bir sahne olayı oluşturmak için aşağıdaki kodu kullan.
Assets.digest.verse, sahnede onlara referans vermek üzere Verse objelerini otomatik olarak arar. Oluşturduğun parçacık efektlerine bir VFX (görsel efekt) modülü altında referans verilir.
VFX := module:
Fire_NS<scoped {/InvalidDomain/Scene_Events_Test}> := class<final><public>(particle_system_component):
Lightning_NS<scoped {/InvalidDomain/Scene_Events_Test}> := class<final><public>(particle_system_component):
1. Adım: Bir Scene Graph Bileşeni Oluştur
UEFN’de bir sahne olayı oluşturmak için Menü çubuğundan Verse menüsünü aç ve açılır menüden Verse Gezgini’ni seç. Verse Gezgini paneli editörde açılır; burada projenle ilişkili Verse dosyaların listelenir.
Aşağıdakileri yaparak yeni bir Verse dosyası oluştur:
Listenin en üstündeki proje adına sağ tıkla.
Açılır menüden Projeye yeni Verse dosyası ekle öğesini seç. Verse Kodu Oluştur penceresi açılır.
Verse dosyaları listesinden Scene Graph Bileşeni’ni seç ve dosyayı fire_event_component olarak adlandır.
Oluştur düğmesine tıkla. Dosya, Visual Studio Code (VS Code) içinde otomatik olarak açılır ve yeni bileşen davranışı oluşturmak için gerekli standart API’leri (Uygulama Programı Arabirimi) içerir.
Kodunu test etmeye hazır olduğunda Verse menüsünü aç ve açılır menüden Verse Kodu Derle’yi seç. Daha sonra Verse butonuna tıklayarak kodunu çalıştır.
2. Adım: Verse Kütüphaneleri Ekle
Sahne olayına, ilk olarak yıldırımın düşmesine neden olan olaylar ve koşullar zincirini oluşturarak başla. Yıldırım olayı tanımlandıktan sonra, yangın hasarının özelliklerini, yangın yayma protokollerini ve yangın söndürme protokollerini tanımlayarak orman yangını olayını derle.
Yıldırım ve yangının konumu için mekânsal matematik, eşzamanlılık oluşturma ve diğer Verse özelliklerini kullanabilmek için bileşenine aşağıdaki kütüphaneleri ekle.
Verseusing { /Verse.org/SpatialMath } using { /Verse.org/Random } using { /Verse.org/Concurrency } using { /Verse.org/Simulation } using { /Verse.org/SceneGraph }
Adım 3: Yıldırım Olay Sınıfını Tanımla
Bu olay sınıfı yıldırımın kaynak konumunu, yıldırım isabet konumunu ve isabet konumunun DamageRadius değerini belirler.
struck_by_lightning_event := class(scene_event):adlı bir olay sınıfı oluştur. Sınıf, sahne olayının özelliklerini, konum bilgileri için bir vektör ve yıldırım düşmesinin hasar yarıçapı için birfloat(kayan sayı) değeri kullanarak, yıldırım olayının sahnenin neresinde gerçekleştiğini açıklayan sabit ifadeler içinde tanımlar.Verse# Event to indicate an entity is struck by lightning struck_by_lightning_event<public> := class(scene_event): # Lightning hit location HitLocation:vector3 = vector3{} # Lightning damage radius DamageRadiusCentimeters:float = 100.0
Adım 4: Bir Hava Koşulu Bileşeni Oluştur ve Değişkenlerle Düzenlenebilir Özellikler Ekle
Sahnede yıldırımın görünüp görünmediğini, rastgele yıldırım düşmelerini, düşüşler arasındaki süreyi ve yıldırım düşmesinin hasar yarıçapını belirlemek için düzenlenebilir özellikleri ve değişkenleri kullan.
lightning_weather_component := component ():adlı bileşen sınıfınaeditable(düzenlenebilir) özellikler ekleyerek yıldırımın nasıl davranacağını tanımla. Yıldırım düşmeleri arasındaki süre için düzenlenebilir özelliklerde minimum ve maksimum süreyi ve bu darbelerin santimetre cinsinden hasar yarıçapını belirt.Verse# Component that lives on an entity, and randomly creates lightning strikes lightning_weather_component<public> := class<final_super>(component): # Minimum random time between lightning strikes @editable MinRandomLightningDelaySeconds:float = 10.0 # Maximum random time between lightning strikes @editable MaxRandomLightningDelaySeconds:float = 60.0
Adım 5: Yıldırım Olayını Tanımla
Yıldırım görsel efektini kontrol etmek için bir metot kullan, bu metodun ışın başlangıcı ve sonu özelliklerini kullanarak örgü bileşenlerinin görsel efekte ne kadar yakın olduğunu belirleme ve bu bilgiyi olayın yukarısına ve aşağısına yay.
OnSimulateadlı bir koşullumethodoluştur.VerseOnSimulate<override>()<suspends>:void=Oynatma süresi için minimum ve maksimum gecikme değerlerinden yararlanan bir sabit kullanarak yıldırım bileşenini rastgele oynatan ve durduran bir
loop(döngü) oluşturup ekle.Verseloop: # Sleep for a random delay before next lightning strike RandomDelay := GetRandomFloat(MinRandomLightningDelaySeconds, MaxRandomLightningDelaySeconds) Sleep(MaxRandomLightningDelaySecondsDiğer tüm varlıklar Simülasyon Varlığının alt öğeleri olduğundan simülasyondaki diğer varlıkları bulmak için Simülasyon Varlığını kullanan bir
ififadesi ekle. Bu şekilde, sahnedeki varlıkları bulmak için çarpışma kullanmak yerine yıldırımın düşeceği rastgele bir varlık seçilebilir.Verse# Randomly hit an entity in the world with lightning if (SimEntity := Entity.GetSimulationEntity[]):Bundan sonra, kodun yıldırımın isabet edeceği bir hedef belirlemesi gerekir.
Yıldırım hedefi olma için Simülasyon Varlığından (SimEntity) aşağıya doğru bir istek yayınlayan bir
thenifadesi ekle. Ardından, bu yayına tepki veren ve tepki verebilen tüm varlıkların SimEntity’ye bir olay geri göndermesine neden olan koşullu birififadesi ekle. Bundan sonra, yıldırımın kaynağını bulman gerekecek, çünkü Işın Oluşturucu, ışının başlangıcı ve sonu için iki nokta içeren bir konum kullanır.VerseLightningTargets := for (EntityWithLightning : SimEntity.FindDescendantEntitiesWithComponent(particle_system_component)): EntityWithLightning if: LightningTargets.Length > 0 RandomIndex := GetRandomInt(0, LightningTargets.Length - 1) RandomEntity := LightningTargets[RandomIndex]Bir if ifadesi kullanarak
LightningVFXComponent’ı rastgele konuma çağır. Ardından, kaynak ve hedef konumlar için ayarlanan konumda ışın parçacık efekti oynatan bir then ifadesi ekle.lightning_entity, yıldırım olayını gökyüzündeki rastgele noktalarda oynatmak için Işın Oluşturucu Kurulumu > Işın Başlangıcı’nı kullanır. Bunun ardından,LightningVFXComponent, ışın parçacığının sonunun sahnede nerede görüneceğini Işın Oluşturucu Kurulumu > Işın Sonu ışın parçacığı seçeneğini kullanarak belirler. Bu ayar,lightning_entityiçin parçacık efektinin bitiş koordinatlarını kullanan Simülasyon Konumu olarak ayarlanır.Daha sonra kaynak ve hedef verileri kullanarak örgü bileşeni hedefinde hasarın nerede oluştuğunu belirleyip yıldırım hasarından etkilenen alanı tanımlamak için
DamageRadiusdeğerini kullanarakstruck_by_lightning_event’in verdiği hasarı oluşturup tanımla. Bu olay, rastgele bir yıldırım süresi eklemek için simülasyon varlığına gönderilecektir, bu nedenle olaylar zinciriniSimulationEntity.SendDown(Event)ile sonlandır.Verseif (VFX := RandomEntity.GetComponent[particle_system_component]): RandomDurationOfStrike := GetRandomFloat(MinRandomLightningDurationSeconds, MaxRandomLightningDurationSeconds) VFX.Play() Sleep(RandomDurationOfStrike) VFX.Stop() else: Print("Could not find particle_system_component on this entity") Event := struck_by_lightning_event: HitLocation := Entity.GetGlobalTransform().Translation
Adım 6: Yangın Olayını Tanımla
Sahnede yangının neden olduğu hasar miktarını ve yangın hasarına dayalı olarak yangının yayılıp yayılmayacağını tanımlayan olay sınıfları oluştur.
İki sınıf oluştur. Bir
fire_damage_eventsınıfı ileDamageAmount’un gerçekleşip gerçekleşmediğini kontrol eden veDamageAmountkayan sayı eşiğine ulaştığında yangın parçacığını oynatan birfire_propagation_eventsınıfı.Verse# Event indicating an entity was damaged by fire fire_damage_event<public> := class(scene_event): BurningEntity:entity = entity{} DamageAmount:float = 100.0 # Event indicating an entity propagates fire fire_propagation_event<public> := class(fire_damage_event): FireRadiusCentimeters:float = 100.0Bir örgünün yanıcı olmasını ve sahnedeki örgülerin tutuşmasına neden olacak şekilde ayarlanabilecek düzenlenebilir özellikleri belirleyen bir
structured_componentsınıfı oluştur.Verse# Component that makes something flammable flammable_component<public> := class<final_super>(component): # Fire damage amount applied every second @editable FireDamageAmount:float = 10.0 # Fire tries to propagate on this interval @editable FirePropagationIntervalSeconds:float = 10.0flammable_event’e, ateş görsel efektlerinin oynatılıp oynatılmadığına veya oynatılması gerekip gerekmediğine karar veren koşullu bir değişken ekle.Verse# Is it on fire? var IsOnFire:logic = falseBir
IsCloseEnoughToBurningEntityToIgnitefonksiyonu, ateşin başka ateş görsel efekt olaylarını tetikleyecek kadar yakın olup olmadığını belirler.Verse# Is this component close enough to the source of a fire propagation event to burst into flames? IsCloseEnoughToBurningEntityToIgnite(FirePropogationEvent:fire_propagation_event)<decides><transacts>:void = EntityLocation := Entity.GetGlobalTransform().Translation FirePropogationLocation := FirePropogationEvent.BurningEntity.GetGlobalTransform().Translation DistanceToFire := Distance(EntityLocation, FirePropogationLocation) DistanceToFire <= FirePropagationEvent.FireRadiusCentimetersBir
IsCloseEnoughToLightningToIgnitefonksiyonu, yıldırımın örgüye, örgünün tutuşmasına neden olacak kadar yakın olup olmadığını belirler.Verse# Is this component close enough to a lightning strike to burst into flames? IsCloseEnoughToLightningToIgnite(LightningEvent:struck_by_lightning_event)<decides><transacts>:void = EntityLocation := Entity.GetGlobalTransform().Translation LightningStrikeLocation := LightningEvent.HitLocation DistanceToFire := Distance(EntityLocation, LightningStrikeLocation) DistanceToFire <= LightningEvent.DamageRadiusCentimetersIsCloseEnoughToBurningEntityToIgnite fonksiyonu yangın yayılma yakınlığını belirledikten ve IsCloseEnoughToLightningToIgnite değişkeni de yıldırım düşmesinin örgüye yakınlığını belirledikten sonra, OnRecieve fonksiyonu hangi örgülerin tutuşacağını belirler.
Verse# Receive scene events OnReceive<override>(SceneEvent:scene_event):logic = # Burst into flames if lightning hit close enough if (LightningEvent := struck_by_lightning_event[SceneEvent], IsCloseEnoughToLightningToIgnite[LightningEvent]): Ignite() # Burst into flames if something close enough is burning if (FireEvent := fire_propagation_event[SceneEvent], IsCloseEnoughToBurningEntityToIgnite[FireEvent]): Ignite() falseYangın parçacık sistemini arayan bir koşullu if ifadesi aracılığıyla efekti otomatik olarak oynatmak için bir
Ignitemetodu kullanılır. Bileşenin yangın görsel efekti oynatıyor olup olmadığı, birthenifadesi tarafından tanımlanır.Çağrıldığında yangın çıkması ve yayılması için Fire_NS yangın parçacık sistemini kontrol etmek üzere metoda asenkron görevler ekle.
Verse# Burst into flames Ignite():void = if (not IsOnFire?): set IsOnFire = true # Add a new fire VFX component FireVFX := VFX.Fire_NS{Entity := Entity} Entity.AddComponents(array{FireVFX}) # Spawn async tasks to implement the state of being on fire
Adım 7: Yangın Sonu Olayını Tanımla
Bundan sonra örgü bileşenlerinin ne zaman tutuştuğunu, alevlerin ne zaman söndüğünü, yangının yol açtığı hasarı ve yangının ne zaman yayılacağını belirleyen bir dizi metot oluşturacaksın.
Şimdi, yangın parçacığı sistemini bulmak ve efekti kaldırmak için koşullu metotlar kullanarak yangın efekti oynatan bileşenleri arayan ve yangın efektini durduran bir
Extinguishmetodu oluştur.Verse# Put out the flames Extinguish():void= if (IsOnFire?): set IsOnFire = false # Remove the fire VFX component if (FireVFX := Entity.GetComponent[particle_system_component]): FireVFX.RemoveFromEntity()FireDamage’ı izleyen ve olayı varlık zincirinde olayın sonuna doğru gönderen ve olayın oynatılmasını durdurmasına neden olan bir döngü kullanan birOnFiremetodu oluştur.Verse# Suspends function called when we're on fire OnFire()<suspends>:void= # Damage self every second loop: # Fill out a fire damage event - replace this with whatever properties should go here FireDamage := fire_damage_event: DamageAmount := FireDamageAmount Entity.SendDown(FireDamage) Sleep(1.0)Son olarak, yangını varlıklar zinciri boyunca aşağı doğru yaymak için bir
loopkullanan ve simülasyon varlığına ulaştığında sönmesine neden olan birFirePropagationmetodu oluştur.Verse# Propagate fire to other entities FirePropagation()<suspends>:void= loop: Sleep(FirePropagationIntervalSeconds) if: SimulationEntity := Entity.GetSimulationEntity[] FirePropagationEvent := fire_propagation_event{ BurningEntity := Entity } then: # Broadcast fire propagation event down from simulation entity SimulationEntity.SendDown(FirePropagationEvent)
Kod tamamlandığında kodu derle ve yıldırım düşmeleri ile orman yangını efektlerini desteklemek için uygun varlıkları Scene Graph’e ekle. Daha sonra structured_component bileşenini sahnedeki tutuşması gereken varlıklara ekle. Simülasyon varlığının altında, hava koşullarını kontrol eden lightning_weather_component’a sahip bir en üst seviye varlık olması gerekir.
Tüm varlıklar uygun sahne olaylarıyla güncellendikten sonra kodunun sahnede çalıştığını görmek için bir Canlı Düzenleme oturumu başlat.
Sonuç
Sahne olayının çalışmasını görmek için kodu kopyalayıp projene yapıştır.
lightning.verse
using { /Verse.org }
using { /Verse.org/Native }
using { /Verse.org/Random }
using { /Verse.org/SceneGraph }
using { /Verse.org/Simulation }
using { /Verse.org/SpatialMath }
# Event to indicate an entity is struck by lightning
struck_by_lightning_event<public> := class(scene_event):
fire.verse
using { /Verse.org }
using { /Verse.org/Native }
using { /Verse.org/SceneGraph }
using { /Verse.org/Simulation }
using { /Verse.org/SpatialMath }
# Event indicating an entity was damage by fire
fire_damage_event<public> := class(scene_event):
BurningEntity:entity = entity{}
DamageAmount:float = 100.0