اضافه کردن یک صحنه
محیط تایید
- ویندوز
-
- ویندوز 11
- ویرایشگر یونیتی
-
- دانلود: 2020.3.25f1
- بسته سیستم ورودی
-
- 1.2.0
پیشنیازهای این نکته
تنظیمات زیر از قبل به عنوان یک فرض برای توصیف این نکته ساخته شده است.
درباره اضافه کردن یک صحنه
Unity به شما امکان می دهد چندین صحنه را همزمان نمایش دهید. از ان استفاده کنید زمانی که شما به سادگی می خواهید صحنه ها را پوشش دهید یا نقاشی های خود را به یک بافت متفاوت صادر کنید.
این بار، من می خواهم برای توضیح صفحه نمایش بر روی صحنه با فرض اینکه صفحه نمایش منو در پیش زمینه نمایش داده می شود در حالی که بازی در حال اجرا است در حالی که بازی در حال اجرا است.
هنگام نمایش چندین صحنه، باید از این جمله اگاه باشید:
- نباید بیش از یک EventSystem وجود داشته باشد
- نباید بیش از یک شنونده صوتی وجود داشته باشد
- مراقب باشید در هنگام دست زدن به دوربین های متعدد
صحنه را اماده کنید
این بار دو صحنه را اماده خواهیم کرد. بیایید ، و SampleSceneParent
صحنه SampleSceneChild
ای که باید نمایش داده شود نیز هست.
روش اماده سازی دو صحنه همان نکات قبلی است، بنابراین لطفا به انها مراجعه کنید.
این بار طرح زیر را ایجاد خواهیم کرد. اگر روی دکمه در صحنه والدین کلیک کنید، هیچ مشکلی به جز اضافه کردن صحنه کودک وجود ندارد.
و ارواح قرار داده شده به ان را اسان تر به Canvas
درک علائم است که شما بعدا خواهید دید.
نمونهSceneParent
نمونهSceneChild
هنگامی که چندین صحنه نمایش داده می شود، زمینه اشیاء بستگی به "ترتیب لایه" هر شی، صرف نظر از واحد صحنه دارد.
از انجا که مقادیر اولیه همه 0 هستند، no و SampleSceneChild
Canvas
sprites را به "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
UI مانند دکمه ها کار نخواهد کرد.
شما می توانید ببینید که سیاهههای مربوط به سیستم رویداد ناپدید شده اند زمانی که شما ان را اجرا کنید.
SampleSceneParent
همچنین، از انجا که EventSystem
وجود دارد، دکمه های صحنه کودک می توانند فعال شوند.
رفع خطاهای AudioListeners
محتویات این گزارش به شرح زیر است.
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
این خوب است اگر نتیجه اجرای و اضافه کردن یک صحنه کودک همانطور که در شکل زیر نشان داده شده است. اطمینان حاصل کنید که هیچ سیاهههای مربوط نیز وجود ندارد.