เพิ่มฉาก
สภาพแวดล้อมการตรวจสอบ
- หน้าต่าง
-
- หน้าต่าง 11
- บรรณาธิการ Unity
-
- ปี 2020.3.25f1
- แพ็คเกจระบบอินพุต
-
- 1.2.0
ข้อกําหนดเบื้องต้นสําหรับเคล็ดลับนี้
การตั้งค่าต่อไปนี้ได้ทําไว้ล่วงหน้าเพื่อเป็นหลักฐานสําหรับคําอธิบายของเคล็ดลับนี้
เกี่ยวกับการเพิ่มฉาก
Unity ช่วยให้คุณสามารถแสดงหลายฉากในเวลาเดียวกัน ใช้เมื่อคุณต้องการวางซ้อนฉากหรือส่งออกภาพวาดของคุณไปยังพื้นผิวอื่น
คราวนี้ฉันอยากจะอธิบายการแสดงผลซ้อนทับของฉากโดยสมมติว่าหน้าจอเมนูจะแสดงในเบื้องหน้าในขณะที่เกมกําลังทํางานในขณะที่เกมกําลังทํางานอยู่
เมื่อแสดงหลายฉากคุณควรระวังสิ่งต่อไปนี้:
- ต้องมี EventSystem ไม่เกินหนึ่งระบบ
- ต้องมี Audio Listener ไม่เกินหนึ่งตัว
- โปรดใช้ความระมัดระวังในการจัดการกล้องหลายตัว
เตรียมฉาก
คราวนี้เราจะเตรียมสองฉาก ปล่อยให้เป็นและ SampleSceneParent
ฉาก SampleSceneChild
ที่จะแสดงเพิ่มเติมคือ .
วิธีการเตรียมสองฉากนั้นเหมือนกับเคล็ดลับก่อนหน้านี้ดังนั้นโปรดดูพวกเขา
คราวนี้เราจะสร้างเลย์เอาต์ต่อไปนี้ ถ้าคุณคลิกปุ่มในฉากแม่ จะไม่มีปัญหายกเว้นการเพิ่มฉากลูก
และสไปรท์ถูกวางไว้เพื่อให้ง่ายต่อการ Canvas
เข้าใจอาการที่คุณจะเห็นในภายหลัง
ตัวอย่าง SceneParent
ตัวอย่าง SceneChild
เมื่อแสดงหลายฉากบริบทของวัตถุจะขึ้นอยู่กับ "ลําดับเลเยอร์" ของแต่ละวัตถุโดยไม่คํานึงถึงหน่วยฉาก
เนื่องจากค่าเริ่มต้นเป็น 0 ทั้งหมด ให้ปล่อย SampleSceneChild
Canvas
no และสไปรท์ที่ตั้งค่าเป็น "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
ปุ่ม
ลองรันเกมเพื่อดูว่ามันทํางานอย่างไร หากคุณคลิกปุ่มคุณจะเห็นฉากลูก
นอกจากนี้หากคุณดูลําดับชั้นคุณจะเห็นว่ามีสองฉาก
อย่างไรก็ตามแม้จะมีการเพิ่มฉากแต่ดูเหมือนว่าเนื้อหาของ Canvas ของฉากหลักจะไม่ปรากฏขึ้น ในทางกลับกันคุณจะเห็นว่าสไปรท์ในฉากแม่จะแสดงที่ด้านหลังตามลําดับของเลเยอร์
นอกจากนี้หากคุณดูที่คอนโซลคุณจะเห็นว่าบันทึกถูกส่งออกอย่างต่อเนื่อง
เนื้อหามีสองประเด็นดังต่อไปนี้
- มี 2 ระบบเหตุการณ์ในที่เกิดเหตุ โปรดตรวจสอบให้แน่ใจว่ามีระบบเหตุการณ์เดียวในฉากเสมอ
- มีผู้ฟังเสียง 2 คนในฉาก โปรดตรวจสอบให้แน่ใจว่ามีผู้ฟังเสียงหนึ่งคนในฉากเสมอ
เมื่อใช้หลายฉากจําเป็นต้องสอดคล้องกับสองจุดนี้และกล้อง
แก้ไขข้อผิดพลาดของ EventSystem
เนื้อหาของบันทึกมีดังนี้
มี 2 ระบบเหตุการณ์ในที่เกิดเหตุ โปรดตรวจสอบให้แน่ใจว่ามีระบบเหตุการณ์เดียวในฉากเสมอ
(มีระบบเหตุการณ์สองระบบในฉาก) ตรวจสอบให้แน่ใจว่าคุณมีระบบเหตุการณ์เดียวในฉากของคุณเสมอ)
ตามที่เขียนไว้การรวม EventSystem ไว้ในโซลูชันเดียวจะช่วยแก้ปัญหาได้
SampleSceneParent
สันนิษฐานว่ามีอยู่SampleSceneChild
เสมอดังนั้นให้ลบออกเมื่อคุณ EventSystem
เปิด
แน่นอนโปรดทราบว่าหากคุณเรียกใช้ด้วยตัวเองSampleSceneChild
UI เช่นปุ่มจะไม่ทํางาน
คุณจะเห็นว่า แฟ้มบันทึก EventSystem ได้หายไปเมื่อคุณเรียกใช้
SampleSceneParent
นอกจากนี้เนื่องจากมีอยู่EventSystem
ปุ่มในฉากเด็กสามารถเปิดใช้งานได้
แก้ไขข้อผิดพลาด AudioListeners
เนื้อหาของบันทึกมีดังนี้
มีผู้ฟังเสียง 2 คนในฉาก โปรดตรวจสอบให้แน่ใจว่ามีผู้ฟังเสียงหนึ่งคนในฉากเสมอ
(มีผู้ฟังเสียงสองคนในฉาก) ตรวจสอบให้แน่ใจว่ามีผู้ฟังเสียงเพียงคนเดียวในฉากตลอดเวลา )
Main Camera
หากคุณดูส่วนประกอบของ คุณจะเห็นได้ว่า Audio Listener มีอยู่อย่างแน่นอนดังนั้น SampleSceneChild
คุณสามารถลบ Audio Listener ใน .
สามารถแก้ไขได้โดยการควบคุมกล้องของรายการถัดไปดังนั้นเราจะจัดการกับมันที่นั่น
หากคุณต้องการเก็บกล้องSampleSceneChild
ไว้คุณจะลบ Audio Listener นี้
เปลี่ยนกล้องเพื่อแสดงสองฉาก
สําหรับสาเหตุที่แสดงเฉพาะผืนผ้าใบของฉากเด็กเมื่อเพิ่มฉากย่อย นี่เป็นเพราะมีกล้องสองตัวฉากแม่และฉากเด็กตั้งอยู่บนผืนผ้าใบและแสดงกล้องเพียงตัวเดียว
วิธีแก้ปัญหานี้คือการแสดงผืนผ้าใบของทั้งสองฉากด้วยกล้องของฉากแม่ กระบวนการนี้คือการเปลี่ยนกล้องบนผืนผ้าใบของฉากเด็กด้วยกล้องของฉากแม่หลังจากเพิ่มฉากเด็กแล้ว
มาสร้างสคริปต์กันเถอะ ชื่อเป็นโดยพลการ แต่ในกรณีนี้ 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
ไม่เป็นไรหากผลลัพธ์ของการดําเนินการและเพิ่มฉากลูกดังแสดงในรูปด้านล่าง ตรวจสอบให้แน่ใจว่าไม่มีบันทึกเช่นกัน