Version: 2020.2

Object.DontDestroyOnLoad

切换到手册
public static void DontDestroyOnLoad (Object target);

参数

target Scene 改变时不销毁的 Object。

描述

在加载新的 Scene 时,请勿销毁 Object。

加载新的 Scene 会销毁所有现有的 Scene 对象。调用 Object.DontDestroyOnLoad 可以在关卡加载期间保留 Object。如果目标 Object 是组件或 GameObject,Unity 还会保留 Transform 的所有子项。 Object.DontDestroyOnLoad 不会返回值。

以下示例脚本便使用了 Object.DontDestroyOnLoad。该示例中的 scene1 开始播放来自 AudioSource 的背景音乐。在 scene2 加载时,音乐继续播放。使用一个按钮可以切换场景。

要实现此示例,我们创建两个新的 Scene,分别名为 scene1 和 /scene2/。打开 /scene1/,将 SceneSwap.cs 脚本添加到空的 GameObject,然后将其命名为 /Menu/。接着,将 DontDestroy.cs 添加到新的 GameObject,然后将其命名为 /BackgroundMusic/。将一个 AudioSource 添加到 BackgroundMusic - Add Component > Audio > Audio Source - 并将一个 AudioClip 导入项目中。将 AudioClip 分配给 AudioSourceAudioClip 字段。创建一个命名为 music 的标签,然后将其添加到 /BackgroundMusic/。切换到 /scene2/。同样,将 SceneSwap.cs 添加到新的 GameObject,然后将其命名为 scene1。保存项目。返回到 scene1 并从 Editor 中运行项目。

SceneSwap.cs 脚本:

using UnityEngine;
using UnityEngine.SceneManagement;

// Object.DontDestroyOnLoad example. // // Two scenes call each other. This happens when OnGUI button is clicked. // scene1 will load scene2; scene2 will load scene1. Both scenes have // the Menu GameObject with the SceneSwap.cs script attached. // // AudioSource plays an AudioClip as the game runs. This is on the // BackgroundMusic GameObject which has a music tag. The audio // starts in AudioSource.playOnAwake. The DontDestroy.cs script // is attached to BackgroundMusic.

public class SceneSwap : MonoBehaviour { private void OnGUI() { int xCenter = (Screen.width / 2); int yCenter = (Screen.height / 2); int width = 400; int height = 120;

GUIStyle fontSize = new GUIStyle(GUI.skin.GetStyle("button")); fontSize.fontSize = 32;

Scene scene = SceneManager.GetActiveScene();

if (scene.name == "scene1") { // Show a button to allow scene2 to be switched to. if (GUI.Button(new Rect(xCenter - width / 2, yCenter - height / 2, width, height), "Load second scene", fontSize)) { SceneManager.LoadScene("scene2"); } } else { // Show a button to allow scene1 to be returned to. if (GUI.Button(new Rect(xCenter - width / 2, yCenter - height / 2, width, height), "Return to first scene", fontSize)) { SceneManager.LoadScene("scene1"); } } } }

DontDestroy.cs 脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// Object.DontDestroyOnLoad example. // // This script example manages the playing audio. The GameObject with the // "music" tag is the BackgroundMusic GameObject. The AudioSource has the // audio attached to the AudioClip.

public class DontDestroy : MonoBehaviour { void Awake() { GameObject[] objs = GameObject.FindGameObjectsWithTag("music");

if (objs.Length > 1) { Destroy(this.gameObject); }

DontDestroyOnLoad(this.gameObject); } }