Thêm cảnh
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à SampleSceneParent
cả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ý.