إضافة مشهد
بيئة التحقق
- نوافذ
-
- ويندوز ١١
- محرر الوحدة
-
- 2020.3.25f1
- حزمة نظام الإدخال
-
- 1.2.0
المتطلبات الأساسية لهذه النصيحة
تم إجراء الإعدادات التالية مسبقا كمقدمة لوصف هذه النصيحة.
حول إضافة مشهد
تتيح لك Unity عرض مشاهد متعددة في نفس الوقت. استخدمه عندما تريد ببساطة تراكب المشاهد أو تصدير رسوماتك إلى نسيج مختلف.
هذه المرة ، أود أن أشرح العرض المتراكب للمشهد على افتراض أن شاشة القائمة معروضة في المقدمة أثناء تشغيل اللعبة أثناء تشغيل اللعبة.
عند عرض مشاهد متعددة ، يجب أن تكون على دراية بما يلي:
- يجب ألا يكون هناك أكثر من نظام حدث واحد
- يجب ألا يكون هناك أكثر من مستمع صوتي واحد
- كن حذرا عند التعامل مع كاميرات متعددة
جهز المشهد
هذه المرة ، سنقوم بإعداد مشهدين. فليكن ، والمشهد SampleSceneParent
SampleSceneChild
الذي سيتم عرضه بالإضافة إلى ذلك هو .
طريقة إعداد مشهدين هي نفس النصائح السابقة ، لذا يرجى الرجوع إليها.
هذه المرة ، سنقوم بإنشاء التخطيط التالي. إذا قمت بالنقر فوق الزر الموجود في المشهد الأصل ، فلا توجد مشكلة سوى إضافة المشهد الفرعي.
ويتم وضع العفاريت لتسهيل Canvas
فهم الأعراض التي ستراها لاحقا.
سامةسينسينالوالدين
عينةمشهدالطفل
عندما يتم عرض مشاهد متعددة ، يعتمد سياق الكائنات على "ترتيب الطبقة" لكل كائن ، بغض النظر عن وحدة المشهد.
نظرا لأن القيم الأولية كلها 0 ، اترك SampleSceneChild
Canvas
لا والكائنات مضبوطة على "1".
لا تنس تعيين المشهدين في إعدادات البناء.
معالجة المشاهد
تتم معالجتها في التعليمات البرمجية بنفس طريقة تبديل المشاهد. هذه المرة أيضا ، تتم معالجتها عند النقر فوق الزر ، ولكن تتم معالجتها كإضافة بدلا من تبديل المشهد.
اسم ملف البرنامج النصي تعسفي ، ولكن هنا 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 أنظمة الأحداث في المشهد. يرجى التأكد من وجود نظام حدث واحد دائما في مكان الحادث
(هناك نوعان من أنظمة الأحداث في المشهد.) تأكد من أن لديك دائما نظام حدث واحد في المشهد الخاص بك)
كما هو مكتوب ، فإن دمج EventSystem في حل واحد سيحل المشكلة.
SampleSceneParent
يفترض أنه موجود دائما ،SampleSceneChild
لذا احذفه عند EventSystem
فتحه.
بالطبع ، يرجى ملاحظة أنه إذا قمت بتشغيل من تلقاء نفسه ،SampleSceneChild
فلن تعمل واجهة المستخدم مثل الأزرار.
يمكنك أن ترى أن سجلات EventSystem قد اختفت عند تشغيله.
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
لا بأس إذا كانت نتيجة تنفيذ وإضافة مشهد طفل كما هو موضح في الشكل أدناه. تأكد من عدم وجود سجلات أيضا.