اضافه کردن یک صحنه

صفحه به روز شده :
تاریخ ایجاد صفحه :

محیط تایید

ویندوز
  • ویندوز 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

این خوب است اگر نتیجه اجرای و اضافه کردن یک صحنه کودک همانطور که در شکل زیر نشان داده شده است. اطمینان حاصل کنید که هیچ سیاهههای مربوط نیز وجود ندارد.