Màn hình tải mượt mà giữa các cảnh


14

Tôi đã tạo một màn hình tải để hiển thị hình ảnh động khi cảnh tiếp theo đang tải. Tôi tải cảnh tiếp theo không đồng bộ với:

yield return SceneManager.LoadSceneAsync(scene,LoadSceneMode.Additive);

Và cũng được thiết lập Application.backgroundLoadingPriority = ThreadPriority.Low;, nhưng hành vi vẫn giống như một mức tải thông thường.

Tui bỏ lỡ điều gì vậy?

Hành vi dự kiến:

  • Mức thoát, và mờ dần.
  • Màn hình đang tải xuất hiện.
  • Sau khi tải xong, mờ dần tải màn hình ra.
  • Mất dần trong cảnh tiếp theo.

Chuyện gì đang xảy ra:

  • Mức thoát, và mờ dần.
  • Đang tải màn hình, đóng băng
  • Đột nhiên cảnh mới mờ dần trong.

Khi tải bắt đầu, trò chơi sẽ tự động đóng băng, giống như với tải Cảnh thông thường.

Tôi đọc rằng bạn phải thiết lập allowSceneActivation = false, để bạn có thể làm mờ màn hình tải ra, và sau đó đặt nó để truecho phép thống nhất tải xong, nhưng điều này hoàn toàn đóng băng trò chơi của tôi, như hoạt động async không bao giờ kết thúc tải.


Tôi đã có vấn đề này và không tìm thấy bất cứ điều gì ở đây. Sau khi googling tôi tìm ra những gì đã gây ra vấn đề này. Tôi quyết định đăng nó ở đây để người khác có thể tìm thấy câu trả lời dễ dàng. Xin vui lòng cho tôi biết nếu bạn sẽ thêm một số cải tiến cho câu trả lời / câu hỏi của tôi. Cảm ơn!
Leo

Câu trả lời:


18

Khi bạn tải một cảnh với SceneManager.LoadSceneAsync()thực tế có hai điều xảy ra:

  • GameObjects của cảnh được tải vào bộ nhớ.
  • Sau đó, toàn bộ cảnh được kích hoạt. Tất cả các cuộc gọi lại Awake () và Start () sẽ được gọi cho các đối tượng trong cảnh.

Bước thứ hai, cho phép cảnh, là những gì thực sự đóng băng sự thống nhất, bởi vì sự thống nhất đang chạy tất cả các cuộc gọi lại khởi tạo trong các tập lệnh của bạn trong một chu kỳ.

Trên thực tế thiết SceneManager.LoadSceneAsync().allowSceneActivationđể falsesẽ làm cho hoạt động async để hoàn thành chỉ là bước đầu tiên của quá trình này, và sẽ đợi cho đến khi nó được thiết lập đểtrue bắt đầu phần thứ hai của quá trình này.

Nhưng nếu bạn thiết lập allowSceneActivationđể falsevà năng suất trên gọi lại như thế này, bạn sẽ cố định trò chơi của bạn cho tốt:

AsyncOperation AO = SceneManager.LoadSceneAsync(scene,LoadSceneMode.Additive); 
AO.allowSceneActivation = false;
yield return AO;

//Fade the loading screen out here

AO.allowSceneActivation = true;

Tại sao? Bởi vì bạn đang nói với hoạt động Async không tiến hành bước thứ hai của tải cảnh, nên thao tác sẽ không bao giờ được hoàn thành.

Nếu bạn muốn biết khi nào phần đầu tiên của hoạt động đã sẵn sàng, để sau đó tiến hành phần thứ hai, bạn phải dựa vào AsyncOperation.progress. Giá trị này sẽ dừng lại ngay 0.9fkhi nó chờallowSceneActivation cờ.

Nó sẽ là một cái gì đó như thế này:

AsyncOperation AO = SceneManager.LoadSceneAsync(scene,LoadSceneMode.Additive); 
AO.allowSceneActivation = false;
while(AO.progress < 0.9f)
{
    yield return null
}

//Fade the loading screen out here

AO.allowSceneActivation = true;

Nếu bạn muốn kích hoạt cảnh không đóng băng trò chơi của mình, thì bạn nên giữ các cuộc gọi lại Awake và Bắt đầu ở mức tối thiểu và khởi tạo các tập lệnh của bạn trong một coroutine qua nhiều chu kỳ.


0

Tôi đã có cùng một vấn đề chính xác trong Unity 5.6 và đã thử thêm vào báo cáo lợi tức. Chính LoadSceneAsync đã chặn luồng chính của Unity và ngăn cảnh hiện tại hiển thị độc đáo bất kỳ tiến trình tải nào.

Nó dường như là một lỗi trong Unity theo như tôi có thể nói. Khi cảnh của tôi ít phức tạp hơn, mã của tôi hoạt động rất tốt, chuyển tiếp suôn sẻ. Khi nó trở nên lớn hơn, Unity đã chặn chuỗi trong khoảng 6 giây, trong khi trò chơi vẫn ở trạng thái 'không phản hồi' mặc dù hoạt động được cho là "không đồng bộ"

Cách tôi giải quyết vấn đề là nhìn vào ánh sáng của tôi. Đã có những lỗi lớn trong quá khứ với ánh sáng và tính năng này. Vì vậy, tôi đã đi qua các đối tượng của mình và thấy rằng tôi có một điểm sáng trên một đối tượng (mặc dù nó đã bị vô hiệu hóa ...)

Tôi đã xóa ánh đèn sân khấu, và hoan hô! Cảnh tải async đúng cách! Không khóa!


Trước khi chỉnh sửa, bài đăng này không thực sự cung cấp giải pháp cho vấn đề. Bây giờ bạn đã thêm một bản sửa lỗi, nhưng trong tương lai nếu bạn muốn nói "Tôi cũng gặp vấn đề này" thì bạn không nên sử dụng câu trả lời cho mục đích đó. Kiếm được một ít đại diện sẽ cho phép bạn nhận xét về các bài đăng hiện có hoặc đặt tiền thưởng cho các câu hỏi để khuyến khích câu trả lời mới.
DMGregory
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.