הוספת סצינה
סביבת אימות
- חלונות
-
- חלונות 11
- עורך Unity
-
- 2020.3.25F1
- חבילת מערכת קלט
-
- 1.2.0
תנאים מוקדמים לטיפ זה
ההגדרות הבאות נקבעו מראש כהנחת יסוד לתיאור עצה זו.
אודות הוספת סצינה
אחדות מאפשרת לך להציג סצנות מרובות בו זמנית. השתמש בו כאשר אתה פשוט רוצה לכסות סצנות או לייצא את הציורים שלך למרקם אחר.
הפעם, ברצוני להסביר את התצוגה של הסצנה בהנחה שמסך התפריט מוצג בחזית בזמן שהמשחק פועל בזמן שהמשחק פועל.
בעת הצגת סצינות מרובות, עליך להיות מודע לנקודות הבאות:
- אסור שתהיה יותר ממערכת אירועים אחת
- אסור שיהיה יותר ממאזין אודיו אחד
- היזהר בעת טיפול במספר מצלמות
הכנת הסצנה
הפעם נכין שתי סצנות. יהי , והסצנה SampleSceneParent
SampleSceneChild
שתוצג בנוסף היא .
השיטה להכנת שתי סצנות זהה לטיפים הקודמים, לכן אנא עיין בהם.
הפעם, ניצור את המתווה הבא. אם תלחץ על הלחצן בסצינת האב, אין בעיה מלבד להוסיף את סצינת הצאצא.
ושדונים ממוקמים כדי להקל על 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
זה בסדר אם התוצאה של ביצוע והוספה של סצנת ילד היא כפי שמוצג באיור שלהלן. ודא שאין גם יומנים.