unity 切换场景不销毁物体问题的解决
作者:xmhwjzabc 发布时间:2022-04-29 11:26:06
在用unity进行游戏开发时我们有时需要一些物体在场景切换时不需要被销毁这时我们可以用官方给的DontDestroyOnLoad()方法,
这个方法可以让我们在场景切换时不销毁场景。但如果你又返回这个场景(创建不可销毁物体的场景)时就会发现会有两个这个物体(标记为不可销毁的物体)。
这个问题有一个较为简单的解决方法就是:
在物体的Awake()或Star()方法中加入这段代码。如果找到和自己一样的名字却不是自己的物体就将自己销毁,这样就解决了这个问题。(别的地方不知道,我的项目是可以用);
if (GameObject.Find("Players").gameObject != this.gameObject)
Destroy(this.gameObject);
补充:Unity加载场景、计时器、加载时不销毁某物体
异步加载场景,SceneManager.LoadSceneAsync(SceneName);需引用 using UnityEngine.SceneManagement;命名空间,
Application.LoadLevel这个方法不再适用;
可以用协同程序做一个简单的计时器,详见代码;
DontDestroyOnLoad (this.gameObject);方法可以在加载场景时不销毁指定物体;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class Base : MonoBehaviour {
public virtual void ScenesLoad(string SceneName,int AfterSomeMinutesToLoad)
{
StartCoroutine (Calculagraph(SceneName,AfterSomeMinutesToLoad));
}
IEnumerator Calculagraph(string SceneName,int AfterSomeMinutesToLoad)
{
yield return new WaitForSeconds (AfterSomeMinutesToLoad*60);
DontDestroyOnLoad (this.gameObject);
SceneManager.LoadSceneAsync(SceneName);
}
}
补充:Unity小技巧——延时销毁GameObject
当我们希望延迟一段时间销毁GameObject,Component,或者 asset 的时候可以利用下面的函数来实现。
不用自己再去实现延迟计时操作。
Destroy(Object obj, float t = 0.0F);
第二个参数单位为秒,物体将在t秒后被销毁。
using UnityEngine;
public class ScriptExample : MonoBehaviour
{
void DestroyGameObject()
{
Destroy(gameObject);
}
void DestroyScriptInstance()
{
// 立刻从gameobject上移除该脚本
Destroy(this);
}
void DestroyComponent()
{
// 从gameobject上移除rigidbody脚本
Destroy(GetComponent<Rigidbody>());
}
void DestroyObjectDelayed()
{
// 5秒后销毁当前gameobject
Destroy(gameObject, 5);
}
// 当用户按下Ctr键后,将会从gameobject上移除boxcollider脚本
void Update()
{
if (Input.GetButton("Fire1") && GetComponent<BoxCollider>())
{
Destroy(GetComponent<BoxCollider>());
}
}
}
在做编辑器扩展开发的时候,非运行时环境,只能使用 Object.DestroyImmediate()
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。
来源:https://blog.csdn.net/xmhwjzabc/article/details/84944176
猜你喜欢
- 一、什么叫做匿名类?匿名类就是没有名字的类。匿名类不能被引用,只能再创建的时候用new语句来声明。二、匿名类的优势以及应用场景;1、匿名类型
- 【前言】AOP(Aspect Orient Programming),我们一般称为面向方面(切面)编程,作为面向对象的一种补充,用于处理系统
- 本文实例为大家分享了java导出百万以上数据的excel文件,供大家参考,具体内容如下1.传统的导出方式会消耗大量的内存,2003每个she
- 本文介绍了Spring Boot 与DBunit 配合使用方法,分享给大家,具体如下:DBUnit快速上手Springboot 添加 DBu
- 一、问题Flutter原有的图片缓存机制,是通过PaintingBinding.instance!.imageCache来管理缓存的,这个缓
- 一、异步模型的基本概述异步编程的核心是 Task 和 Task<T> 对象,这两个对象对异步操作建模。 它们受关键字 async
- logback-classic 使用testCompile的打包今天使用gradle打包的时候logback-classic一直打包不进去。
- 目录Static基本规则:1. static方法2. static变量3. static代码块4. static内部类5. static静态
- 在讲述这个模式之前,我们先看一个案例:游戏回档游戏的某个场景,一游戏角色有生命力、攻击力、防御力等数据,在打Boss前和后会不一样,我们允许
- Spring容器中的Bean是否线程安全,容器本身并没有提供Bean的线程安全策略,因此可以说Spring容器中的Bean本身不具备线程安全
- 因为线程重用导致的信息错乱的bugThreadLocal一般用于线程间的数据隔离,通过将数据缓存在ThreadLocal中,可以极大的提升性
- 本文主要带大家看看Object类中一些常用方法的API文档的介绍和JDK中的源码。1.equals方法1.API中equals方法的介绍2.
- 网络唤醒实现了对网络的集中管理,即在任何时刻,网管中心的IT管理人员可以经由网络远程唤醒一台处于休眠或关机状态的计算机。使用这一功能,IT管
- 最近项目中要做一个带进度条的上传文件的功能,学习了AsyncTask,使用起来比较方便,将几个方法实现就行,另外做了一个很简单的demo,希
- Mybatis所需要的jar包:需要引用两个jar包,一个是mybatis,另一个是MySQL-connector-Java,如果是mave
- 1、应用场景:从一份html文件中或从String(是html内容)中提取纯文本,去掉网页标签;2、代码一:replaceAll搞定//从h
- 前言哎呀,妈呀,又出异常了!俗话说:“代码虐我千百遍,我待代码如初恋”。小Alan最近一直在忙着工作,已经很久没有写写东西来加深自己的理解了
- 使用方法:先把mvcpager.dll引用加入mvc项目中。前台代码前台:@{Layout = null;}@using Webdiyer.
- 本文介绍spring中自定义缓存resolver,通过自定义resolver,可以在spring的cache注解中增加附加处理。一、概述ca
- VAR 是3.5新出的一个定义变量的类型其实也就是弱化类型的定义VAR可代替任何类型编译器会根据上下文来判断你到底是想用什么类型的至于什么情