Unity3D游戏开发预备课(七)

U3D创建与销毁实例 ,Invoke定时函数及小demo实现


welcome

U3D游戏对象的实例化与销毁

实例化

准备工作–资源的导入

在U3D中可以通过在脚本中定义 public 的 Gameobject对象来获取位于Assets资源文件夹中的资源文件,并用代码控制其生成
定义以下 Gameobject 对象 可以方便的在检视面板(Inspector)中
方便的进行资源的引用操作

1
public GameObject box;


可以使用鼠标拖拽的方式进行资源的引入
要注意的是如果定义为 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

1
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);
}


Demo展示效果

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. U3D游戏对象的实例化与销毁
    1. 1.1. 实例化
      1. 1.1.1. 准备工作–资源的导入
      2. 1.1.2. 实例化函数
    2. 1.2. 游戏物体销毁
  2. 2. Invoke函数
    1. 2.1. Invoke
    2. 2.2. InvokeRepeating
    3. 2.3. CancelInvoke
  3. 3. Demo实现
    1. 3.1. 盒子自动生成
    2. 3.2. 玩家物体移动
    3. 3.3. 碰撞销毁