U3D创建与销毁实例 ,Invoke定时函数及小demo实现
U3D游戏对象的实例化与销毁
实例化
准备工作–资源的导入
在U3D中可以通过在脚本中定义 public 的 Gameobject对象来获取位于Assets资源文件夹中的资源文件,并用代码控制其生成
定义以下 Gameobject 对象 可以方便的在检视面板(Inspector)中
方便的进行资源的引用操作
要注意的是如果定义为 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); }
|