Sahneye eklemeden yeni bir GameObject nasıl oluşturulur?


10

Aslında kendi prefabrik sistemimi yaratıyorum. Oyun nesneleri okunabilir bir veri dosyası tarafından tanımlanır. Boş bir GameObject oluşturmak, veri dosyasında tanımlanan bileşenlerle yüklemek ve hazır ve bir Instantiate()çağrı bekletmek istiyorum . Ancak, ne zaman GameObject go = new GameObject()yeni bir oyun nesnesi kullanırsam sahneye eklenir.

Yerleşik prefabrik üniteleri kullanarak, GameObject olarak bir prefabrik yükleyebilirim ve sahneye eklenmez. (Aşağıdaki örneğe bakın)

Bunun arkasındaki mantık, GameObjects'i içeren bir listeye sahip olmak istiyorum, bazıları Unity prefabrikleri ve diğerleri özel prefabrik sistemim tarafından oluşturuldu. Bunun çalışma zamanında gerçekleşmesi gerekir ve Unity Editor'ü içeremez (ideal olarak son kullanıcılar kendi veri dosyalarını tanımlayabilirler).

Unity'yi otomatik olarak benimsemeden yeni bir GameObject'i nasıl oluşturabilirim?


Örneğin, şöyle bir arama yapabilirim:

Resources.LoadAll("PrefabsDirectory", typeof(GameObject))

Ve arama yapıldığında sahneye hiçbiri eklenmeyen GameObjects'in bir listesini alacağım. Esasen, LoadAllkendi prefabriklerim için bir yöntem oluşturuyorum ve benzer şekilde, arama yapıldığında GameObjects'i örneklemek istemiyorum.


1
Korkarım yapamazsın. Bence sınıfınızın örneklenmesini ertelemeniz gerekecek.
Roberto

Birliğe dokunduğumdan bu yana bir süre geçti, ancak ortaya çıkarsa bunun bir yolu yok , nesneyi hemen sonra sahneden çıkarabilir ve istenen sonucu elde edersiniz , sadece biraz verimsiz?
Kevin Reid

@KevinReid Bunu yapmanın tek yolunun DestroyGameObject'e çağrı yapmak olduğuna inanıyorum . Bu onu sahneden çıkarır ve serbest bırakır, kullanılamaz hale getirir.
MichaelHouse

1
@PandaPajama'nın iyi bir fikri var. Arama go.SetActive(false), nesne havuzu gibi bir şey oluşturmanın en iyi yoludur. Bu tam olarak istediğiniz gibi değil, ancak daha sonra özel örneğiniz için klonlanan küçük bir etkin olmayan nesne grubuna sahip olabilirsiniz.
AndrewEkeren

1
@ Byte56: Neden özel prefabriklerinizi önceden örneklemek ve sadece fabrikada bir model kullanarak örnek oluştururken GO'yı anında gerekli bileşenlerle oluşturmak istemiyorsunuz? Ne anladım için kullanıcıların "kendi veri dosyaları" kullanarak prefabrik "serileştirmek" izin vermek istiyorum, bu yüzden zaten çalışma zamanında bu dosyaları okumak ve gerekli bileşenleri somutlaştırmak zorunda .. Bir şey eksik mi?
14'te Heisenbug

Yanıtlar:


6

GameObject'in hideFlags'ını değiştirebilir misin?

Sadece bunu çalıştırmayı denedim:

GameObject myGameObject = new GameObject ();
myGameObject.name = "Obvious Name";

myGameObject.hideFlags = HideFlags.HideInHierarchy;

... ve orada, ama hiyerarşide değil. Teknik olarak, sahnede, ancak bayrakları tekrar HideFlags olarak değiştirene kadar görmüyorsunuz. Aradığınız cevap bu değil, ama en azından bunu geliştiricilere bıraktığınız sürece, nesnelerinizi gruplamaktan daha temiz.


1
Bu, devre dışı bırakılmasıyla eşleştirildi (böylece komut dosyalarının hiçbiri yürütülmedi). Bir deneyeceğim ve size bildireceğim. Hala bir iş, ama sanırım bu noktada kaldı. Ve bildiğimiz her şey için, bu içtenlikle yapılmış olabilir, ancak şüpheliyim.
MichaelHouse

1
@ Byte56: Bunun da bir çözüm olduğunu düşündüm, ama aslında bu günlerde Unity'nin animasyonları önizlerken tam olarak aynı şeyi yaptığını keşfettim: sahnede gizli gameobject'i başlatır ve bunları özel bir kamerayla önizleme çerçevesine dönüştürür. Belki de kulağa çok temiz gelmiyor, ama aslında bu çözüm dahili olarak da kullanılıyor gibi görünüyor.
Heisenbug

1
Geç kabul ettiğim için üzgünüm. Bunu uygulamaya başladım ve harika çalışıyor. Teşekkürler.
MichaelHouse

0

Maalesef tam olarak bunu yapamazsınız. Bununla birlikte, aynı tasarım desenini (yani, nesnelerinizin binasını soyutlayabilir ve daha sonra bunları tek bir komutla daha sonra çağırabilirsiniz) bir Fabrika deseni aracılığıyla gerçekleştirebilirsiniz .

Bir nesne istediğinizde, buna benzer bir şey çağırın Factory.CreateGameEntity(), bu yöntem perde arkasındaki her şeyi halledecektir.


Düşündüğünüzden daha karmaşık, bu kadar temiz değil. Detaylara bir cevap göndereceğim, ancak aslında ayrıştırıcının oldukça karmaşık olması gerekiyor. Örneğin, bir prefabrik bileşen içerip içermediğini test etmek istersem, somutlaştırmadan önce, bu kadar basit GetComponent<>() != null. Veri dosyalarım ile ayrıştırıcı, verilerde doğru bileşeni aramalıdır. Bir bileşenin içinden bir değer elde etmek için de aynı şey geçerlidir. GameObjectSınıf ayrıştırıcı tarafından çoğaltılamaz gereken işlevsellik bir sürü sağlar.
MichaelHouse

Bunun neden yapılamadığına dair kanıt veya hatta bir gerekçe sunabilirseniz, bu cevabı tamamlardı.
MichaelHouse

Bu konuda herhangi bir kesin belgeler bulabilirse şimdi tüm Bunları forum lifler vardır bulabilirsiniz için ben, daha sonra göreceğiniz forum.unity3d.com/threads/... - answers.unity3d.com/questions/366273/... - answers.unity3d .com / sorular / 19736 /…
Mart'ta jhocking

0

go = new GameObject();Sahneye eklemeden yapmanın bir yolu yok .

Oyuncu tabanının kalıcı olması gereken bir RTS üzerinde çalışıyorum ve esas olarak, yaptıkları her şeyi serileştiriyor ve mağazadan değiştirilmiş varlıkları kullanarak çalışma zamanında geri yüklüyoruz.

Çoğu XML veya JSON çıktısı, bu nedenle dosyayı yüklemek ve istediğiniz gibi değiştirmek oldukça basittir.


Teşekkürler Marc. Sahneye eklemeden yeni bir GameObject yaratamayacağınıza dair kanıt veya gerekçe sunabilir misiniz? Kendi serileştirme kodum var, bu yüzden bu bir sorun değil, öneri için teşekkürler.
MichaelHouse

-1

Doğru yol bir prefabrik yapmaktır, o prefabreyi bir Nesne olarak tahsis edersiniz, daha sonra her bir örnek oluşturmak istediğinizde bu Nesnenin referansını kullanın ve bir GameObject olarak yayınlayın.

ör .:

private Object prefab;


public static GameObject Create(void)
{
   return (Instantiate(prefab , position , rotation) as GameObject);
}

1
Mevcut prefabrik sistemi kullanıyor. Sorumun belirttiği gibi, aslında kendi prefabrik sistemimi oluşturuyorum. Gereksinimlerin bir kısmı "Unity Editor'ü içeremez" dir. Bir prefabrik oluşturmak için Unity Editor kullanılır.
MichaelHouse

Yapamayacağınız için, geliştiricinin SDK'sını kullanarak bir lisans almanız gerekir ve daha sonra kendi verilerinizi oluşturabilirsiniz. Yanılmıyorsam, kodlarını herhangi bir bling bling olmadan paylaşmayacaklar. Ancak bazı insanların
Unity'den

Seçilen cevabı kullanarak kendi prefabrik sistemimi oluşturduğum için açıkça mümkün. Profilimde bulduğum derste bunu nasıl yapacağınızı öğrenebilirsiniz.
MichaelHouse

hayır teşekkürler Ben mezun bir oyun programcısıyım :) Eğer sizin için bu kadar başarılı olursa, oyun yapmak için gerek yok
Ericool

Temelde son kullanıcıların prefabrik yapmalarına izin veren bir sistemdir. Bu modlar ve son kullanıcı tarafından oluşturulan diğer içerik oyunlarında oldukça kullanışlıdır. (Evet, bence oyun yapımında oldukça kullanışlı).
MichaelHouse

-1

Bir prefabreyi bir değişkene daha sonra başlatabilmeniz için yüklemek için aşağıdaki kodu kullanırsınız:

 GameObject ball = (GameObject)(Resources.Load ("myPrefab"));

Bunu Unity 5.5 ile bir projede yaptım. Normal olarak somutlaştırılana kadar örnekleme yapılabilir, ancak hiyerarşinin sahnesinde veya bir bölümünde bulunmayacaktır.


Soruyu yanlış okuduğunuzu hissediyorum. Bu cevap varsayılan prefabrik sistemin kullanılmasını içerir . Bu soru, erişilemediği özel bir prefabrik sistem oluşturma bağlamında soruyor . Alttaki örnek bunu daha fazla vurgulamaya yarar.
Gnemlock

"Unity'yi otomatik olarak benimsemeden yeni bir GameObject'i nasıl oluşturabilirim?" Sorulan soru ve bu kod cevaplandı. Kod, özel yükleme sistemlerinde istenen sonuçları elde etmek için değiştirilebilir.
Darthhawk

Bu, esasen soruya dahil edilen örnekte tarif ettiğim şey. Ve prefabrikler için iyi çalışıyor, ancak veri dosyalarından yeni oyun nesneleri oluşturmak için çalışmıyor.
MichaelHouse
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.