U3D创建与销毁实例 ,Invoke定时函数及小demo实现
 
U3D游戏对象的实例化与销毁
实例化
准备工作–资源的导入
在U3D中可以通过在脚本中定义 public 的 Gameobject对象来获取位于Assets资源文件夹中的资源文件,并用代码控制其生成
定义以下 Gameobject 对象 可以方便的在检视面板(Inspector)中
方便的进行资源的引用操作
 要注意的是如果定义为 private 私有的话,检视面板就不能访问到从而无法进行资源的引入
要注意的是如果定义为 private 私有的话,检视面板就不能访问到从而无法进行资源的引入
实例化函数
| 1 2 3 4 5
 | GameObject.Instantiate(GameObject,Vector3,Quaternion.identity); //GameObject: 资源的引用 //Vector3: 生成后所处的位置 //Quaternion: 四元数,用来表示物体的旋转情况 //Quaternion.identity:无旋转
 | 
使用这个函数就可以在指定的位置生成引入的资源物体
一般在开发中使用一个空物体绑定脚本实现游戏物体的创建与销毁
游戏物体销毁
| 1 2 3
 | GameObject.Destory(GameObject,float); //GameObject:要销毁对象的引用 //float:销毁操作执行的延迟时间
 | 
gameObject是当前脚本所绑定对象的引用,因此可以将脚本绑定在要销毁的物体上时使用
| 1
 | GameObject.Destory(gameObject,float);
 | 
就可以完成当前对象的销毁
Invoke函数
Invoke函数是U3D中的延时执行函数,相关的几个函数都继承自MonoBehaviour类
Invoke
| 1 2 3
 | Invoke(string,float); //string:要执行的函数名称 //float:延时的时间
 | 
InvokeRepeating
| 1 2 3 4
 | InvokeRepeating(string,float,float); //string:要执行的函数名称 //第一个float:延时的时间 //第二个float:第一次执行后过多长时间再次执行
 | 
与Invoke的区别在于Invoke只会执行一次,而InvokeRepeating会执行无数次直至被停止
CancelInvoke
直接调用会停止当前脚本的所有Invoke函数,无论是正在执行中还是处在计时状态
Demo实现
使用上述的API实现盒子不断从空中掉落,玩家操作的物体碰撞到后将盒子销毁的Demo
盒子自动生成
创建一个空物体并绑定以下脚本实现自动创建盒子:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
 | using System.Collections; using System.Collections.Generic; using UnityEngine; public class creatboxs : MonoBehaviour {     //外部资源的引用     public GameObject box;     //盒子实时改变的位置     public Vector3 position; 	 	void Start () {         //定时自动执行创建盒子的方法         InvokeRepeating("AutoCreat", 1,1);      } 	 	void Update () {         //如果按下Z停止当前脚本所有的Invoke函数         if (Input.GetKeyDown(KeyCode.Z))         {             CancelInvoke();         } 	}     //自动创建盒子     void AutoCreat()     {         //使用Random.Range(min,max)随机生成盒子的位置         position = new Vector3(Random.Range(-10, 10), 20, Random.Range(-10, 10));         //使用该随机位置实例化盒子对象         Instantiate(box, position, Quaternion.identity);              } }
 | 
 
玩家物体移动
创建一个立方体添加刚体组件并绑定以下脚本实现角色控制:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
 | using System.Collections; using System.Collections.Generic; using UnityEngine; public class character : MonoBehaviour {     //玩家控制物体刚体组件     private Rigidbody m_rigid;     //玩家控制物体Transform组件     private Transform m_transform; 	void Start () {         //获取到当前游戏物体的刚体组件         m_rigid = gameObject.GetComponent<Rigidbody>();         //获取到当前游戏物体的Transform组件         m_transform = gameObject.GetComponent<Transform>();     }     void Update () {         //使用刚体移动方法         if (Input.GetKey(KeyCode.W))         {                          m_rigid.MovePosition(m_transform.position+Vector3.forward*0.2f);         }         if (Input.GetKey(KeyCode.A))         {             m_rigid.MovePosition(m_transform.position+Vector3.left * 0.2f);         }         if(Input.GetKey(KeyCode.W) && Input.GetKey(KeyCode.A))         {             m_rigid.MovePosition(m_transform.position + Vector3.Lerp(Vector3.forward * 0.2f, Vector3.left * 0.2f, 0.5f));         }         if (Input.GetKey(KeyCode.S))         {             m_rigid.MovePosition(m_transform.position+Vector3.back * 0.2f);         }         if (Input.GetKey(KeyCode.S) && Input.GetKey(KeyCode.A))         {             m_rigid.MovePosition(m_transform.position + Vector3.Lerp(Vector3.back * 0.2f, Vector3.left * 0.2f, 0.5f));         }         if (Input.GetKey(KeyCode.D))         {             m_rigid.MovePosition(m_transform.position+Vector3.right * 0.2f);         }         if (Input.GetKey(KeyCode.S) && Input.GetKey(KeyCode.D))         {             m_rigid.MovePosition(m_transform.position + Vector3.Lerp(Vector3.back * 0.2f, Vector3.right * 0.2f, 0.5f));         }         if (Input.GetKey(KeyCode.W) && Input.GetKey(KeyCode.D))         {             m_rigid.MovePosition(m_transform.position + Vector3.Lerp(Vector3.forward * 0.2f, Vector3.right * 0.2f, 0.5f));         }     } }
 | 
碰撞销毁
使用刚体碰撞事件监测并调用销毁函数:
| 1 2 3 4 5 6
 | private void OnCollisionEnter(Collision collision)    {        //为预制体添加box标签后通过该方法查找并销毁        if(collision.gameObject.tag=="box")        GameObject.Destroy(collision.gameObject);    }
 | 
