【Unity3D】利用预设、实例化Instantiate和协程完成生成器

生成器这东西在游戏中很常见,不如我们要随机产生敌人,就需要用到这东西。说白了,我就是需要一个东西在我的要求下,产生大量的对象。在Unity3D直接就提供接口能够轻松完成这一些,我开始还以为生成器是用Unity3D的粒子系统Particle System做的,其实不是,本身就有预设和实例化Instantiate帮你轻松完成一起。当然,生成也要遵守Unity3D的基本法则啊,不能说生成就生成,需要定时生成。定时生成,不应该在Update()函数中用汇编语言那种轮询挂起的方式时刻在判断的方式,Unity3D提供协程概念帮你完成定时任务。下面就用一个简单的例子来说明这一切吧。


如上图,只要我轻松点击鼠标右键一下,就会有大量的立方体Cube落下来,要是这是金币、玩具或者巧克力多爽啊!然后我再点鼠标右键之下就会停止落下,就像关闭阀门一样。同时,这里生成立方体不是暴力了,每0.2s一个而已,不然显卡要爆,尤其我这种渣i3集显。

那么上述程序如何做呢?

一、场景布置

1、2D部分没什么好说的,请自行参照《【Unity3D】公告栏与开始界面的布置》(点击打开链接)与《【Unity3D】UGUI自适应屏幕与锚点》(点击打开链接)布置好一个Text同时做一个自适应屏幕。


2、3D部分如下图所示。立方体和平面请自行赋予黑色纯色材质,材质使用不懂可以参考《【Unity3D】物体、材质的设置、物体位移与旋转》(点击打开链接)。


3、之后我们要给立方体Cube附上如下的脚本Cube.cs,非常简单。其实本来不写也行,只是对于那些飞出视野外的立方体还是自觉销毁吧,不然游戏一直计算它疯狂落下,飞流直下三千尺,疑似银河落九天的立方体,在接近y负无穷的位置还在被CPU计算着坐标,简直CPU要炸。不会添加脚本可以参考《【Unity3D】Helloworld》(点击打开链接)。

using UnityEngine;
using System.Collections;

public class Cube : MonoBehaviour
{

    // Use this for initialization
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        if (gameObject.transform.position.y < -2)//一旦掉出Plane
        {
            GameObject.Destroy(gameObject);//摧毁物件
        }
    }

}
4、设置预设,这是布置场景关键的一步。如下图,和你设置材质一样,在Assets设置一个Prefab。


之后直接将Cube拖进这个Prefab,这东西就是一个预设,意为:这东西以后将被复制多次,而Prefab中的就是模板。

此步必须在我们完全设置好Cube,包括赋予好脚本,才能施行。


二、脚本编写

之后我们将为空物体GameObject赋予如下的Create.cs脚本。

using UnityEngine;
using System.Collections;

public class Create : MonoBehaviour
{

    private IEnumerator coroutine;
    private bool isStart = false;//用于控制生成器是否进行的flag
    public GameObject CreateObject;//设置物体形式参数

    void Start()
    {
        coroutine = WaitAndPrint(0.2f);//WaitAndPrint函数将0.2s执行一次
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(1))//如果按下鼠标右键
        {
            if (!isStart)//没开始
            {
                StartCoroutine(coroutine);//则打开这个生成器呗
                isStart = true;
            }
            else
            {
                StopCoroutine(coroutine);//否则销毁
                isStart = false;
                coroutine = WaitAndPrint(0.2f);//当然,销毁之后要留种,为下次再打开作准备              
            }
        }
    }

    private IEnumerator WaitAndPrint(float waitTime)//协程coroutine的存在,配合下面的yield return回调,这段代码将被0.2s执行一次
    {
        while (true)
        {
            GameObject.Instantiate(CreateObject, gameObject.transform.position, gameObject.transform.rotation);//其实就这一段代码
            //CreateObject是被生成的物体,第二第三个参数分别指生成的位置与方向,这里就是穿过来的位置的当前位置和方向了
            yield return new WaitForSeconds(waitTime);
        }
    }

}
然后在编辑器设置这个脚本的CreateObject就是指那个Prefab,如图:


至此,发布,整个工程做完。下面重点说说,上面脚本的意思,也就是本文的重点。

1、GameObject中的形式参数CreateObject就是指预设Prefab,也就是Prefab被传进去这脚本Create.cs以变量CreateObject的存在。这个传值,可以参看《【Unity3D】同场景物体传值与Vector》(点击打开链接),这里不再赘述了。

2、上面脚本,复制物体,来来去去就是一行GameObject.Instantiate(CreateObject, gameObject.transform.position, gameObject.transform.rotation);。

GameObject.Instantiate()方法能将一个预设Prefab复制一次,这在Unity3D被称作预设实例化Instantiate。

所以这些专有名词就是用来唬人的,其实一点都不难。

3、上面脚本,利用到Unity3D的协程,也就是Coroutine完成了一个类似Java定时器Timer的功能。《【Java】定时器、线程与匿名内部类》(点击打开链接)。

不是我瞎写的,是直接从Unity3D的API抄下来用的:https://docs.unity3d.com/ScriptReference/MonoBehaviour.StartCoroutine.html


对照API和这个实现功能的脚本,估计大家已经明白得差不多了。

这里用到了一个C#一个貌似没什么卵用,但又复杂的概念IEnumerator。其实根本就不用管他,照抄就是。整段函数和JavaScript中的setInterval,具体见《【JavaScript】一个同步于本地时间的动态时间》(点击打开链接)非常相似,或者更应该说是settimeout,只要我们指明的了函数名,和时间间隔,它就会老老实实地自动执行了。

  • 11
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Unity中,预制件和实例化是非常常见的概念。预制件是一种可重复使用的对象,可以创建多个实例。而实例化则是在场景中创建一个新的对象实例,该实例可以被修改、移动和删除,而不会影响预制件或其他实例。 下面是一个简单的示例,演示如何在Unity中添加对象实例: 1. 首先,打开Unity编辑器并创建一个新场景。 2. 在场景中创建一个新的空对象,此空对象将用作容器来保存实例化的对象。 3. 然后,创建一个新的预制件。您可以在项目视图中右键单击,选择“Create”->“Prefab”,然后将其命名为“Cube”。 4. 将预制件拖动到场景中的容器对象中,这将创建一个预制件的实例。 5. 在场景中选择容器对象,然后在Hierarchy视图中右键单击并选择“Create Empty”,这将创建另一个空对象。 6. 您现在可以将此新对象命名为“SpawnPoint”,以便于识别。 7. 接下来,打开脚本编辑器并创建一个新的C#脚本。将以下代码添加到脚本中: ``` using UnityEngine; public class SpawnObject : MonoBehaviour { public GameObject objectToSpawn; public Transform spawnPoint; void Start() { Instantiate(objectToSpawn, spawnPoint.position, spawnPoint.rotation); } } ``` 8. 在场景中选择SpawnPoint对象,然后将SpawnObject脚本添加到该对象上。 9. 在SpawnObject脚本组件中,将objectToSpawn属性设置为Cube预制件,并将spawnPoint属性设置为SpawnPoint对象的Transform组件。 10. 您现在可以运行场景,并查看Cube预制件的实例化。您可以尝试通过更改SpawnPoint对象的位置来更改实例化的位置,并且可以通过更改Cube预制件的属性来更改实例化的外观。 希望这个示例能够帮助您了解Unity中的预制件和实例化的基本概念,以及如何将它们用于创建对象实例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值