Unity 4 3D开发实战详解
上QQ阅读APP看书,第一时间看更新

4.4 与销毁相关的方法

Destroy即销毁方法,可以对项目中的游戏对象,组件或者资源进行删除销毁。在一个项目中经常会声明一些临时的变量或者资源,用完即失去了用处,这时就可以认为出现了垃圾,垃圾不仅会影响项目的运行效率而且还可能影响项目的正常运行,这时就需要调用Destroy方法。

Destroy方法不仅处理垃圾,而且在一些特定的情况下需要对项目中的游戏对象、组件或者资源进行销毁操作,以实现具体的功能操作。因此 Destroy 方法也是项目开发过程中必不可少的方法,下面讲解Destroy具体的方法,具体的信息如表4-56所示。

表4-56 不同功能的Destroy方法

下面将对各个方法进行详细介绍,将用真实的代码片段对函数的用法和用途进行讲解。

4.4.1 Object.Destroy方法

Object.Destroy方法可以将游戏对象立即销毁,也可以设置特定的时间以后销毁,如果是一个组件,将会从对应的游戏对象中移除并销毁,如果对象是一个游戏对象,在销毁时,其组件和其子对象将被转移。

下面将用一段代码片段来说明Object.Destroy方法具体的用法与用途,具体实现如下面的代码片段所示:

1 Destroy (gameObject);      //销毁指定的游戏对象

2 Destroy (this);       //删除指定游戏对象实例化的this脚本

3 Destroy (rigidbody);      //删除指定游戏对象的刚体组件

4 Destroy (gameObject, 5);     //从现在开始5s后销毁指定的游戏对象

5 function Update () {      //声明Update方法

6 if (Input.GetButton ("Fire1") && GetComponent (FooScript))//判断是否得到“Fire1”按钮和FooScript脚本

7  Destroy (GetComponent (FooScript)); //若满足条件,则销毁得到的FooScript脚本

8 }

4.4.2 Network.Destroy方法

Network.Destroy方法可以销毁整个网络上的对象,这些网络上的对象可以在本地销毁也可以在远程摧毁,首先用一段代码片段来说明Network.Destroy方法摧毁网络,具体实现如下面的代码片段所示:

1 var timer : float = 0;       //定义一个float型的时间变量

2 function Awake () {        //声明Awake方法

3 timer = Time.time;        //将当前时间赋给timer

4 }

5 function Update() {        //定义Update方法

6  if (Time.time - timer > 2) {    //判断是否当前时间比timer多2s

7  Network.Destroy(GetComponent(NetworkView).viewID);//如果条件满足,则销毁指定网络

8  } }

Network.Destroy方法还可以销毁网络上的游戏对象,下面将用一段代码片段来说明,具体实现如下面的代码片段所示:

1 var timer : float = 0;       //定义一个float型的时间变量

2 function Awake () {        //声明Awake方法

3  timer = Time.time;       //将当前时间赋给time

4 }

5 function Update() {        //定义Update方法

6  if (Time.time - timer > 2) {    //判断是否当前时间比timer多2s

7   Network.Destroy(gameObject);    //如果条件满足,则销毁指定的游戏对象

8  } }

4.4.3 EditorWindow.OnDestroy方法

EditorWindow.OnDestroy方法的作用是在EditorWindow窗口关闭时被调用,下面将用一段代码来说明,具体实现如下面的代码片段所示:

1 class TearMeshApart extends EditorWindow {//创建TearMeshApart类并继承EditorWindow

2  var noiseCounter = 0;    //声明一个初始值为0的变量noiseCounter

3  var distortionRange = 0.1;   //声明一个初始值为0.1的变量noiseCounter

4  @MenuItem("Example/Distortionate Mesh")

5  static function Init() {     //声明静态的Init方法

6   var window = GetWindow(TearMeshApart); //绘制一个窗口

7   window.position = Rect(0,0,200,80);  //设置窗口的具体坐标位置

8   window.Show();       //调用窗口显示的Show方法

9  }

10  function OnGUI() {       //声明OnGUI方法

11   GUILayout.Label("Select an object to distortionate");//利用GUI布局绘制一个标签

12   if(GUILayout.Button("Distortionate")) { //判断是否单击Distortionate按钮

13   AddNoiseToMesh();      //调用AddNoiseToMesh方法

14   }

15   if(GUILayout.Button("Close")) {   //判断是否单击Close按钮

16   this.Close();       //调用Close方法

17   }

18  }

19  function AddNoiseToMesh() {     //声明AddNoiseToMesh方法

20   //声明变量objectMesh并赋初值

21   var objectMesh =Selection.activeTransform ?

22    Selection.activeTransform.GetComponent(MeshFilter) : null;

23   if(!objectMesh) {      //判断是否存在objectMesh

24   Debug.LogError("Please select a Game Object with a MeshFilter");//打印提示信息

25   return;

26   }

27   var verts : Vector3[] = objectMesh.sharedMesh.vertices;//声明一个三维坐标数组

28   for(var i = 0; i < verts.Length; i++)//对verts的长度做循环

29   verts[i] += Vector3(    //为数组赋初值

30    Random.Range(-distortionRange, distortionRange) - distortionRange/2,

31    Random.Range(-distortionRange, distortionRange) - distortionRange/2,

32    Random.Range(-distortionRange,distortionRange)-distortionRange/2);

33   objectMesh.sharedMesh.vertices = verts;

34   noiseCounter++;       //变量noiseCounter自加

35  }

36   function OnDestroy() {//声明OnDestroy方法

37   Debug.Log("Deformed the object " + noiseCounter + " times.");//打印提示信息

38  } }

4.4.4 MonoBehaviour.OnDestory方法

MonoBehaviour.OnDestory方法的作用是在MonoBehaviour类摧毁时被调用,下面将用一段代码来说明,具体实现如下面的代码片段所示:

1 function OnDestroy () {       //声明OnDestroy方法

2  print("MonoBehaviour was destroyed");  //打印提示信息

3 }

4.4.5 ScriptableObject.OnDestory方法

ScriptableObject.OnDestory 方法的作用是在脚本化的对象将被摧毁时被调用,下面将用一段代码来说明,具体实现如下面的代码片段所示:

1 function OnDestroy () {       //声明OnDestroy方法

2  print("ScriptableObject was destroyed"); //打印提示信息

3 }

4.4.6 Object.DestoryImmediate方法

Object.DestoryImmediate方法的作用是立刻删除游戏对象、组件或者资源,如果是一个组件,将会从对应的游戏对象中移除并销毁,如果对象是一个游戏对象,在销毁时,其组件和子对象将被移除。

下面将用一段代码片段来说明Object.Destory方法具体的用法与用途,具体实现如下面的代码片段所示:

1 DestroyImmediate (gameObject);  //立即销毁指定的游戏对象

2 DestroyImmediate (this);   //立即删除指定游戏对象实例化的this脚本

3 DestroyImmediate (rigidbody);  //立即删除指定游戏对象的刚体组件

4 function Update () {    //声明Update方法

5 if (Input.GetButton ("Fire1") && GetComponent (FooScript))//判断是否得到“Fire1”按钮和FooScript脚本

6  DestroyImmediate (GetComponent (FooScript));//若满足条件,则立即销毁得到的FooScript脚本

7 }