Trạng thái trò chơi
Đã kiểm tra với phiên bản: 5.5
– –
Độ khó: Trung cấp
Giai đoạn 6 dạy bạn làm thế nào để tạo ra một hệ thống để tải các cảnh trong khi bảo quản trạng thái trò chơi bằng cách sử dụng Scene Manager, ScriptableObjects như lưu trữ dữ liệu thời gian chạy tạm thời, các đại biểu và các biểu thức lambda. Tải xuống gói nội dung cho Giai đoạn 6 tại đây.https://www.assetstore.unity3d.com/en/?&_ga=2.57590442.1082230255.1536856804-659907597.1536596969#!/content/76791
Tải xuống gói nội dung cho Giai đoạn 6 tại Cửa hàng tài sản hợp nhất tại đây.https://www.assetstore.unity3d.com/en/?&_ga=2.158294330.1082230255.1536856804-659907597.1536596969#!/content/76791
SceneController
Expand view
Copy code
using System;
using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;
public class SceneController : MonoBehaviour
{
public event Action BeforeSceneUnload;
public event Action AfterSceneLoad;
public CanvasGroup faderCanvasGroup;
public float fadeDuration = 1f;
public string startingSceneName = "SecurityRoom";
public string initialStartingPositionName = "DoorToMarket";
public SaveData playerSaveData;
private bool isFading;
private IEnumerator Start ()
{
faderCanvasGroup.alpha = 1f;
playerSaveData.Save (PlayerMovement.startingPositionKey, initialStartingPositionName);
yield return StartCoroutine (LoadSceneAndSetActive (startingSceneName));
StartCoroutine (Fade (0f));
}
public void FadeAndLoadScene (SceneReaction sceneReaction)
{
if (!isFading)
{
StartCoroutine (FadeAndSwitchScenes (sceneReaction.sceneName));
}
}
private IEnumerator FadeAndSwitchScenes (string sceneName)
{
yield return StartCoroutine (Fade (1f));
if (BeforeSceneUnload != null)
BeforeSceneUnload ();
yield return SceneManager.UnloadSceneAsync (SceneManager.GetActiveScene ().buildIndex);
yield return StartCoroutine (LoadSceneAndSetActive (sceneName));
if (AfterSceneLoad != null)
AfterSceneLoad ();
yield return StartCoroutine (Fade (0f));
}
private IEnumerator LoadSceneAndSetActive (string sceneName)
{
yield return SceneManager.LoadSceneAsync (sceneName, LoadSceneMode.Additive);
Scene newlyLoadedScene = SceneManager.GetSceneAt (SceneManager.sceneCount - 1);
SceneManager.SetActiveScene (newlyLoadedScene);
}
private IEnumerator Fade (float finalAlpha)
{
isFading = true;
faderCanvasGroup.blocksRaycasts = true;
float fadeSpeed = Mathf.Abs (faderCanvasGroup.alpha - finalAlpha) / fadeDuration;
while (!Mathf.Approximately (faderCanvasGroup.alpha, finalAlpha))
{
faderCanvasGroup.alpha = Mathf.MoveTowards (faderCanvasGroup.alpha, finalAlpha,
fadeSpeed * Time.deltaTime);
yield return null;
}
isFading = false;
faderCanvasGroup.blocksRaycasts = false;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63