Bu özellik deneysel aşamadadır, böylece onu deneyebilir, geribildirimde bulunabilir ve neler planladığımızı görebilirsin. Şu anda Özel Çanta ve Eşyalar kullanan bir projeyi yayınlayamazsın.
Deneysel aşamada oluşturulan öğeler için geriye dönük uyumluluğu garanti etmediğimizi, bu özelliklere yönelik API’lerin değişebileceğini ve kendi takdirimize bağlı olarak tüm deneysel özellikleri veya belirli işlevsellikleri kaldırabileceğimizi lütfen unutma. Özellik ile çalışmaya başlamadan önce bilinen sorunlar listesine göz at.
Bu eğitim, oyuncuların özel eşyaları almasına olanak tanıyan ve alınan eşyayı oyuncunun envanterine ekleyen özel bir etkileşimli “eşya alma” bileşenini nasıl oluşturacağını gösterir.
Başlamadan Önce
Bu eğitimi başarıyla tamamlayabilmek için UEFN, Scene Graph ve Verse kodu konusunda bilgi sahibi olman gerekir.
Projeni Ayarla
Projeni ayarlamak ve Özel Çanta ve Eşyalar’ı etkinleştirmek için aşağıdaki adımları izle.
UEFN’i aç ve herhangi bir ada şablonundan bir proje oluştur. Düz bir alan üzerinde çalışmak istiyorsan Ada Şablonları bölümünden Boş projeyi kullanabilirsin. Yeni projene bir isim ver ve onu editörde açmak için Oluştur butonuna tıkla.
Araç çubuğundan Proje’ye tıkla ve Proje Ayarları’nı seç.
Aşağı kaydırarak Deneysel Erişim bölümüne git ve Özel Eşyalar ve Çanta kutusunu işaretle.
Verse Kodunu Yaz
interactable_component, genel etkileşimi yönetmek için kullanılan bir Scene Graph bileşenidir. Varsayılan durumda, oyuncular bir girdiye basıp bu bileşene sahip varlıkla etkileşim kurabilir. Bu bileşeni özelleştirmek için bu adımları izleyin.
Bir interactable_component bileşeninin etkileşimde bulunabilmesi için bir varlığın mesh_component bileşenine sahip olması gerekir. Objede, bir şey varlıkla etkileşime girmeye çalıştığında kontrol edilebilecek bir çarpışma olması gerekir.
Özel etkileşimli bileşeni ekleyeceğin varlığı seç. Ayrıntılar panelinde +Component butonuna tıkla ve Yeni Verse Bileşeni seçeneğine git. Verse Bileşeni Oluştur penceresi açılır.
Verse Gezgini üzerinden yeni bir Verse dosyası ekleyerek de bir Verse bileşeni oluşturabilirsin.
Şablon Seç altında Scene Graph Bileşeni’ni seç.
Alttaki Bileşen Adı alanına item_interactable_component yaz. Ardından Oluştur butonuna tıkla.
Menü çubuğunda, Verse > Verse Gezgini’ne tıkla. Yeni Verse bileşenini bul, ona sağ tıkla ve Visual Studio Code’da Aç’ı seç.
Yeni Verse dosyasındaki mevcut kodu sil çünkü tamamını bu eğitimde yazacaksın. Önce gerekli modülleri ekle. Bunları aşağıdaki kod parçacığından kopyalayıp yapıştırabilirsin.
Verseusing { /Verse.org/Simulation } using { /Verse.org/SceneGraph } using { /UnrealEngine.com/Itemization }Ardından, belirtilen bir oyuncudan kök envanterini almak için bir yardımcı fonksiyon ekle.
VerseGetInventoryRoot(Agent:agent)<decides><transacts>:inventory_component = Inventory := (for (I : Agent.FindDescendantComponents(inventory_component)) { I })[0]Yeni özel bileşeni oluşturmadan önce, sınıf kapsamımızın dışında yeni bir mesaj türü sabiti bildirmen gerekir. Fonksiyon bir eşyanın
item_details_componentbileşeninden ad alamıyorsa varsayılan olarak bu mesaj kullanılır. Genellikle bu mesaj türü Verse dosyasının en altına yazılır.VerseDefaultInteractionMessage<localizes>:message = "Interact"interactable_componentbileşeninden devralan yeni bir Scene Graph tanımla. Buitem_interactable_componentbileşenidir.Verseitem_interactable_component := class(interactable_component) :İsteğe bağlı bir
iptal edilebilirdeğişken ekle. Bir oyuncunun eşyayla ne zaman etkileşime girdiğini öğrenmek için bu özel bileşenin bir olaya abone olması gerekir. Bu değişken, o aboneliğin referansını kaydeder ve gerekirse iptal eder.Versevar SucceededEventHandler : ?cancelable = falseArdından
OnAddedToScenefonksiyonunu geçersiz kıl. Böylece bu bileşenin sahibi olan varlığın üst öğesi değiştiğinde (örneğin dünyaya yerleştirildiğinde) isteğe bağlı değişken ayarlanır.SucceededEventHandler’ı,SucceededEventüzerindeki abone olma fonksiyonunu çağırmak için ayarla. Bu aynı zamandaOnSucceededEventfonksiyonunu da etkileşim gerçekleştiğinde tetiklenecek şekilde tanımlayacaktır.VerseOnAddedToScene<override>():void = if(not SucceededEventHandler?): set SucceededEventHandler = option{SucceededEvent.Subscribe(OnSucceededEvent)}Bir eşya alındıktan sonra
SucceededEventaboneliğinin temizlenmesi gerekir, aksi takdirde eşya bir çantaya yerleştikten sonra diğer kodlarla etkileşime girebilir. BunuOnRemovingFromScenefonksiyonunu geçersiz kılarak yapabilirsin. Bu, eşya varlığının üst öğesi değiştiğinde etkinleşir. Olay aboneliğini burada iptal etmek içincancel()kullan. Başarılı olursa,SucceededEventHandler’ı da geçersiz kılar.VerseOnRemovingFromScene<override>():void = if(SucceededEventHandler?.Cancel()): set SucceededEventHandler = false10. adımda
OnSucceededEventfonksiyonuSucceededEventöğesine abone yapılır fakat fonksiyon henüz kodda yoktur. Yani aynı imzayla yeni bir fonksiyon yazman gerekiyor. 6. adımda, etkileşimde bulunan oyuncudan kök envanterini almak içinGetInventoryRoot[]yardımcı fonksiyonunu kullandın. Şimdi bu bileşene sahip olan varlığı sunmak içinAddItemDistribute()fonksiyonunu çağır.VerseOnSucceededEvent(Agent:agent):void = if(PickupInventory := GetInventoryRoot[Agent]): if(PickupInventory.AddItemDistribute(Entity).GetSuccess[]):Bu bileşen için gereken son kod parçası,
InteractMessage[]fonksiyonunun geçersiz kılınmasıdır. Bu, bir oyuncu eşyayı almadan önce ona baktığında ekranda gösterilen mesajı döndürür. Bu bileşene sahip olan varlığın aynı zamanda biritem_details_componentbileşenine sahip olup olmadığını da kontrol edecektir. Eğer öyleyse, bu öğenin adını alır. Aksi takdirde, varlıktaitem_details_componentbileşeni yoksa veya varlık bir nedenle kaldırılmışsa daha önce bildirdiğimizDefaultInteractionMessagekullanılır.VerseInteractMessage<override>(Agent:agent)<reads><decides>:message = if(Details := Entity.GetComponent[item_details_component]): Details.Name else: DefaultInteractionMessage
Prefab Kurulumu
item_interactable_component bileşenini yazdığına göre artık onu sergilemek için örnek bir eşya hazırlayabilirsin. Bir Scene Graph prefabı oluşturmak ve yeni bileşeni eklemek için aşağıdaki adımları izle.
İçerik Tarayıcısı’nda sağ tıkla ve bağlam menüsünden Varlık Prefabı Tanımı seçeneğine git. Yeni prefabı Item_Cube olarak adlandır.
Yeni prefabı aç ve Ayrıntılar panelinde +Component butonuna tıklayarak aşağıdaki bileşenleri ekle.
item_componentitem_details_component- Bu bileşendeki alanları doldur:Ad
Açıklama
Kısa Açıklama
mesh_component- Küp primitifini veya başka bir küpü seç.item_interactable_component
Aşağıdaki video, item_interactable_component bileşenini çalışırken göstermektedir. Oyuncu, senin oluşturduğun Item_Cube prefabıyla etkileşime girdiğinde eşya oyuncunun çantasına eklenir.
İşte bu eğitim için tam kod.
using { /Verse.org/Simulation }
using { /Verse.org/SceneGraph }
using { /UnrealEngine.com/Itemization }
# This function returns the first subentity with an inventory_component. Use this to get the root inventory of an agent.
GetInventoryRoot(Agent:agent)<decides><transacts>:inventory_component =
Inventory := (for (I : Agent.FindDescendantComponents(inventory_component)) { I })[0]