4.1.1 DontSave:保留对象到新场景

功能说明:此属性的功能是用来设置是否将Object对象保留到新的场景(Scene)中,如果使用HideFlags.DontSave,则Object对象将在新场景中被保留下来,对其使用说明如下。

(1)如果GameObject对象被HideFlags.DontSave标识,则在新scene中GameObject的所有组件将被保留下来,但其子类GameObject对象不会被保留到新scene中。

(2)不可以对GameObject对象的某个组件如Transform进行HideFlags.DontSave标识,否则无效。

(3)即使程序已经退出,被HideFlags.DontSave标识的对象会一直存在于程序中,造成内存泄漏,对HideFlags.DontSave标识的对象在不需要或程序退出时需要使用DestroyImmediate手动销毁。

实例演示:下面通过实例演示属性DontSave的使用。

本实例工程包含两个场景,下面是场景DontSave_unity中的脚本代码:

using UnityEngine;
using System.Collections;

public class DontSave_ts : MonoBehaviour {
    public GameObject go;
    public Transform t;
    void Start()
    {
        //GameObject对象使用HideFlags.DontSave可以在新scene中被保留
        go.hideFlags = HideFlags.DontSave;
        GameObject Pl = GameObject.CreatePrimitive(PrimitiveType.Plane);
        Pl.hideFlags = HideFlags.DontSave;
        //不可以对GameObject的组件设置HideFlags.DontSave,否则无效
        Transform tf = Instantiate(t, go.transform.position + new Vector3(2.0f, 0.0f, 0.0f), Quaternion.identity) as Transform;
        tf.hideFlags = HideFlags.DontSave;
        //导入名为newScene_unity的新scene
        Application.LoadLevel("newScene2_unity");
    }
}



在这段代码中,分别对场景中GameObject对象go、新创建的GameObject对象Pl和新实例化的Transform实例tf的hideFlags属性设置为HideFlags.DontSave,然后导入名为newScene2_unity的新场景。


下面是场景newScene2_unity中的脚本代码:


using UnityEngine;
using System.Collections;

public class NewScene2_ts : MonoBehaviour {
    GameObject cube, plane;
	void Start () {
        Debug.Log("这是NewScene2!");
	}
    //当程序退出时用DestroyImmediate()销毁被HideFlags.DontSave标识的对象
    //否则即使程序已经退出,被HideFlags.DontSave标识的对象依然在Hierarchy面板中
    //即每运行一次程序就会产生多余对象,造成内存泄漏
    void OnApplicationQuit()
    {
        cube = GameObject.Find("Cube0");
        plane = GameObject.Find("Plane");
        if (cube)
        {
            Debug.Log("Cube0 DestroyImmediate");
            DestroyImmediate(cube);
        }
        if (plane)
        {
            Debug.Log("Plane DestroyImmediate");
            DestroyImmediate(plane);
        }
    }
}



在这段脚本中,首先声明了两个GameObject类型的变量cube和plane,然后在OnApplicationQuit()方法中查找当前场景中是否存在名为Cube0和Plane的GameObject对象,如果存在,则在程序退出时将它们立即销毁。图4-1为程序启动前场景中的物体,图4-2为程序启动后场景中的物体,图4-3为在程序退出时未将场景中被保留的物体销毁时的结果(即把场景newScene2_unity脚本中OnApplicationQuit()中的代码注释掉后程序的运行结果)。如果在程序退出时销毁了被ideFlags.DontSave标识的对象,则程序退出后状态如图4-1所示。