Thêm cảnh

Trang Cập Nhật :
Ngày tạo trang :

Môi trường xác minh

Windows
  • cửa sổ 11
Biên tập viên Unity
  • 2020.3.25f1
Gói hệ thống đầu vào
  • 1.2.0

Điều kiện tiên quyết cho mẹo này

Các cài đặt sau đây đã được thực hiện trước làm tiền đề cho mô tả về mẹo này.

Giới thiệu về cách thêm cảnh

Unity cho phép bạn hiển thị nhiều cảnh cùng một lúc. Sử dụng nó khi bạn chỉ muốn phủ cảnh hoặc xuất bản vẽ của mình sang một kết cấu khác.

Lần này, tôi muốn giải thích màn hình hiển thị chồng lên nhau của cảnh giả định rằng màn hình menu được hiển thị ở nền trước trong khi trò chơi đang chạy trong khi trò chơi đang chạy.

Khi hiển thị nhiều cảnh, bạn nên lưu ý những điều sau đây:

  • Không được có nhiều hơn một EventSystem
  • Không được có nhiều hơn một Trình nghe âm thanh
  • Hãy cẩn thận khi xử lý nhiều camera

Chuẩn bị bối cảnh

Lần này, chúng tôi sẽ chuẩn bị hai cảnh. Hãy để được , và SampleSceneParentcảnh SampleSceneChild được hiển thị thêm là . Phương pháp chuẩn bị hai cảnh giống như các mẹo trước, vì vậy vui lòng tham khảo chúng.

Lần này, chúng ta sẽ tạo bố cục như sau. Nếu bạn nhấp vào nút trong cảnh cha, không có vấn đề gì ngoại trừ việc thêm cảnh con. Và sprites được đặt để dễ hiểu hơn về Canvas các triệu chứng mà bạn sẽ thấy sau này.

SampleSceneParent

SampleSceneChild

Khi nhiều cảnh được hiển thị, bối cảnh của các đối tượng phụ thuộc vào "thứ tự lớp" của từng đối tượng, bất kể đơn vị cảnh. Vì các giá trị ban đầu đều là 0, hãy để SampleSceneChild Canvas số không và sprites được đặt thành "1".

Đừng quên đặt hai cảnh trong cài đặt xây dựng.

Xử lý cảnh

Nó được xử lý bằng mã theo cách tương tự như chuyển cảnh. Lần này cũng vậy, nó được xử lý khi nút được nhấp, nhưng nó được xử lý như một bổ sung thay vì chuyển đổi cảnh.

Tên của tệp tập lệnh là tùy ý, nhưng đây SceneAdd là .

Kịch bản trông như thế này:

using UnityEngine;
using UnityEngine.SceneManagement;  // 追加

public class SceneAdd : MonoBehaviour
{
  /// <summary>ボタンをクリックしたときに呼ばれます。</summary>
  public void OnClick()
  {
    // 指定したシーンを追加します
    SceneManager.LoadScene("SampleSceneChild", LoadSceneMode.Additive);
  }
}

Khi chuyển cảnh, LoadSceneMode tôi đặt thành , Single nhưng lần Additive này là . Đó là tất cả những gì có sự khác biệt.

Sau khi SampleSceneParent bạn lưu tập lệnh, hãy đính kèm tập lệnh vào . EventSystem

Đặt phương thức trên OnClick nút.

Hãy thử chạy trò chơi để xem nó hoạt động như thế nào. Nếu bạn nhấp vào nút, bạn sẽ thấy cảnh trẻ em.

Ngoài ra, nếu bạn nhìn vào hệ thống phân cấp, bạn có thể thấy rằng có hai cảnh.

Tuy nhiên, mặc dù thực tế là cảnh đã được thêm vào, có vẻ như nội dung của Canvas của cảnh cha mẹ không được hiển thị. Ngược lại, bạn có thể thấy rằng các sprites trong cảnh cha mẹ được hiển thị ở mặt sau theo thứ tự của các lớp.

Ngoài ra, nếu bạn nhìn vào bảng điều khiển, bạn có thể thấy rằng các bản ghi liên tục được xuất ra.

Nội dung là hai điểm sau.

  • Có 2 hệ thống sự kiện trong hiện trường. Hãy đảm bảo luôn có chính xác một hệ thống sự kiện trong hiện trường
  • Có 2 người nghe âm thanh trong cảnh. Hãy đảm bảo luôn có chính xác một trình nghe âm thanh trong cảnh.

Khi sử dụng nhiều cảnh, cần phải tương ứng với hai điểm này và máy ảnh.

Sửa lỗi EventSystem

Nội dung của nhật ký như sau.

Có 2 hệ thống sự kiện trong hiện trường. Hãy đảm bảo luôn có chính xác một hệ thống sự kiện trong hiện trường

(Có hai hệ thống sự kiện trong cảnh.) Đảm bảo rằng bạn luôn có một hệ thống sự kiện trong cảnh của mình)

Như đã viết, kết hợp EventSystem thành một giải pháp sẽ giải quyết được vấn đề.

SampleSceneParent được giả định là luôn tồn tại,SampleSceneChild vì vậy hãy xóa nó khi EventSystem bạn mở nó.

Tất nhiên, xin lưu ý rằng nếu bạn tự chạy,SampleSceneChild giao diện người dùng như các nút sẽ không hoạt động.

Bạn có thể thấy rằng nhật ký EventSystem đã biến mất khi bạn chạy nó.

SampleSceneParent Ngoài ra, kể từ khi có mặt, các nút trong cảnh trẻ em có EventSystem thể được kích hoạt.

Sửa lỗi AudioListeners

Nội dung của nhật ký như sau.

Có 2 người nghe âm thanh trong cảnh. Hãy đảm bảo luôn có chính xác một trình nghe âm thanh trong cảnh.

(Có hai người nghe âm thanh trong cảnh.) Đảm bảo luôn chỉ có một trình nghe âm thanh trong cảnh. )

Main Camera Nếu bạn nhìn vào các thành phần của , bạn chắc chắn có thể thấy rằng Audio Listener tồn tại, vì vậy SampleSceneChild bạn có thể xóa Audio Listener trong . Nó có thể được giải quyết bằng cách điều khiển camera của mục tiếp theo, vì vậy chúng tôi sẽ xử lý nó ở đó.

Nếu bạn muốn giữ máy ảnh,SampleSceneChild bạn sẽ xóa Trình nghe âm thanh này.

Thay đổi máy ảnh để hiển thị hai cảnh

Đối với nguyên nhân chỉ hiển thị khung vẽ của cảnh trẻ em khi thêm cảnh con, Điều này là do có hai camera, cảnh cha mẹ và cảnh con được đặt trên khung vẽ và chỉ có một camera được hiển thị.

Giải pháp cho vấn đề này là hiển thị khung vẽ của cả hai cảnh bằng camera của cảnh cha. Quá trình này là thay thế máy ảnh trên khung vẽ của cảnh trẻ em bằng máy ảnh của cảnh cha mẹ sau khi cảnh con được thêm vào.

Hãy tạo một kịch bản. Tên là tùy ý, nhưng trong trường hợp ChildSceneCamera này là .

Kịch bản trông như thế này: Canvas Đó là một quá trình tiên quyết để gắn vào .

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 Phương thức được thực hiện lần đầu tiên đối tượng tồn tại trong cảnh. Start Thực hiện trước phương pháp. Thật tốt khi nhớ rằng bạn thường sử dụng nó thường xuyên. Lần này, người ta cho rằng nó sẽ được thực hiện khi cảnh trẻ em được thêm vào.

/// <summary>シーンに追加されたタイミングで処理されます。</summary>
void Awake()
{
  // 処理
}

Lấy canvas cảnh cha mẹ và canvas cảnh con để thay thế máy ảnh. Có nhiều cách khác nhau để làm điều đó, nhưng nó không phải là chủ đề chính, vì vậy bạn có thể nghĩ rằng bạn có thể có được nó nếu bạn làm theo cách này trong thời điểm hiện tại.

// 親のシーンのキャンバスを取得
var parentScene = SceneManager.GetSceneByName("SampleSceneParent");
var parentCanvas = parentScene.GetRootGameObjects().First(obj => obj.GetComponent<Canvas>() != null).GetComponent<Canvas>();

// 子のシーンのキャンバスを取得
var childCanvas = GetComponent<Canvas>();

Phá hủy camera Object.Destroy của cảnh trẻ em trước. Ngay cả khi nó biến mất, không có vấn đề gì vì nó có thể được bao phủ bởi camera của cảnh cha mẹ. Mục tiêu Canvas.worldCamera xóa được lấy từ . Đó chỉ là vì cùng một máy ảnh mà cảnh có tại thời điểm này được đặt và có thể dễ dàng có được. Nếu bạn thực sự muốn xóa nó, bạn nên lấy máy ảnh từ hiện trường.

// 子のシーンのカメラを削除
Object.Destroy(childCanvas.worldCamera.gameObject);

Cuối cùng, cảnh Canvas.worldCamera trẻ em được thay thế bằng máy ảnh của cha mẹ.

// 子のシーンのキャンバスのカメラを親のシーンのカメラに置き換えます
childCanvas.worldCamera = parentCanvas.worldCamera;

Sau khi SampleSceneChild bạn lưu tập lệnh, hãy đính kèm tập lệnh vào . Canvas

Sẽ ổn nếu kết quả của việc thực hiện và thêm một cảnh con như thể hiện trong hình dưới đây. Đảm bảo rằng cũng không có nhật ký.