เพิ่มฉาก

ปรับปรุงหน้า :
วันที่สร้างเพจ :

สภาพแวดล้อมการตรวจสอบ

หน้าต่าง
  • หน้าต่าง 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

ไม่เป็นไรหากผลลัพธ์ของการดําเนินการและเพิ่มฉากลูกดังแสดงในรูปด้านล่าง ตรวจสอบให้แน่ใจว่าไม่มีบันทึกเช่นกัน