Unity 物体跨场景--DontDestroyOnLoad的使用

本文介绍了Unity中如何使用DontDestroyOnLoad保持物体在场景切换时不被销毁,以实现音效模块或联网模块的持久存在。文章详细讲解了DontDestroyOnLoad的基本用法,并针对场景重复进入导致物体数量增加的问题,提供了三种解决方案:确保在初始场景调用、检查场景中物体存在性以及静态初始化脚本。通过这些方法,可以有效管理跨场景的物体实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DontDestroyOnLoad的使用

DontDestroyOnLoad(Gameobject) 它的作用就是让某物体创建之后不再随场景切换而销毁.例如音效模块\联网模块等都需要.

1.最简单的使用:

 void Start()
 {
 DontDestroyOnLoad(GameObject XXX);
}

2.直接这样使用的话会出现一个坑:当跳转到其他的场景后,每次跳回该场景的时候都会再增加一个该物体.
解决方案:
a.把DontDestroyOnLoad的调用写到最初始的场景,并且保证相应的场景中不存在再次进入的可能性
b.在每次调用DontDestroyOnLoad的时候,都去判断场景中是否有对应的物体,如果没有再去创建


using UnityEngine;
using System.Collections;

public class Test: MonoBehaviour {

    public GameObject prefab;          // 这是个预制,直接拖拽赋值
    GameObject clone;                  // 用来接收预制的克隆体
### Unity 中 `DontDestroyOnLoad` 场景查找 GameObject 在 Unity 中,当希望某些游戏对象不随场景切换而销毁时,通常会使用 `DontDestroyOnLoad(this.gameObject)` 函数来保持这些对象的存在[^1]。对于那些被标记为 `DontDestroyOnLoad` 的对象,在新的场景加载之后仍然可以通过多种方式找到它们。 #### 使用 `FindObjectOfType` 一种常用的方式是利用 `FindObjectOfType<T>()` 方法获取特定类型的单个实例。如果只有一个此类的对象存在于整个项目中,则此方法非常有效: ```csharp public class Example : MonoBehaviour { void Start() { MyPersistentObject persistentObj = FindObjectOfType<MyPersistentObject>(); Debug.Log(persistentObj.name); } } ``` 这种方法适用于已知类型且仅有一个实例的情况[^2]。 #### 遍历所有活动的游戏对象 另一种更通用的方法是从根节点开始遍历当前场景中的所有活动游戏对象,并通过名称或其他属性匹配目标对象: ```csharp public class SceneSearcher : MonoBehaviour { private void OnEnable(){ foreach (Transform transform in UnityEngine.SceneManagement.SceneManager.GetActiveScene().GetRootGameObjects()) { if(transform.GetComponent<MyComponent>()){// 或者其他条件判断 // Do something with the found object. } } } } ``` 这种方式允许更加灵活的选择标准,但性能开销相对较大。 #### 利用标签或层进行筛选 为了提高效率和准确性,可以在创建持久化对象时为其设置独特的标签或者分配到专门的图层上,这样就可以借助于 `GameObject.FindWithTag()` 和 `Physics.Raycast()` 等函数快速定位所需的目标。 ```csharp // 基于标签寻找 GameObject obj = GameObject.FindGameObjectWithTag("MyTag"); // 结合射线检测按层次查询 if(Physics.Raycast(ray, out hitInfo)){ var target = hitInfo.collider.gameObject; } ``` 以上就是在 Unity 中针对 `DontDestroyOnLoad` 标记过的场景下查找游戏对象的一些常见手段[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值