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 }