Bu eğitim Verse Stand-Up şablonu için yardımcı bir belgedir ve bir komedi kulübünde sosyal ve sinematik deneyimi destekleyen aşağıdaki cihazların nasıl kullanılacağını gösterir:
Karakter cihazları ile ayrıntılı MetaHumans Animatörü öğelerini kullanma
Girdi Tetikleyici cihazları ile oyuncu girdisi bağlamalarında oynanış olaylarını tetikleme
Koltuk cihazı ile deneyimi görüntülemek için oyuncuyu yerinde sabitleme
Gösteri bir Verse cihazı tarafından yürütülür ve Verse kodunun temel kavramları aşağıda açıklanmaktadır.
Verse Stand-Up şablonunu UEFN’in (Fortnite İçin Unreal Editor) Öne Çıkan Örnekler bölümünde bulabilirsin.
Kullanılan cihazlar:
1 adet Koltuk
4 adet Girdi Tetikleyici
4 adet Karakter
6 adet Sinematik Sekans
Bu eğitimde kullanılan Verse kavramları şunlardır:
Abonelikler
If İfadeleri
Diziler
Sinematik Sekanslar
Koltuk cihazı API'si
Girdi Tetikleyici cihazı API’si
Cihaz etkileşimleriyle ilgili değiştirilen ayarların çoğunun Verse kodu kullanılarak yapıldığını, bu nedenle çoğu cihaz için değiştirilen kullanıcı seçeneklerinin daraltılmış şekilde görüneceğini unutma.
Ada Ayarları
Verse Stand-Up şablonu için değiştirilen Ada Ayarları şunlardır:
| Seçenek | Değer | Açıklama |
|---|---|---|
Maksimum Oyuncu Sayısı | 1 | Bu, tek oyunculu bir deneyimdir. |
Takım Boyutu | 1 | Sadece bir takım gereklidir. |
Sürmekte Olan Oyuna Katılma | İzle | Oyuncular önceden başlamış olan bir oyuna katılırsa seyirci olur. |
Son Kez Doğduktan Sonra Şuraya Git: | Takım Dizini: 1 | Oyuncular kendi takımlarında yeniden doğar. |
Sesli Sohbet | Hepsi | Oyuncular arasında sesli sohbete izin verilir. |
Kazmayla Başla | False | Oyuncular oyuna bir kazmayla başlamaz. |
Diğer Takımları Seyretmeye İzin Ver | İzin Verilmemiş | Oyuncular diğer takımları seyredemez. |
Süre Sınırı | 120 | Süre sınırı iki saat olarak belirlenir. |
Sırt Süsleri Gizlensin | True | Bu adada sırt süsü görünmeyecek. |
Tırmanmaya/Engellerden Atlamaya İzin Ver | False | Oyuncular engellerin üzerinden atlayamaz veya tırmanamaz. |
Depar Atmanın Saniyede Harcayacağı Enerji Bedeli | 2,0 | Depar atmayla harcanan enerji bedeli. |
Yenilmezlik | True | Oyuncular yenilmez. |
Yapı İnşasına İzin Ver | Yok | Oyuncular yapı inşa edemez. |
İnşa Ederken Çevreyi Yık | False | Yapı inşası çevreye hasar veremez. |
Çevre Hasarı | Kapalı | Oyuncular çevreye hasar veremez. |
Sınırsız Yapı Malzemesi | False | Bu deneyimde yapı inşası devre dışıdır. |
Ada Saati | 12:00 ÖÖ | Gece saati ayarı. |
Işık Parlaklığı | 0 | Bu deneyimdeki tüm ışık kaynakları lambalardan yayılır. |
Sis Yoğunluğu | %30 | Ortam hafif sislidir. |
Sis Rengi | Mavi | Sis rengini belirler. |
Özel Zafer Duyurusu | The Cheese Cannery’ye geldiğiniz için teşekkür ederiz | Oyuncuların oyunu bitirdikten sonra gördüğü mesaj. |
Avlama Akışını Göster | False | Avlamalar gösterilmez. |
Ahşap/Taş/Metal Kaynak Sayısını Göster | False | Kaynaklar gösterilmez. |
Grup Avlamalarını Göster | False | Grup avlamaları gösterilmez. |
Hata Ayıklama | True | Hata ayıklama özellikleri etkindir. |
Hızlı Yineleme Modu | True | Düzenleme ve Oynatma Modu arasında Hızlı Yineleme etkindir. |
Koltuk Cihazı
Oyuncu komedi kulübüne girerken ışıklı bir sahnenin önünde bir koltuk görür. Bu koltuğa oturması istenir. Koltuğa oturmak, oyuncuyu sabit bir konumda tutar ve onu deneyim boyunca taşıyacak olaylar zincirini harekete geçirir.
Koltuk cihazı için değiştirilen Kullanıcı Seçenekleri şunlardır:
| Seçenek | Değer | Açıklama |
|---|---|---|
Koltuk Modeli | Özel | Bu deneyim için koltuk aslında görünmez hale getirildi ve ardından kulüp ortamına daha iyi uyumlu olması için Fortnite koltuk nesnesiyle değiştirildi. |
Etkileşim Açısı | 180 derece | Koltukla etkileşim kurmak için gereken, koltuğun önünde her iki yöndeki açıyı belirler. |
Etkileşim Yarıçapı | 1,2 m | Oyuncunun koltuğa oturabileceği mesafeyi belirler. |
Girdi Tetikleyici Cihazları
Koltuk cihazının beraberinde bir Girdi Tetikleyici cihazı bulunur. Oyuncu girdilerini, oyuncunun yeniden atanan düğmeye basmasıyla tetiklenen çeşitli eylemlere bağlar. Girdi tetikleyiciler, performans gerçekleşirken oyuncunun kamera değiştirmesine izin verecek şekilde yapılandırılmıştır.
Cihaz, aralarından seçim yapılabilecek on iki kullanılabilir girdi içerir. Bir girdi seçtikten sonra, yeni girdinin ne yaptığını netleştirmek için bir gösterge paneli açıklaması ekleyebilirsin.
Bu cihaz için aşağıdaki Kullanıcı Seçenekleri değiştirilmiştir. Her cihaz farklı Sinematik Sekans cihazlarına bağlı olduğundan farklı bir bağlamaya ve Gösterge Paneli Açıklamasına sahip olacaktır.
| Seçenek | Değer | Açıklama |
|---|---|---|
Kreatif Girdisi | Özel 5 (Depar Atma) | Bu cihazın dinlemekte olduğu girdiyi tanımlar. |
Gösterge Paneli Açıklaması | “Önceki Kamera” | Oyuncuya yeni girdiyi açıklama fırsatı verilir. |
Kayıtlı Oyuncu Davranışı | Kayıt İste |
|
Karakter Cihazları
Karakter cihazları, oyuncuyla veya bir sahnedeki diğer karakterlerle doğrudan etkileşim kurmak için bir yol sağlar. Bu şablonda, sahnedeki rutin sırasında birbirinin yerini alan dört karakter kullanılıyor.
Karakter cihazı için aşağıdaki **Kullanıcı Seçenekleri** değiştirilmiştir:
| Seçenek | Değer | Açıklama |
|---|---|---|
Karakter | Bir karakter seç | Hangi karakterin gösterileceğini belirler. |
Özel Bekleme Pozu | Oturuyor | Karakter için özel bir bekleme konumu seçer. |
Rastgele Bekleme Başlangıcı | True | Bekleme animasyonunun rastgele bir pozisyonda başlayıp başlamayacağını belirler. |
Ana karakter sahne arkasında merdivende oturuyor, diğer karakterler arkadaki küçük bir odada bekliyor.
Karakter açılır menüsünden farklı karakter dış görünümlerini dene ve sahnede nasıl göründüklerine bak!
Bu şablon, içe aktarılan MetaHuman animasyonlarını kullanır. Bu animasyonların nasıl kaydedildiği ve içe aktarıldığı konusunda daha fazla bilgi edinmek için MetaHuman Animasyonlarını İçe Aktarma sayfasına bakabilirsin.
Sinematik Sekans Cihazları
Altı Sinematik Sekans cihazı, oyuncunun koltuk cihazında otururken gösteriyi çeşitli açılardan izlemesine olanak sağlar.
Bu eğitimde sinematik sekansların oluşturulmasıyla ilgili ayrıntılara girilmiyor. Daha fazla bilgi almak için Sequencer ve Control Rig sayfasına bakabilir ve daha derin bir kavrayış için Unreal Engine’de Film Nasıl Yapılır? sayfasını inceleyebilirsin.
Bu cihazdaki tek değişiklik, yüklenen si̇nemati̇k sekanstır.
Verse Gösteriyi Nasıl Yürütür?
Bu şablon, bir oyuncu koltuk cihazına oturduğunda gösteriyi başlatmak ve oyuncunun kamerasını TV modu adı verilen bir sinematik görünüme geçirmek için Verse kullanır. Ayrıca oyuncunun birden fazla kamera arasında geçiş yapmasına ve farklı izleme deneyimleri için TV modu veya Serbest Bakış görünümlerine dönmesine izin verir.
Verse Gezgini‘ni kullanarak projende show_template_device.verse adlı yeni bir Verse cihazı oluştur ve cihazı şablona sürükle. Verse dosyana çift tıklayarak dosyayı Visual Studio Code ile aç.
Şablonunda stand-up gösterisinin yürütülmesine yardımcı olacak cihazları kurmuştun; şimdi de kodunda bu cihazlara referans vereceksin.
show_template_device dosyasına aşağıdaki alanları ekle:
İlk olarak
show_template_devicesınıf tanımının üzerinelog_show_template_deviceadlı birlog_channelekle.Verse# Create a custom log channel for the show_template_device. This helps with log filtering in complex games with lots of log sources. log_show_template_device := class(log_channel){} # A Verse-authored creative device that can be placed in a level show_template_device := class(creative_device):Şimdi
show_template_devicesınıf tanımının en üstüne,log_show_template_devicekanalını kullanan bir günlük kaydedici ekle. Böylece hangiPrint()ifadesinin bu cihazdan geldiğini anlayabilirsin.Verse# A Verse-authored creative device that can be placed in a level show_template_device := class(creative_device): # Logger that uses custom log channel. Logger:log = log{Channel := log_show_template_device}TheChairadlı düzenlenebilir koltuk cihazı. Bu, stand-up gösterisini başlatmak için oyuncuların oturacağı koltuktur.Verse# The chair device the player should sit in. @editable TheChair:chair_device = chair_device{}MainSequenceveTVModeSequenceadlı iki düzenlenebilir sinematik sekans cihazı.MainSequence, bölümdeki karakter cihazında animasyonu ve sesi yöneterek stand-up gösterisini yürüten sinematik sekanstır.TVModeSequence, oyuncunun kamerasınıMainSquenceile beraber birden fazla açı arasında geçiş yapan bir izleme moduna geçirir.Verse# The sequence that drives animation and audio on the character device in the level. @editable MainSequence:cinematic_sequence_device = cinematic_sequence_device{} # The sequence that drives the TV mode sequence for viewing in the level. @editable TVModeSequence:cinematic_sequence_device = cinematic_sequence_device{}CameraSwitchesadlı düzenlenebilir bircinematic_sequence_devicedizisi. Bu dizi, oyuncuların gösteri sırasında geçiş yapabileceği her kameraya referansları tutar.Verse# A list of alternative camera sequences that are provided to view from during the main sequence. @editable CameraSwitches:[]cinematic_sequence_device = array{}Dört adet düzenlenebilir
input_trigger_device. Bu cihazların her biri, farklı kamera modları arasında geçiş yapmak için oyuncu girdisi alır.ReturnToFreeLooktetikleyicisi oyuncuyu varsayılan kameraya döndürürkenReturnToTVModeoyuncuyuTVModeSequence’a geri döndürür.NextCameravePreviousModekamerası, oyuncununCameraSwitchesdizisindeki farklı si̇nemati̇k sekanslar arasında geçiş yapmasını sağlar.Verse# An input trigger that will return us to free look while in the chair. @editable ReturnToFreeLook:input_trigger_device = input_trigger_device{} # An input trigger that will return us to TV mode when appropriate in the chair. @editable ReturnToTVMode:input_trigger_device = input_trigger_device{} # An input trigger that will choose the next camera while in the chair. @editableCurrentSequenceadlı isteğe bağlı bir si̇nemati̇k sekans cihaz değişkeni.TVModeSequencegibi bir sinematik sekans oynatılıyorsa bu seçenek onun bir referansını depolar. Karakter için aynı anda birden fazla si̇nemati̇k sekans oynatmak istemeyiz; bu nedenle yeni bir sekansa geçerken mevcut sekansı kapatmak için bu seçeneği kullanabilirsin.Verse# The alternative camera sequence that is playing if valid. var CurrentSequence:?cinematic_sequence_device = falseMainSequencePlayingveInTvModeadlı iki logic değişkeni. Bunlar sırasıylaMainSequenceveyaTVModeSequencesekanslarının ne zaman oynatıldığını takip etmeni sağlar.Verse# Helps us track when the main sequence on the character device is playing. var MainSequencePlaying:logic = false # When we are in TV mode. var InTVMode:logic = falseCurrentCameraIndexadlı bir değişken tamsayı.CameraSwitchesdizisindeki şu anda oynatılmakta olan sinematik sekansın dizinini takip eder.Verse# Keeps track of what camera we are viewing when using other cameras besides TV Mode. var CurrentCameraIndex:int = -1Bu şablonda referans verilen tüm olaylar için bağlanmaları izleyen beş adet isteğe bağlı
cancelabledeğişkeni. Oyuncu kameralar arasında geçiş yaptığında serbest bakışa veya TV moduna döndüğünde veya koltuk cihazından çıktığında farklı fonksiyonların yürütülmesi gerekir. Bu eğitimin ileriki bölümlerinde fonksiyonları onları tetikleyen olaylara bağlayacak ve her bağlama için bir referans depolayacak, böylece artık gerekmediklerinde bunları iptal edebileceksin.Verse# Subscriptions to all the events we listen for while running. var ReturnToFreeLookSubscription:?cancelable = false var NextCameraSubscription:?cancelable = false var PrevCameraSubscription:?cancelable = false var ReturnToTVModeSubscription:?cancelable = false var ChairExitSubscription:?cancelable = falseKodu Visual Studio Code’a kaydet ve bölümdeki Verse ile yazılan cihazını güncellemek için kodunu derle.
Şablonunda
show_template_devicecihazını seç. Ayrıntılar panelinde, kodundaki her bir cihaz referansını, girdi tetikleyicilerin ve si̇nemati̇k sekansların dahil olmak üzere bölümdeki ilişkili cihaza ata.
Sekansın Tetiklenmesi
Bir oyuncu koltuk cihazına oturduğunda gösteri başlar; oyuncu oturduğunda sinematik sekansın başlaması gerekir. Bir oyuncu koltuğa oturduğunda ana sekansı tetiklemek için aşağıdaki adımları takip et, aynı zamanda oyuncunun izleyebilmesi için TV modunu başlat.
show_template_devicesınıfınaRunSequence()adlı yeni bir fonksiyon ekle. Bu fonksiyon, gösteriyi başlatan aracıyı alır ve hem MainSequence hem deTVModeSequence’ı başlatır. Asenkron şekilde çalışmasına izin vermek içinRunSequence()fonksiyonuna değiştiricisini ekle. Bu fonksiyonun asenkron olması gerekir; böylece başka bir kodu onunla eşzamanlı olarak çalıştırabilir veRunSequence()kodu kesintiye uğramadan oyuncunun kamera görünümleri arasında geçiş yapmasına izin verebilirsin.Verse# Handles running the main sequence which runs the character and TV mode sequences for viewing and then calls a function to await finishing. RunSequence(Agent:agent)<suspends>:void =Gösteriye başlamadan önce koltuğa oturan oyuncu animasyonunun bitmesine izin vermek için
RunSequence()fonksiyonunda bir saniyeliğine Sleep() fonksiyonunuçağır. ArdındanMainSequence’taPlay()çağrısı yap veMainSequencePlaying’i true olarak ayarla.Verse# Sleep for a second because we just entered the chair and the animation to sit takes a moment. Sleep(1.0) # Run the Main sequence on the character device and the TV mode viewing sequence. Logger.Print("Main Sequence Playing") set MainSequencePlaying = true MainSequence.Play()Oyuncunun kamerasını sinematik görünüme geçirmek için gösteriyi başlatan aracıyı geçirerek
TVModeSequence’taPlay()çağrısı yap.InTVMode’u true olarak ayarla ve aracıyı ileterekMainSequence’ın bitmesini bekleyenAwaitMainSequenceEnding()adlı yeni bir fonksiyonu çağır. Bu fonksiyonu bir sonraki adımda ayarlayacaksın. TamamladığınRunSequence()kodun aşağıdaki gibi görünmelidir:Verse# Handles running the main sequence which runs the character and TV mode sequences for viewing and then calls a function to await finishing. RunSequence(Agent:agent)<suspends>:void = # Sleep for a second because we just entered the chair and the animation to sit takes a moment. Sleep(1.0) # Run the Main sequence on the character device and the TV mode viewing sequence. Logger.Print("Main Sequence Playing") set MainSequencePlaying = true MainSequence.Play()show_template_devicesınıfına,RunSequence()fonksiyonundanagent’ı alanAwaitMainSequecingEnding()adlı yeni bir fonksiyon ekle. Bu fonksiyon aynı zamanda<suspends>değiştiricisine ihtiyaç duyar çünkü arka planda çalışmasını veMainSequencebittiğinde tetiklenmesini istiyoruz.Verse# When the main sequence finishes, we clear the flag so that if the player sits back down, it will play again. AwaitMainSequencingEnding(Agent:agent)<suspends>:void =AwaitMainSequencingEnding()fonksiyonundaMainSequence.StoppedEvent()üzerindeAwait()çağrısı yap.MainSequencebittiğindeMainSequencePlaying’ifalseolarak ayarla ve koltuğunEject()fonksiyonunu kullanarak oyuncuyu koltuktan at. TamamladığınAwaitMainSequencingEndingfonksiyonu aşağıdaki gibi görünmelidir:Verse# When the main sequence finishes, we clear the flag so that if the player sits back down, it will play again. AwaitMainSequencingEnding(Agent:agent)<suspends>:void = MainSequence.StoppedEvent.Await() Logger.Print("Main Sequence Ended") set MainSequencePlaying = false # Kick the player out of the chair after the performance TheChair.Eject(Agent)show_template_devicesınıfınaDoReturnToTVMode()veDoReturnToFreeLook()adlı iki yeni fonksiyon ekle. Bu fonksiyonlar, bir oyuncu sırasıyla TV moduna veya serbest bakışa döndüğündeki mantığı işler ancak bunları şimdilik boş bırakacaksın ve daha sonraki bir adımda dolduracaksın.Verse# Returns us to our TV viewing mode sequence by checking where the main sequence is and aligning our playback to that point. DoReturnToTVMode(Agent:agent):void = Logger.Print("Return to TV Mode") # Determine if we are in TV mode or another camera sequence and return control to the main player camera. DoReturnToFreeLook(Agent: agent):void = Logger.Print("Return to Free Look")show_template_devicesınıfına,TheChaircihazına oturan aracıyı alanOnSeated()adlı yeni bir fonksiyon ekle.Verse# This function handles the player sitting down and starting up the performance if it isn't already running and setting up the input triggers. OnSeated(Agent:agent):void = Logger.Print("Player sat down")OnSeated()fonksiyonu içindeMainSequencezaten oynatılmakta değilse koltuk cihazında oturan aracıyı geçirerek RunSequence() adlı bir fonksiyonoluştur. Aksi takdirde aynı aracıylaDoReturnToTVMode()çağrısı yap.Verse# This function handles the player sitting down and starting up the performance if it isn't already running and setting up the input triggers. OnSeated(Agent:agent):void = Logger.Print("Player sat down") # If the main sequence is not playing on the character device in the level, run it, otherwise if it is running then just return to the TV mode viewing experience. if (MainSequencePlaying = false): spawn{RunSequence(Agent)} else: DoReturnToTVMode(Agent)show_template_devicesınıfına, koltuktan çıkan oyuncuyu alanOnChairExited()adlı yeni bir fonksiyon ekle. Bu fonksiyonun mantığını daha sonraki bir adımda dolduracaksın.Verse# Handles the player leaving the chair and removing access to the input triggers that are available while in the chair. OnChairExited(Agent:agent):void = Logger.Print("Player got up")OnBegin()fonksiyonundaTheChair.SeatedEventolayınıOnSeated()fonksiyonuna bağla. Artık bir oyuncu ne zamanTheChaircihazına oturursa gösteri başlayacak.Verse# Runs when the device is started in a running game. OnBegin<override>()<suspends>:void = Logger.Print("Standup Template device started") TheChair.SeatedEvent.Subscribe(OnSeated)
Kodu Visual Studio Code’a kaydet, derle ve şablona oynanış testi uygulamak için UEFN araç çubuğunda Oturumu Başlat butonuna tıkla. Oyununu çalıştırdığında, koltuk cihazına oturmak gösterini başlatmalı ve oyuncunun kamerasını sinematik moda ayarlamalıdır. Gösteri bittiğinde oyuncu koltuktan atılmalıdır.
Kamera Değiştirme
Gösteri sırasında, TheChair cihazında oturan oyuncu, farklı sinematik sekanslar tarafından işlenen birden fazla farklı kamera görünümü arasında geçiş yapabilir. Bu farklı sekanslar arasında geçiş yapma mantığını ayarlamak için aşağıdaki adımları takip et.
show_template_devicesınıfınaDoCameraSwitch()adlı yeni bir fonksiyon ekle. Bu fonksiyon, kamerasını değiştirdiğin aracıyı veCameraSwitchescihazındaki sinematik sekans dizinine karşılık gelen birintdeğişkenini alır.Verse# Switches us between camera sequences that have been specified by stopping any current ones and moving to the next appropriate one on the list. DoCameraSwitch(Agent:agent, Value:int):void =DoCameraSwitch()fonksiyonunda birififadesi içinde,CameraSwitchesdizisinde bir Değer dizinindeki si̇nemati̇k sekansı al. Ardından,CurrentSequence’ın bir sinematik sekans içerip içermediğini kontrol ederek ve üzerindeStop()çağrısı yaparak, oynatılmakta olan sekansı durdur.Verse# Switches us between camera sequences that have been specified by stopping any current ones and moving to the next appropriate one on the list. DoCameraSwitch(Agent:agent, Value:int):void = if (CameraSwitch := CameraSwitches[Value]): Logger.Print("Switching Cameras to {Value}") # Stop any currently playing other camera sequence. if (PlayingSequence := CurrentSequence?): PlayingSequence.Stop(Agent)CameraSwitch’tePlay()çağrısı yaparak yeni si̇nemati̇k sekansı oynatmaya başla. Ardından, o sırada hangi sekansın oynatıldığını söyleyecek olanCurrentSequence’ı ayarla. Son olarak, kamerasını değiştirdiğinagent’ı, diğer kameraları görüntülerken bu modlara geri dönmesine izin vermek içinRegister()çağrısıylaReturnToTVModeveReturnToFreeLookgirdi tetikleyicilerine kaydet. TamamladığınDoCameraSwitch()fonksiyonu aşağıdaki gibi görünmelidir:Verse# Switches us between camera sequences that have been specified by stopping any current ones and moving to the next appropriate one on the list. DoCameraSwitch(Agent:agent, Value:int):void = if (CameraSwitch := CameraSwitches[Value]): Logger.Print("Switching Cameras to {Value}") # Stop any currently playing other camera sequence. if (PlayingSequence := CurrentSequence?): PlayingSequence.Stop(Agent) # Start up the new camera viewing sequence.Sonraki ve önceki kameralar arasında geçiş yapmak için birbirine çok benzeyen şu iki fonksiyonu ayarla:
DoNextCamera()veDoPreviousCamera(). Öncelikle bir sonraki kamera için mantığı dolduracaksın, bu nedenleshow_template_devicesınıfınaDoNextCamera()adlı yeni bir fonksiyon ekle. Bu fonksiyon, kamerasını değiştirdiğinagent’ı alır.Verse# Switches to the next camera on our list, or the first if we are in TV mode. DoNextCamera(Agent:agent):void = Logger.Print("Next Camera")DoNextCamera()fonksiyonu içinde, oyuncunun şu anda TV modunda olup olmadığını kontrol et. Oyuncu TV modundaysaTVModeSequence’ı durdurmak içinStop()çağrısı yap,InTVMode’u false olarak ayarla veCurrentCameraIndexdeğerini-1olarak ayarla. Burada-1kullanırsın çünkü bir sonraki si̇nematik sekansıCameraSwitchesdizisi içinde dizinlemen gerekiyor; bu da dizin0olacak.Verse# If we are currently viewing from TV Mode, end that sequence and clear associated values. if (InTVMode?): TVModeSequence.Stop(Agent) set InTVMode = false set CurrentCameraIndex = -1Ardından, geçerli kameranın dizinine göre geçiş yapacağın bir sonraki kamerayı bulman gerekiyor. Bunun için
CurrentCameraIndex + 1veCameraSwitches.Length’inMod’unaNextCameraValueadlı yeni bir değişken ayarla. Bu,NextCameraValuedeğerini0ileCameraSwitchesdizisinin uzunluğu arasında olan veCameraSwitchesdizisinin dışında birNextCameraValuedeğeri almanı önleyen bir değere sıkıştırmana olanak sağlar. BirNextCameraValuedeğeri belirledikten sonraCurrentCameraValuedeğeriniNextCameraValueolarak ayarla veagentileCurrentCameraIndex’i ileterekDoCameraSwitch()fonksiyonunu çağır. TamamladığınDoNextCamera()fonksiyonu aşağıdaki gibi görünmelidir:Verse# Switches to the next camera on our list, or the first if we are in TV mode. DoNextCamera(Agent:agent):void = Logger.Print("Next Camera") # If we are currently viewing from TV Mode, end that sequence and clear associated values. if (InTVMode?): TVModeSequence.Stop(Agent) set InTVMode = false set CurrentCameraIndex = -1Önceki kameraya geçmek için
show_template_devicesınıfınaDoPreviousCamera()adlı yeni bir fonksiyon ekle.DoNextCamera()kodunu bu fonksiyona kopyala. Oyuncunun TV modunda olup olmadığını kontrol ederkenCurrentCameraIndexdeğerini-1yerine0olarak ayarla. Ayrıca,NextCameraValuedeğeriniCurrentCameraIndex - 1veCameraSwitches.LengthModolarak belirle. TamamladığınDoPreviousCamera()fonksiyonu aşağıdaki gibi görünmelidir:Verse# Switches us to the previous camera on the list or last camera if we are leaving TV mode. DoPreviousCamera(Agent:agent):void = Logger.Print("Prev Camera") # If we are currently viewing from TV Mode, end that sequence and clear associated values. if (InTVMode?): TVModeSequence.Stop(Agent) set InTVMode = false set CurrentCameraIndex = 0
Oyuncu, TheChair cihazında otururken ve CameraSwitches dizisindeki farklı bir kameradan izlerken TV moduna veya Serbest Bakış’a dönebilir. DoReturnToFreeLook() ve DoReturnToTVMode() fonksiyonlarını daha önce ayarlamıştın, şimdi de bunları dolduracaksın.
DoReturnToFreeLook()fonksiyonu içinde, oyuncunun şu anda TV modunda olup olmadığını kontrol et. Oyuncu TV modundaysaTVModeSequence’ı durdurmak içinStop()çağrısı yap veInTVMode’u false olarak ayarla.CurrentSequence’ın bir sinematik sekans içerip içermediğini kontrol edip içeriyorsaStop()çağrısı yaparak ve bunu false olarak ayarlayarak aynısınıCurrentSequenceiçin yap.Verse# If TV Mode is active, stop it. if (InTVMode?): TVModeSequence.Stop(Agent) set InTVMode = false # If we are playing another viewing experience, stop it. if (TempSeq := CurrentSequence?): TempSeq.Stop(Agent) set CurrentSequence = falseArtık aracıyı
ReturnToTVModegirdi tetikleyiciyeRegister()ile kaydedipReturnToFreeLooktetikleyicisinden kaydınıUnregister()ile kaldır çünkü oyuncu zaten serbest bakıştayken buna geri dönmek gerekmez. TamamladığınDoReturnToFreeLook()fonksiyonu aşağıdaki gibi görünmelidir:Verse# Determine if we are in TV mode or another camera sequence and return control to the main player camera. DoReturnToFreeLook(Agent: agent):void = Logger.Print("Return to Free Look") # If TV Mode is active, stop it. if (InTVMode?): TVModeSequence.Stop(Agent) set InTVMode = false # If we are playing another viewing experience, stop it.DoReturnToTVMode()fonksiyonu daha fazla mantık gerektirir çünkü TV moduna döndüğündeTVModeSequence’ıMainSequence’ın geçerli zamanında başlatman gerekir. Önce, bu fonksiyon çağrıldığında oyuncunun zaten TV modunda olup olmadığını kontrol et. Durum böyleyse yapman gereken bir şey olmadığındangeri dönmenyeterlidir. ArdındanCurrentSequence’ın bir sinematik sekans içerip içermediğini kontrol edip içeriyorsaStop()çağrısı yap ve bunufalseolarak ayarla.Verse# If we are already in TV mode no need to return to it. if (InTVMode?): return # If we have another camera sequence playing, stop it and clear associated values. if (TempSeq := CurrentSequence?): TempSeq.Stop(Agent) set CurrentSequence = falseŞimdi
MainSequence’ın kayıttan oynatmanın neresinde olduğunu bulman veTVModeSequence’ı aynı noktadan başlatman gerekiyor.GetPlayBackTime()çağrısıylaMainSequence’ın kayıttan oynatma zamanını al ve birCurrentSeekTimedeğişkenine kaydet.TVModeSequence’ın kayıttan oynatma zamanını,SetPlaybackTime()fonksiyonunu kullanarakCurrentSeekTimedeğişkenine ayarla ve aracıyı ileterek sekansıPlay()çağrısıyla oynat. ArdındanInTVModedeğerinitrueolarak ayarla.Verse# Figure out where the main sequence is in its playback and start up the TV mode sequence at the same spot to provide the proper viewing experience. CurrentSeekTime := MainSequence.GetPlaybackTime() TVModeSequence.SetPlaybackTime(CurrentSeekTime) TVModeSequence.Play(Agent) set InTVMode = trueSon olarak,
Unregister()çağrısıyla aracınınReturnToTVModegirdi tetikleyicisinden kaydını kaldırıpRegister()çağrısıylaReturnToFreeLooktetikleyicisine kaydet. TamamladığınDoReturnToTVMode()fonksiyonu aşağıdaki gibi görünmelidir:Verse# Returns us to our TV viewing mode sequence by checking where the main sequence is and aligning our playback to that point. DoReturnToTVMode(Agent:agent):void = Logger.Print("Return to TV Mode") # If we are already in TV mode no need to return to it. if (InTVMode?): return # If we have another camera sequence playing, stop it and clear associated values. if (TempSeq := CurrentSequence?):
Tüm Parçaları Bir Araya Getirme
Bu eğitimin önceki bölümünde birçok fonksiyonu ayarladın, şimdiyse sıra bu fonksiyonların hepsini, onları çağıran farklı girdi tetikleyicilere bağlamaya geldi.
OnSeated()fonksiyonu içinde,Register()ile aracıyıReturnToFreeLook,NextCameravePreviousCameragirdi tetikleyicilerine kaydet çünkü bunlar oyuncunun başlangıçta koltuğa ilk oturduğunda erişime sahip olduğu tetikleyicilerdir. Ardından her bir girdi tetikleyiciyi ilişkili fonksiyonlarına bağlayarakReturnToFreeLookSubscription,NextCameraSubscriptionvePreviousCameraSubscriptionbağlamalarını ayarla.ReturnToTVModeSubscriptionveChairExitSubscriptionbağlamalarını da aynı şekilde ayarla.Verse# Register for the input trigger for free look and subscribe to the pressed event when sitting. ReturnToFreeLook.Register(Agent) set ReturnToFreeLookSubscription = option{ReturnToFreeLook.PressedEvent.Subscribe(DoReturnToFreeLook)} # Register for the input trigger for the next camera and subscribe to the pressed event when sitting. NextCamera.Register(Agent) set NextCameraSubscription = option{NextCamera.PressedEvent.Subscribe(DoNextCamera)} # Register for the input trigger for the previous camera and subscribe to the pressed event when sitting. PreviousCamera.Register(Agent)show_template_devicesınıfına isteğe bağlı iptal edilebilir değer alanCancelSubscription()adlı yeni bir fonksiyon ekle.CancelSubscription()fonksiyonu içinde,Subscriptionifadesinin bir değer içerip içermediğini kontrol et. İçeriyorsaCancel()ile iptal et. TamamladığınCancelSubscription()fonksiyonu aşağıdaki gibi görünmelidir:Verse# Cancel a subscription if it is valid. CancelSubscription(Subscription:?cancelable):void = if (SubscriptionToCancel := Subscription?): SubscriptionToCancel.Cancel()Bir oyuncu koltuktan çıktığında, oyuncuda oynatılmakta olan tüm sekansları durdurman ve ayrıca oyuncunun kayıtlı olduğu girdi tetikleyicilere yönelik tüm bağlanmaları iptal etmen gerekir.
DoReturnToFreeLook()için yaptığın gibiOnChairExited()fonksiyonu için oyuncunun TV modunda olup olmadığını veCurrentSequence’ın bir si̇nemati̇k sekans içerip içermediğini kontrol et. İçeriyorsa her sekans üzerindeStop()çağrısı yap ve oyuncu TV modundaysaInTVModedeğerinifalseolarak ayarla. ArdındanCurrentSequencedeğerinifalseolarak ayarla.Verse# Stop the TV camera view when we leave the chair if it is active. if (InTVMode = true): TVModeSequence.Stop(Agent) set InTVMode = false # Stop the camera sequence we were using if it is active when we leave the chair. if (TempSeq := CurrentSequence?): TempSeq.Stop(Agent) # Clear whatever the current sequence was when we leave the chair.Şimdi, her bağlanmayı
CancelSubscription()fonksiyonuna geçirerek tüm oyuncu bağlanmalarını iptal et. Ayrıca, koltuktan ayrılırken bu düğmelere erişememeleri gerektiğindenUnregister()ile tüm girdi tetikleyicilerden oyuncunun kaydını kaldır. TamamladığınOnChairExited()fonksiyonu aşağıdaki gibi görünmelidir:Verse# Handles the player leaving the chair and removing access to the input triggers that are available while in the chair. OnChairExited(Agent:agent):void = Logger.Print("Player got up") # Stop the TV camera view when we leave the chair if it is active. if (InTVMode = true): TVModeSequence.Stop(Agent) set InTVMode = false # Stop the camera sequence we were using if it is active when we leave the chair.
Kodu Visual Studio Code’a kaydet, derle ve şablona oynanış testi uygulamak için UEFN araç çubuğunda Oturumu Başlat butonuna tıkla. Oynanış testi yaptığında, koltuk cihazına oturmak gösteriyi başlatmalıdır. Gösteri sırasında TV modu, serbest bakış ve diğer birden fazla kamera açısı arasında geçiş yapabilmelisin. TV moduna dönmek, TV modu sekansını ana sekansla hizalamalıdır. Gösteri bittiğinde serbest bakışa döndürülmeli ve koltuktan çıkmalısın.