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 分配给 AudioSource 的 AudioClip 字段。创建一个命名为 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); } }
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.