Unity关于销毁和保留物体

最近在做VR项目的时候,当我从A场景跳到B场景,但是它使用的还是A场景的手柄和眼镜,并没有把A场景的手柄和眼镜销毁,而它使用的是unity内置的一个函数,一开始通过查资料,我发现只要不勾选Persist On Load,在进入下一个场景之后,便不会再保存上一个场景的手柄和眼镜,而这种加载另外一个场景而保存前一个场景的物品,是通过Unity内置的一种销毁方式来实现的,本节就来讲一下unity里面的几种销毁和保留的方式。
这里写图片描述
方法一:Object.Destroy
public static void Destroy(Object obj, float t = 0.0F);
前面的参数是要被销毁的物体或者是组件,后面是多少时间后被销毁
使用起来非常简单
方法二:Object.DontDestroyOnLoad
public static void DontDestroyOnLoad(Object target);
其实这种销毁方式也很简单,我们可以自己做一下试验,新建一个场景A,再新建一个场景B,我们通过在A场景点击按钮,加载B场景:
这里写图片描述
同时新建一个加载的脚本LoadB,在A场景创建一个Cube什么的,作为我们加载场景之后要保存的物体,把脚本挂上去,脚本如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class LoadB : MonoBehaviour {

    private void Awake()
    {
        DontDestroyOnLoad(this.gameObject);
    }
    void Start () {

    }

    // Update is called once per frame
    void Update () {

    }
    public void LoadBScene()
    {
        SceneManager.LoadScene("B");
    }
}

运行,可以发现我们的场景中多了一个DontDestroyOnLoad的场景
这里写图片描述
就算我们加载到下一个场景,它也是存在的,所以说,这种销毁方式特别适用于在我们切换场景后,但又还要用到上一个场景的物品的情况。
方法三:Object.DestroyImmediate
public static void DestroyImmediate(Object obj, bool allowDestroyingAssets = false);
官方解释:
This function should only be used when writing editor code since the delayed destruction will never be invoked in edit mode. In game code you should use Object.Destroy instead. Destroy is always delayed (but executed within the same frame). Use this function with care since it can destroy assets permanently! Also note that you should never iterate through arrays and destroy the elements you are iterating over. This will cause serious problems (as a general programming practice, not just in Unity).
这个方法是运用于编辑器模式下操作,一旦删除了物体,就永久都被删除,而在游戏运行时,还是建议使用Destroy()方法。

Unity中,销毁物体的计数可以通过以下几种方法实现。 第一种方法是使用变量进行计数。我们可以使用一个整型变量来记录销毁物体数量。当需要销毁一个物体时,将计数值加一。例如,在销毁一个物体的函数中,可以使用一个整型变量count来记录销毁物体数量,代码如下: ``` int count = 0; void DestroyObject(GameObject obj) { Destroy(obj); count++; } ``` 第二种方法是使用静态变量进行计数。静态变量是指在类中声明的变量,可以在类的所有实例之间共享。我们可以在一个类中声明一个静态整型变量来记录销毁物体数量。当需要销毁一个物体时,将静态计数值加一。例如: ``` public class ObjectManager : MonoBehaviour { public static int count = 0; public void DestroyObject(GameObject obj) { Destroy(obj); count++; } } ``` 使用上述方法,我们可以在其他地方通过访问count变量来获取销毁物体数量。 第三种方法是使用Unity的计时器来实现。我们可以使用Invoke函数在一定时间后执行一个特定的方法,通过该方法来统计销毁物体数量。例如: ``` float delay = 5.0f; // 设置一个延迟时间,例如5秒 void DestroyObject(GameObject obj) { Destroy(obj); Invoke("CountObjects", delay); } void CountObjects() { int count = GameObject.FindObjectsOfType(typeof(GameObject)).Length; Debug.Log("销毁物体数量:" + count); } ``` 以上是三种常用的计数方法,使用任何一种都可以实现统计Unity销毁物体的数量。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ToDoNothing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值