最近在做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()方法。