unity如何制作随机生成器

随机生成器的制作至少应具备四个个要素:需要随机生成的物体、物体随机生成的间隔时间、每生成一次的物体个数、一定时间后销毁物体。

其中最关键的问题是如何间隔一定时间生成,这里提供两种思路:1.运用协程。2.做个计时器。

1.通过协程制作随机生成器。

在这里我们需要初步了解一下协程。

首先,我们常用的函数方法是没有状态的,等到它return后,它里面包含的所有局部变量就消失了,但是在协程中我们可以在一个函数中多次返回,局部变量被当做状态储存在协程函数中,直到最后一次reurn,协程的状态才被清除,即拥有随意暂停功能。

通俗来讲,协程的主要功能就是:你写一段顺序的代码,随后标明哪里需要暂停,它在下一帧或是一段时间后,系统会继续执行这段代码。

实现这个功能需要yield语句,即使用yield语句时,协程会暂停执行,并在下一帧自动恢复。

其中yield return new WaitForSeconds(x);意味着等待x秒,一段指定的时间延迟之后继续执行。

还需要StartCoroutine()方法启动协程。StartCoroutine()方法在第一个yield返回时返回,不过可以生成结果,直到协程结束。

同时,协程的方法必须写在IEnumerator中。

而既然协程可以随意暂停,我们随机生成功能倒可以给它制造一个while死循环。具体代码如下:

public class randomizer : MonoBehaviour {

    public GameObject ball;
    public float TimeJG;
    public int buildNumbers;

    void Start()
    {
        StartCoroutine(enumerator());
    }

    IEnumerator enumerator()
    {
        while (true)
        {
            for (int i = 0; i < buildNumbers; i++)
            {
                GameObject newball = Instantiate(ball);
                float X = Random.Range(1, 5);
                float Y = Random.Range(1, 5);
                float Z = Random.Range(1, 5);
                newball.transform. position = new Vector3(X, Y, Z);
                Destroy(newball, 8);
            }
            yield return new WaitForSeconds(TimeJG);
        }

    }
}

具体操作:层级窗口中创建一个空物体,可命名为randomizer,把脚本绑定给它,因为我们创建了一个GameObject类的游戏对象,所以外界需要先把层级窗口中需要随机生成的物体拖入project窗口中创建好预制体,再将预制体拖入代码中命名的ball里;同时在TimeJG中输入需要的时间间隔,在buildNumbers中输入每次生成需要的个数。然后在游戏中获取到随机生成的坐标范围,打开代码调整,分别将X、Y、Z轴的范围数值在脚本中对应修改,另外定时销毁游戏物体时间也可自行修改。

2.通过制作计时器来实现定时随机生成功能。

在FixedUpdate()方法中默认固定0.02s调用一次,假设我们声明时间间隔float TimeJG = 2秒,通过

TimeJG = TimeJG -Time.deltaTime;语句来简易的实现倒计时,当时间减到小于0时,执行我们需要的代码,但在判断中需要重新给TimeJG赋值间隔时间,否则生成一次就跳出判断停止了。具体代码如下:

public class timeLIMIT1 : MonoBehaviour {

    public GameObject ball;
    float TimeJG = 2;

    void FixedUpdate()
    {
        TimeJG = TimeJG - Time.deltaTime;
        if (TimeJG < 0)
        {
            GameObject newball = Instantiate(ball);
            TimeJG = Random.Range(1.5f, 2.0f);
            float X = Random.Range(1, 5);
            float Y = Random.Range(1, 5);
            float Z = Random.Range(1, 5);
            newball.transform.position = new Vector3(X, Y, Z);
            Destroy(newball, 8);
        }
    }
}

其具体操作和第一种方法类似,将预制体拖入GameObject类的ball中,再打开代码设置那三个参数:间隔时间,随机生成坐标,定时摧毁时间。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>