הוספת סצינה

עודכן דף :
תאריך יצירת דף :

סביבת אימות

חלונות
  • חלונות 11
עורך Unity
  • 2020.3.25F1
חבילת מערכת קלט
  • 1.2.0

תנאים מוקדמים לטיפ זה

ההגדרות הבאות נקבעו מראש כהנחת יסוד לתיאור עצה זו.

אודות הוספת סצינה

אחדות מאפשרת לך להציג סצנות מרובות בו זמנית. השתמש בו כאשר אתה פשוט רוצה לכסות סצנות או לייצא את הציורים שלך למרקם אחר.

הפעם, ברצוני להסביר את התצוגה של הסצנה בהנחה שמסך התפריט מוצג בחזית בזמן שהמשחק פועל בזמן שהמשחק פועל.

בעת הצגת סצינות מרובות, עליך להיות מודע לנקודות הבאות:

  • אסור שתהיה יותר ממערכת אירועים אחת
  • אסור שיהיה יותר ממאזין אודיו אחד
  • היזהר בעת טיפול במספר מצלמות

הכנת הסצנה

הפעם נכין שתי סצנות. יהי , והסצנה SampleSceneParentSampleSceneChild שתוצג בנוסף היא . השיטה להכנת שתי סצנות זהה לטיפים הקודמים, לכן אנא עיין בהם.

הפעם, ניצור את המתווה הבא. אם תלחץ על הלחצן בסצינת האב, אין בעיה מלבד להוסיף את סצינת הצאצא. ושדונים ממוקמים כדי להקל על Canvas הבנת הסימפטומים שתראה מאוחר יותר.

SampleSceneParent

SampleSceneChild

כשמוצגות סצנות מרובות, ההקשר של העצמים תלוי ב"סדר השכבות" של כל עצם, ללא קשר ליחידת הסצינה. מכיוון שהערכים ההתחלתיים הם כולם 0, השאר SampleSceneChild Canvas את ה- no וה- 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 שמירת קובץ ה- Script, צרף אותו ל- . EventSystem

הגדר את השיטה על הלחצן OnClick .

נסה להפעיל את המשחק כדי לראות כיצד הוא פועל. אם תלחץ על הכפתור, תראה את סצנת הילד.

כמו כן, אם אתה מסתכל על ההיררכיה, אתה יכול לראות שיש שתי סצנות.

עם זאת, למרות העובדה שהסצנה נוספה, נראה כי התוכן של קנבס סצנת האב אינו מוצג. לעומת זאת, ניתן לראות שהשדונים בסצנת האב מוצגים בצד האחורי בהתאם לסדר השכבות.

כמו כן, אם אתה מסתכל על הקונסולה, אתה יכול לראות כי היומנים הם פלט כל הזמן.

התוכן הוא שתי הנקודות הבאות.

  • ישנן 2 מערכות אירועים בסצנה. אנא ודאו שתמיד יש בדיוק מערכת אירועים אחת בזירה
  • ישנם 2 מאזיני אודיו בסצנה. אנא ודא שתמיד יש בדיוק מאזין אודיו אחד בסצנה.

בעת שימוש במספר סצנות, יש צורך להתאים את שתי נקודות אלה ואת המצלמה.

תיקון שגיאות EventSystem

תוכן היומן הוא כדלקמן.

ישנן 2 מערכות אירועים בסצנה. אנא ודאו שתמיד יש בדיוק מערכת אירועים אחת בזירה

(ישנן שתי מערכות אירועים בסצנה.) ודא שתמיד יש לך מערכת אירועים אחת בסצנה שלך)

כפי שנכתב, שילוב של EventSystem לפתרון אחד יפתור את הבעיה.

SampleSceneParent ההנחה היא שהוא קיים תמיד,SampleSceneChild לכן מחק אותו בעת EventSystem פתיחתו.

כמובן, שים לב שאם אתה פועל לבד,SampleSceneChild ממשק המשתמש כגון לחצנים לא יעבוד.

באפשרותך לראות שיומני הרישום של EventSystem נעלמו בעת הפעלתו.

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 שמירת קובץ ה- Script, צרף אותו ל- . Canvas

זה בסדר אם התוצאה של ביצוע והוספה של סצנת ילד היא כפי שמוצג באיור שלהלן. ודא שאין גם יומנים.