कोई दृश्य जोड़ें
सत्यापन वातावरण
- विंडोज़
-
- विंडोज 11
- एकता संपादक
-
- 2020.3.25f1
- इनपुट सिस्टम पैकेज
-
- 1.2.0
इस टिप के लिए आवश्यक शर्तें
इस टिप के विवरण के लिए एक आधार के रूप में निम्नलिखित सेटिंग्स पहले से बनाई गई हैं।
दृश्य जोड़ने के बारे में
एकता आपको एक ही समय में कई दृश्यों को प्रदर्शित करने की अनुमति देती है। इसका उपयोग तब करें जब आप केवल दृश्यों को ओवरले करना चाहते हैं या अपने चित्रों को एक अलग बनावट में निर्यात करना चाहते हैं।
इस बार, मैं दृश्य के सुपरइम्पोज्ड डिस्प्ले की व्याख्या करना चाहता हूं, यह मानते हुए कि मेनू स्क्रीन अग्रभूमि में प्रदर्शित होती है, जबकि गेम चल रहा है जबकि गेम चल रहा है।
कई दृश्यों को प्रदर्शित करते समय, आपको निम्नलिखित के बारे में पता होना चाहिए:
- एक से अधिक ईवेंट सिस्टम नहीं होना चाहिए
- एक से अधिक ऑडियो श्रोता नहीं होना चाहिए
- कई कैमरों को संभालते समय सावधान रहें
दृश्य तैयार करें
इस बार, हम दो दृश्य तैयार करेंगे। रहने दो, और SampleSceneParent
अतिरिक्त रूप से प्रदर्शित किया जाने वाला दृश्य SampleSceneChild
है।
दो दृश्यों को तैयार करने की विधि पिछले सुझावों के समान है, इसलिए कृपया उन्हें देखें।
इस बार, हम निम्नलिखित लेआउट बनाएंगे। यदि आप मूल दृश्य में बटन क्लिक करते हैं, तो बच्चे के दृश्य को जोड़ने के अलावा कोई समस्या नहीं है।
और स्प्राइट्स को उन लक्षणों को Canvas
समझना आसान बनाने के लिए रखा जाता है जिन्हें आप बाद में देखेंगे।
SampleSceneParent
SampleSceneChild
जब कई दृश्य प्रदर्शित होते हैं, तो वस्तुओं का संदर्भ दृश्य इकाई की परवाह किए बिना प्रत्येक वस्तु के "परत क्रम" पर निर्भर करता है।
चूंकि प्रारंभिक मान सभी 0 हैं, इसलिए "1" पर सेट नहीं और स्प्राइट्स छोड़ दें SampleSceneChild
Canvas
।
बिल्ड सेटिंग्स में दो दृश्यों को सेट करना न भूलें।
प्रसंस्करण दृश्य
यह स्विचिंग दृश्यों के समान कोड में संसाधित किया जाता है। इस बार भी बटन क्लिक करने पर इसे प्रोसेस किया जाता है, लेकिन इसे सीन स्विच की जगह एडिशन के तौर पर प्रोसेस किया जाता है।
स्क्रिप्ट फ़ाइल का नाम मनमाना है, लेकिन यहाँ SceneAdd
यह है।
स्क्रिप्ट इस तरह दिखती है:
using UnityEngine;
using UnityEngine.SceneManagement; // 追加
public class SceneAdd : MonoBehaviour
{
<summary>ボタンをクリックしたときに呼ばれます。</summary>
public void OnClick()
{
// 指定したシーンを追加します
SceneManager.LoadScene("SampleSceneChild", LoadSceneMode.Additive);
}
}
दृश्यों को बदलते समय, मैं सेट करता हूं, LoadSceneMode
Single
लेकिन इस बार Additive
यह है।
अंतर बस इतना ही है।
स्क्रिप्ट सहेजने के बादSampleSceneParent
, इसे अनुलग्न करें. EventSystem
बटन पर विधि सेट करें OnClick
।
यह देखने के लिए गेम चलाने का प्रयास करें कि यह कैसे काम करता है। यदि आप बटन पर क्लिक करते हैं, तो आपको बच्चे का दृश्य दिखाई देगा।
इसके अलावा, यदि आप पदानुक्रम को देखते हैं, तो आप देख सकते हैं कि दो दृश्य हैं।
हालांकि, इस तथ्य के बावजूद कि दृश्य जोड़ा गया है, ऐसा लगता है कि मूल दृश्य के कैनवास की सामग्री प्रदर्शित नहीं की गई है। इसके विपरीत, आप देख सकते हैं कि मूल दृश्य में स्प्राइट्स परतों के क्रम के अनुसार पीछे की ओर प्रदर्शित होते हैं।
इसके अलावा, यदि आप कंसोल को देखते हैं, तो आप देख सकते हैं कि लॉग लगातार आउटपुट होते हैं।
सामग्री निम्नलिखित दो बिंदु हैं।
- दृश्य में 2 इवेंट सिस्टम हैं। कृपया सुनिश्चित करें कि दृश्य में हमेशा एक ही घटना प्रणाली है।
- दृश्य में 2 ऑडियो श्रोता हैं। कृपया सुनिश्चित करें कि दृश्य में हमेशा एक ऑडियो श्रोता है।
कई दृश्यों का उपयोग करते समय, इन दो बिंदुओं और कैमरे के अनुरूप होना आवश्यक है।
इवेंट सिस्टम त्रुटियों को ठीक करें
लॉग की सामग्री निम्नानुसार हैं।
दृश्य में 2 इवेंट सिस्टम हैं। कृपया सुनिश्चित करें कि दृश्य में हमेशा एक ही घटना प्रणाली है।
(दृश्य में दो इवेंट सिस्टम हैं। सुनिश्चित करें कि आपके दृश्य में हमेशा एक इवेंट सिस्टम है)
जैसा कि लिखा गया है, इवेंटसिस्टम को एक समाधान में संयोजित करने से समस्या हल हो जाएगी।
SampleSceneParent
हमेशा मौजूद माना जाता है,SampleSceneChild
इसलिए जब आप इसे खोलते हैं तो EventSystem
इसे हटा दें।
बेशक, कृपया ध्यान दें कि यदि आप स्वयं से चलते हैं,SampleSceneChild
तो यूआई जैसे बटन काम नहीं करेंगे।
आप देख सकते हैं कि जब आप इसे चलाते हैं तो इवेंटसिस्टम लॉग गायब हो गए हैं।
SampleSceneParent
इसके अलावा, चूंकि मौजूद हैEventSystem
, इसलिए बच्चे के दृश्य में बटन सक्रिय किए जा सकते हैं।
ऑडियोऑलियर्स त्रुटियों को ठीक करें
लॉग की सामग्री निम्नानुसार हैं।
दृश्य में 2 ऑडियो श्रोता हैं। कृपया सुनिश्चित करें कि दृश्य में हमेशा एक ऑडियो श्रोता है।
(दृश्य में दो ऑडियो श्रोता हैं। सुनिश्चित करें कि हर समय दृश्य में केवल एक ऑडियो श्रोता है। )
Main Camera
यदि आप के घटकों को देखते हैं, तो आप निश्चित रूप से देख सकते हैं कि ऑडियो श्रोता मौजूद है, इसलिए SampleSceneChild
आप ऑडियो श्रोता को हटा सकते हैं।
इसे अगले आइटम के कैमरा नियंत्रण द्वारा हल किया जा सकता है, इसलिए हम वहां इससे निपटेंगे।
यदि आप कैमरा रखना चाहते हैं,SampleSceneChild
तो आप इस ऑडियो श्रोता को हटा देंगे।
दो दृश्य ों को दिखाने के लिए कैमरा बदलें
इस कारण के रूप में कि बाल दृश्य को जोड़ते समय केवल बाल दृश्य का कैनवास प्रदर्शित होता है, ऐसा इसलिए है क्योंकि कैनवास पर दो कैमरे, मूल दृश्य और बाल दृश्य सेट हैं, और केवल एक कैमरा प्रदर्शित किया गया है।
इसका समाधान मूल दृश्य के कैमरे के साथ दोनों दृश्यों के कैनवास को प्रदर्शित करना है। प्रक्रिया बाल दृश्य के कैनवास पर कैमरे को बाल दृश्य के बाद माता-पिता के दृश्य के कैमरे से बदलना है।
चलो एक स्क्रिप्ट बनाते हैं। नाम मनमाना है, लेकिन इस मामले ChildSceneCamera
में यह है।
स्क्रिप्ट इस तरह दिखती है: Canvas
यह संलग्न करने के लिए एक शर्त प्रक्रिया है।
using System.Linq;
using UnityEngine;
using UnityEngine.SceneManagement;
public class ChildSceneCamera : MonoBehaviour
{
<summary>シーンに追加されたタイミングで処理されます。</summary>
void Awake()
{
// 親のシーンのキャンバスを取得
var parentScene = SceneManager.GetSceneByName("SampleSceneParent");
var parentCanvas = parentScene.GetRootGameObjects().First(obj => obj.GetComponent<Canvas>() != null).GetComponent<Canvas>();
// 子のシーンのキャンバスを取得
var childCanvas = GetComponent<Canvas>();
// 子のシーンのカメラを削除
Object.Destroy(childCanvas.worldCamera.gameObject);
// 子のシーンのキャンバスのカメラを親のシーンのカメラに置き換えます
childCanvas.worldCamera = parentCanvas.worldCamera;
}
}
Awake
विधि को पहली बार निष्पादित किया जाता है जब ऑब्जेक्ट दृश्य में मौजूद होता है। Start
विधि से पहले निष्पादित करता है।
यह याद रखना अच्छा है कि आप अक्सर इसका उपयोग करते हैं।
इस बार, यह माना जाता है कि बाल दृश्य जोड़े जाने पर इसे निष्पादित किया जाएगा।
<summary>シーンに追加されたタイミングで処理されます。</summary>
void Awake()
{
// 処理
}
कैमरे को बदलने के लिए पैरेंट सीन कैनवास और चाइल्ड सीन कैनवास प्राप्त करें। इसे करने के विभिन्न तरीके हैं, लेकिन यह मुख्य विषय नहीं है, इसलिए आप सोच सकते हैं कि यदि आप इसे कुछ समय के लिए इस तरह से करते हैं तो आप इसे प्राप्त कर सकते हैं।
// 親のシーンのキャンバスを取得
var parentScene = SceneManager.GetSceneByName("SampleSceneParent");
var parentCanvas = parentScene.GetRootGameObjects().First(obj => obj.GetComponent<Canvas>() != null).GetComponent<Canvas>();
// 子のシーンのキャンバスを取得
var childCanvas = GetComponent<Canvas>();
पहले बच्चे के दृश्य के कैमरे Object.Destroy
को नष्ट करें। यहां तक कि अगर यह चला गया है, तो कोई समस्या नहीं है क्योंकि इसे माता-पिता के दृश्य के कैमरे द्वारा कवर किया जा सकता है।
विलोपन लक्ष्य Canvas.worldCamera
से पुनर्प्राप्त किया जाता है.
यह सिर्फ इसलिए है क्योंकि इस बिंदु पर दृश्य में एक ही कैमरा सेट है और आसानी से प्राप्त किया जा सकता है।
यदि आप वास्तव में इसे हटाना चाहते हैं, तो बेहतर होगा कि आप दृश्य से कैमरा प्राप्त करें।
// 子のシーンのカメラを削除
Object.Destroy(childCanvas.worldCamera.gameObject);
अंत में, बच्चे के दृश्य Canvas.worldCamera
को माता-पिता के कैमरे से बदल दिया जाता है।
// 子のシーンのキャンバスのカメラを親のシーンのカメラに置き換えます
childCanvas.worldCamera = parentCanvas.worldCamera;
स्क्रिप्ट सहेजने के बादSampleSceneChild
, इसे अनुलग्न करें. Canvas
यह ठीक है यदि एक बच्चे के दृश्य को निष्पादित करने और जोड़ने का परिणाम नीचे दिए गए आंकड़े में दिखाया गया है। सुनिश्चित करें कि कोई लॉग भी नहीं हैं।