Coroutine dừng khi Time.timeScale = 0


7

Tôi có một coroutine thay đổi trơn tru một biến trong UI của tôi, nhưng khi tôi tạm dừng trò chơi, coroutine cũng tạm dừng. Lam sao tôi co thể sửa no?

Mã số:

using UnityEngine;
using System.Collections;

public class HUDController : MonoBehaviour {
    public void PauseGame() {
        FreezeTime();
        StartCoroutine(ShowPauseMenu());
    }

    private void FreezeTime() {
        Time.timeScale = 0;
    }

    private IEnumerator ShowPauseMenu() {
        var pauseMenuCanvasGroup = GameObject.FindWithTag("PauseMenu").GetComponent<CanvasGroup>();
        var alphaValue = 1f;
        var velocity = 0f;
        var time = 0.15f;

        while (!Mathf.Approximately(pauseMenuCanvasGroup.alpha, alphaValue)) {
            pauseMenuCanvasGroup.alpha = Mathf.SmoothDamp(pauseMenuCanvasGroup.alpha, alphaValue, ref velocity, time);
            yield return null;
        }

        pauseMenuCanvasGroup.alpha = 1; // Since float is not accurate, manually set the alpha to 1
        pauseMenuCanvasGroup.interactable = true;
    }
}

Tôi không thể tái tạo vấn đề này trong Unity 5. Trong các thử nghiệm của mình, các coroutine yield return nullhay new WaitForEndOfFrame()tiếp tục ngân nga tốt khi Time.timeScale = 0- đó chỉ yield return new WaitForSeconds(delay)là tạm dừng. Bạn có thể xác nhận phiên bản nào của Unity bạn đang chạy không?
DMGregory

@DMGregory 5.2.3f1
Milen

Làm thế nào chắc chắn bạn là thời gian là nguyên nhân? Bạn đã cố gắng không đặt thời gian về 0 và vẫn chạy coroutine?
Hd vk

Vâng, tôi đã xóa thời gian và nó vẫn chạy tốt
Milen

Có ai giúp được không?
Milen

Câu trả lời:


13

Điều này chắc chắn xảy ra vì Mathf.SmoothDampsử dụng Time.deltaTimetrong tính toán mặc định. Khi bạn đặt Time.timeScale = 0thì Mathf.SmoothDampsẽ không đưa ra giá trị mong đợi mà chỉ lặp lại giá trị đầu tiên.

Bạn có thể xác minh thêm bằng cách in giá trị alpha lên bàn điều khiển, in nó trong whilevòng lặp của bạn để bạn có thể xác nhận nó bằng các bản ghi không giới hạn có cùng giá trị.

Đây là Tài liệu về Mathf.SmoothDamp .

Bạn có thể khắc phục điều này bằng cách chuyển deltaTime của riêng bạn để ngăn nó sử dụng mặc định của nó Time.deltaTime. Chỉ cần thêm một tham số vào cuối cuộc gọi:

pauseMenuCanvasGroup.alpha = Mathf.SmoothDamp(
  pauseMenuCanvasGroup.alpha, 
  alphaValue, 
  ref velocity, 
  time,
  1000,          // <-- Fifth parameter Optionally allows you to clamp the maximum speed.
  1.0f/30.0f);   // <-- Add a sixth parameter representing your framerate.

Bạn có thể sử dụng một hàm đo thời gian thực trôi qua thay vì hằng số, nếu tốc độ khung hình kết xuất của bạn là biến.


3
Dontcha thích nó khi phương pháp làm điều gì đó hoàn toàn bất ngờ vì lý do hoàn toàn hợp lý (nếu khó phân biệt)?
Draco18 không còn tin tưởng SE

Nó không hoạt động. Nó vẫn chỉ cho giá trị đầu tiên.
Milen

@Milen yup, đó là một chút sai lầm ở đó, thực sự đó phải là tham số thứ 6 thay vì thứ 5, thứ 5 là tốc độ tối đa. Kiểm tra các chỉnh sửa
Hamza Hasan

@Milen bây giờ mã đã được kiểm tra kỹ lưỡng :) Hãy dùng thử :)
Hamza Hasan

0

Tôi đã có vấn đề này và tình hình là như thế này, và tôi đã GIẢI QUYẾT NÓ . Người dùng nhấn nút tạm dừng sau đó một số đối tượng sẽ tắt (những đối tượng này có thông báo). ĐÂY LÀ VẤN ĐỀ. Tôi không được tắt những đồ vật trong game . Các coroutines hoạt động tốt trong khi đối tượng trò chơi được bật và khi bạn tắt chúng, mọi thứ sẽ trở nên lộn xộn.

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.