2016-03-28 13 views
5

Khi bạn gọi hàm LoadScene() hiện nó có chuyển đổi cảnh ngay lập tức hay không, đơn giản là tín hiệu cảnh cần được thay đổi? Tài liệu cho LoadScene() không nói.Khi nào chức năng LoadScene() trong Unity thay đổi cảnh?

Các ví dụ cụ thể tôi đang làm việc với ngoại hình như thế này:

LoadScene(levelName); 
ItemBox newBox = (ItemBox)Instantiate(...); 

Vì vậy, với các mã trên, sẽ là newBox tồn tại trong bối cảnh đó chúng ta chỉ cần nạp, hoặc nó sẽ được tạo ra trong cảnh cũ, sau đó bị phá hủy khi mức mới được tải.

Trả lời

8

Đó là

UnityEngine.SceneManagement.SceneManager.LoadScene("Gameplay"); 

và vâng nó có phải nó "ngay lập tức" - đó là để nói s ynchronously.

Nói cách khác, nó "dừng" ở dòng mã đó, đợi cho đến khi nó tải toàn bộ cảnh (ngay cả khi mất một vài giây) và cảnh mới bắt đầu.

Không sử dụng lệnh cũ mà bạn đề cập trong câu hỏi.

Lưu ý rằng Unity cũng có khả năng làm a tải đồng bộ .. nó "tải chậm cảnh mới trong nền".

Tuy nhiên: Tôi khuyến khích bạn chỉ nên sử dụng "LoadScene" thông thường. Tất cả những vấn đề đó là độ tin cậy và sự đơn giản. Người dùng chỉ cần đừng bận tâm nếu máy chỉ "dừng" trong vài giây trong khi mức tải.

(Mỗi lần tôi nhấp vào "Netflix" trên truyền hình của tôi, phải mất một thời gian cho TV để làm điều đó ai quan tâm -. Nó là bình thường.)

Nhưng nếu bạn muốn tải ở chế độ nền , đây là cách ...

public void LaunchGameRunWith(string levelCode, int stars, int diamonds) 
    { 
    .. analytics 
    StartCoroutine(_game(levelCode, superBombs, hearts)); 
    } 

private IEnumerator _game(string levelFileName, int stars, int diamonds) 
    { 
    // first, add some fake delay so it looks impressive on 
    // ordinary modern machines made after 1960 
    yield return new WaitForSeconds(1.5f); 

    AsyncOperation ao; 
    ao = UnityEngine.SceneManagement.SceneManager.LoadSceneAsync("Gameplay"); 

    // here's exactly how you wait for it to load: 
    while (!ao.isDone) 
     { 
     Debug.Log("loading " +ao.progress.ToString("n2")); 
     yield return null; 
     } 

    // here's a confusing issue. in the new scene you have to have 
    // some sort of script that controls things, perhaps "NewLap" 
    NewLap newLap = Object.FindObjectOfType<NewLap>(); 
    Gameplay gameplay = Object.FindObjectOfType<Gameplay>(); 

    // this is precisely how you conceptually pass info from 
    // say your "main menu scene" to "actual gameplay"... 
    newLap.StarLevel = stars; 
    newLap.DiamondTime = diamonds; 

    newLap.ActuallyBeginRunWithLevel(levelFileName); 
    } 

Lưu ý: tập lệnh đó trả lời câu hỏi về cách bạn truyền thông tin "từ trình đơn chính" khi người chơi nhấn "vào cảnh chơi trò chơi thực tế".

+0

Cảm ơn bạn đã phản hồi nhanh! – Umibozu

+1

['LoadScene'] (http://docs.unity3d.com/ScriptReference/SceneManagement.SceneManager.LoadScene.html) thực sự là ** đồng bộ **, [không] (http://stackoverflow.com/questions/748175/asynchronous-vs-synchronous-execution-what-does-it-really-mean) ** không đồng bộ **. Để tải cảnh không đồng bộ, hãy sử dụng ['LoadSceneAsync'] (http://docs.unity3d.com/ScriptReference/SceneManagement.SceneManager.LoadSceneAsync.html) – AquaGeneral

+0

hi @AquaGeneral, đúng, twas chỉ là lỗi đánh máy. – Fattie

Các vấn đề liên quan