दृश्य में जोड़े बिना, एक नया गेमऑबजेक्ट कैसे बनाएं?


10

मैं वही बना रहा हूं जो अनिवार्य रूप से मेरा अपना प्रीफैब सिस्टम है। गेम ऑब्जेक्ट्स को मानव पठनीय डेटा फ़ाइल द्वारा परिभाषित किया जाता है। मैं एक खाली गेम ऑबजेक्ट बनाना चाहता हूं, इसे डेटा फ़ाइल में परिभाषित घटकों के साथ लोड करूं और इसे तैयार कर Instantiate()कॉल का इंतजार करूं । हालाँकि, जब भी मैं GameObject go = new GameObject()एक नए गेम ऑब्जेक्ट का उपयोग करता हूं दृश्य में जोड़ा जाता है।

प्रीफ़ैब्स में निर्मित एकता का उपयोग करते हुए, मैं एक प्रीफ़ैब को गेमऑबजेक्ट के रूप में लोड कर सकता हूं, और यह दृश्य में नहीं जोड़ा गया है। (नीचे उदाहरण देखें)

इसके पीछे तर्क यह है कि मैं एक सूची में शामिल होना चाहूंगा जिसमें GameObjects शामिल हैं, कुछ एकता प्रीफैब लोड करने और मेरे कस्टम प्रीफैब सिस्टम द्वारा बनाए गए अन्य द्वारा लोड किए गए हैं। यह रन समय पर होने की जरूरत है, और एकता संपादक को शामिल नहीं कर सकता (क्योंकि आदर्श रूप से अंत उपयोगकर्ता अपने स्वयं के डेटा फ़ाइलों को परिभाषित करने में सक्षम होंगे)।

मैं एक नया गेमऑबजेक्ट कैसे बना सकता हूं, बिना यूनिटी स्वचालित रूप से मेरे लिए इसे तत्काल तैयार कर सकता है?


उदाहरण के लिए, मैं इस तरह से कॉल कर सकता हूं:

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

और मुझे GameObjects की एक सूची मिलेगी, जिसमें से कोई भी कॉल किए जाने पर दृश्य में नहीं जोड़ा जाता है। अनिवार्य रूप से, मैं LoadAllअपने स्वयं के प्रीफैब्स के लिए एक विधि बना रहा हूं , और इसी तरह, जब कॉल किया जाता है तो मैं गेमऑब्जेक्ट्स को तुरंत नहीं करना चाहता हूं।


1
मुझे डर है कि तुम नहीं कर सकते। मुझे लगता है कि आपको अपनी कक्षा की तात्कालिकता में देरी करनी होगी।
रॉबर्टो

जब से मैंने एकता को छुआ है, तब से यह समय हो गया है, लेकिन अगर यह पता चलता है कि इसके आसपास कोई रास्ता नहीं है, तो क्या आप तुरंत दृश्य से ऑब्जेक्ट को हटा सकते हैं और वांछित परिणाम, बस थोड़ा अक्षम कर सकते हैं?
केविन रीड

@KevinReid मुझे विश्वास है कि Destroyगेमऑबजेक्ट पर कॉल करने का एकमात्र तरीका है । जो इसे दृश्य से हटाता है और इसे जारी करता है, जिससे यह अनुपयोगी हो जाता है।
MichaelHouse

1
@ पांडापाजामा का एक अच्छा विचार है। कॉलिंग go.SetActive(false)एक वस्तु पूल की तरह कुछ बनाने का सबसे अच्छा तरीका है। यह वही नहीं है जो आप चाहते हैं, लेकिन शायद आपके पास निष्क्रिय वस्तुओं का एक छोटा समूह हो सकता है जो बाद में आपके कस्टम इंस्टेंटेशन के लिए क्लोन किया जाता है।
एंड्रयूईकेन

1
@ बाइट 56: आप वास्तव में अपने कस्टम प्रीफैब्स को प्री-इंस्टेंट करना क्यों चाहते हैं और न कि केवल पैटर्न जैसे फैक्ट्री का उपयोग करके उन्हें उड़ते समय आवश्यक घटकों के साथ जीओ की रचना करें? मैंने जो समझा, उसके लिए आप उपयोगकर्ताओं को "अपने डेटा फ़ाइलों का उपयोग करके" प्रीफ़ैब को "क्रमबद्ध" करने की अनुमति देना चाहते हैं, इसलिए आपको उन फ़ाइलों को किसी भी समय चलाना होगा और आवश्यक घटकों को तुरंत भेजना होगा .. क्या मुझे कुछ याद आ रहा है?
हेइजेनबग

जवाबों:


6

आप GameObject के HideFlags को बदल सकते हैं ?

मैंने इसे चलाने की कोशिश की:

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

myGameObject.hideFlags = HideFlags.HideInHierarchy;

... और यह वहाँ है, लेकिन यह पदानुक्रम में नहीं है। तकनीकी रूप से, यह दृश्य में है, लेकिन आप इसे तब तक नहीं देखते हैं जब तक कि आप इसे नहीं बदलते हैं यह वापस HideFlags.None है। यह वह उत्तर नहीं है जिसकी आप तलाश कर रहे हैं, लेकिन कम से कम जहां तक ​​डेवलपर्स को इसे जारी करने की बात है, यह आपकी वस्तुओं को समूहीकृत करने की तुलना में क्लीनर है।


1
इसे, इसे अक्षम करने के साथ जोड़ा गया (ताकि कोई भी स्क्रिप्ट निष्पादित नहीं हो सके), काम कर सके। मैं इसे एक कोशिश करूँगा और आपको बता दूंगा। यह अभी भी एक काम है, लेकिन मुझे लगता है कि मैं इस बिंदु पर बचा हुआ हूं। और, हम सभी जानते हैं, यह आंतरिक रूप से किया जा सकता है, हालांकि मुझे संदेह है।
MichaelHouse

1
@ बाइट 56: मैंने सोचा कि यह एक वर्कअराउंड भी था, लेकिन मुझे वास्तव में इन दिनों पता चला कि यूनिटी एनिमेशन का पूर्वावलोकन करते समय ठीक वैसा ही करती है: यह दृश्य में छिपे हुए गेमबजेक्ट को इंस्टेंट करता है और उन्हें एक समर्पित कैमरे के साथ प्रीव्यू फ्रेम में रेंडर करता है। तो शायद यह इतना साफ नहीं लगता है, लेकिन वास्तव में यह समाधान आंतरिक रूप से भी उपयोग किया जाता है।
हाइजेनबग

1
देर से स्वीकार करने के लिए क्षमा करें। मैं बस इसे लागू करने के लिए चारों ओर हो गया और यह बहुत अच्छा काम करता है। धन्यवाद।
MichaelHouse

0

आप दुर्भाग्य से वह सटीक काम नहीं कर सकते। हालाँकि, आप फ़ैक्टरी पैटर्न के माध्यम से एक ही डिज़ाइन पैटर्न को पूरा कर सकते हैं (जैसे। अपनी वस्तुओं के निर्माण को दूर कर सकते हैं, और फिर बाद में उन्हें केवल एक आदेश के साथ कॉल कर सकते हैं) ।

जब आप कोई ऑब्जेक्ट चाहते हैं, तो कुछ कॉल करें Factory.CreateGameEntity(), और वह विधि पर्दे के पीछे सब कुछ संभाल लेगी।


यह आपके विचार से अधिक जटिल है, हालांकि यह उतना साफ नहीं है। मैं एक उत्तर पूर्ण विवरण पोस्ट करूंगा, लेकिन अनिवार्य रूप से पार्सर को बहुत जटिल होना चाहिए। उदाहरण के लिए, अगर मैं परीक्षण करना चाहता हूं कि क्या प्रीफ़ैब में एक घटक है, तो इंस्टेंटिंग करने से पहले, यह उतना ही सरल है GetComponent<>() != null। मेरी डेटा फ़ाइलों के साथ, पार्सर को डेटा में सही घटक की खोज करनी है। एक घटक के अंदर से एक मूल्य प्राप्त करने के लिए समान है, और इसी तरह। GameObjectवर्ग पार्सर द्वारा दोहराया किए जाने की आवश्यकता है कि कार्यक्षमता का एक बहुत प्रदान करता है।
MichaelHouse

यदि आप साक्ष्य प्रदान कर सकते हैं या यहां तक ​​कि कुछ तर्क भी दे सकते हैं कि ऐसा क्यों नहीं किया जा सकता है, तो यह इस उत्तर को पूरा कर देगा।
MichaelHouse

मैं बाद में देखूंगा कि क्या मुझे इसके बारे में कोई निश्चित दस्तावेज मिल सकता है, अभी के लिए मैं ये सभी फोरम थ्रेड्स फोरम .unity3d.com / threads/ - answers.unity3d.com/questions/366273/… - उत्तर
झॉकिंग

0

go = new GameObject();इसे दृश्य में जोड़े बिना कोई रास्ता नहीं है ।

मैं एक आरटीएस पर काम कर रहा हूं, जहां खिलाड़ी के आधार को लगातार बनाए रखने की जरूरत है, और अनिवार्य रूप से, हमने जो कुछ भी किया है उसे क्रमबद्ध करते हैं और स्टोर से संशोधित संपत्ति का उपयोग करके इसे रन टाइम में वापस लोड करते हैं।

XML या JSON के लिए अधिकांश आउटपुट तो फ़ाइल को लोड करने और इसे अपनी इच्छानुसार हेरफेर करने के लिए बहुत सीधे हैं।


धन्यवाद मार्क। क्या आप इस दृश्य में जोड़े बिना एक नया GameObject बनाने में सक्षम नहीं होने के लिए सबूत या तर्क प्रदान कर सकते हैं? मेरे पास स्वयं का क्रमांकन कोड है, इसलिए यह कोई समस्या नहीं है, सुझाव के लिए धन्यवाद।
MichaelHouse

-1

प्रीफ़ैब बनाने का सही तरीका है, आप उस प्रीफ़ैब को एक ऑब्जेक्ट के रूप में आवंटित करते हैं, फिर जब भी आप इंस्टेंट को बस इस ऑब्जेक्ट के संदर्भ का उपयोग करना चाहते हैं और इसे गेमऑबजेक्ट के रूप में डालते हैं।

पूर्व:

private Object prefab;


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

1
वह मौजूदा प्रीफैब प्रणाली का उपयोग कर रहा है। जैसा कि मेरे प्रश्न में कहा गया है, मैं अनिवार्य रूप से अपना प्रीफैब सिस्टम बना रहा हूं। आवश्यकताओं का हिस्सा "एकता संपादक को शामिल नहीं कर सकता है"। प्रीफ़ैब बनाने से एकता संपादक का उपयोग करता है।
MichaelHouse

कि आप क्या नहीं कर सकते हैं, आपको अपने एसडीके का उपयोग करके अपने स्वयं के डेटा बनाने में सक्षम होने के लिए विकासकर्ता के लिए लाइसेंस की आवश्यकता होगी। जब तक मैं गलत नहीं हूँ, वे बिना किसी ब्लिंग ब्लिंग के अपना कोड साझा नहीं करेंगे। लेकिन मुझे पता है कि कुछ लोग एकता से अपने गेम इंजन
एरूल

ठीक है, यह स्पष्ट रूप से संभव है क्योंकि मैंने चयनित उत्तर का उपयोग करके अपना स्वयं का प्रीफैब सिस्टम बनाया था। आप सीख सकते हैं कि मैंने अपने प्रोफ़ाइल में पाए गए पाठ्यक्रम में इसे कैसे किया।
MichaelHouse

नहीं धन्यवाद मैं एक स्नातक की उपाधि प्राप्त खेल प्रोग्रामर हूँ :) यदि आप सफल होते हैं तो आपके लिए, यह खेल बनाने के लिए जरूरी नहीं है
एरियल

यह एक प्रणाली है जो अनिवार्य रूप से अंतिम उपयोगकर्ताओं को प्रीफैब बनाने की अनुमति देती है। यह मॉड्स और अन्य एंड-यूज़र द्वारा बनाई गई सामग्री के लिए गेम में बहुत उपयोगी है। (तो हाँ, मुझे लगता है कि यह गेम बनाने में बहुत उपयोगी है)।
MichaelHouse

-1

एक प्रीफ़ैब को एक चर में लोड करने के लिए ताकि आप इसे बाद में तुरंत उपयोग कर सकें, आप निम्नलिखित कोड का उपयोग करेंगे:

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

मैंने यह यूनिटी 5.5 के साथ एक प्रोजेक्ट में किया है। यह तात्कालिक रूप से उपलब्ध होगा लेकिन सामान्य के रूप में तात्कालिक होने तक पदानुक्रम के दृश्य या भाग में नहीं।


मुझे लगता है कि आपने प्रश्न गलत पढ़ा है। इस उत्तर में डिफ़ॉल्ट प्रीफ़ैब प्रणाली का उपयोग करना शामिल है। यह सवाल एक कस्टम प्रीफैब सिस्टम बनाने के संदर्भ में पूछता है, जहां यह सुलभ नहीं है। नीचे का उदाहरण इस पर प्रकाश डालने के लिए कार्य करता है।
गनमलॉक

"मैं एक नया गेमऑबजेक्ट कैसे बना सकता हूं, एकता के बिना स्वचालित रूप से मेरे लिए इसे तत्काल करना होगा?" क्या यह सवाल पूछा गया था और इस कोड ने इसका जवाब दिया। कस्टम लोडिंग सिस्टम के साथ वांछित परिणाम प्राप्त करने के लिए कोड को बदला जा सकता है।

यह अनिवार्य रूप से प्रश्न में शामिल उदाहरण में मैं क्या वर्णन करता हूं। और यह प्रीफ़ैब्स के लिए ठीक काम करता है, लेकिन डेटा फ़ाइलों से नई गेम ऑब्जेक्ट बनाने के लिए नहीं।
MichaelHouse
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.