【问题标题】:Unity - Infinite sprite spawner stops spawning at a high speedUnity - 无限精灵生成器停止高速生成
【发布时间】:2015-01-29 18:21:15
【问题描述】:

我为我的 2D 汽车游戏编写了一个无限轨道的脚本。所以我在我的车后面有一个“杀手”,它摧毁了左边屏幕上出现的所有地面物体,在右边我有一个产卵器,它可以在其中产生我所有的块状精灵,它工作得很好。 这是我的更新功能:

void Update()
{
    if(Mathf.Round(this.transform.position.x) == limit)
    {
        //Debug.Log("Limit reached");
        limit += 10;
        Spawn();
    }
}

我将脚本附加到我的相机上,并且我将开始限制设置为 160(因为我已经获得了 15 个 10x10 精灵作为开始)。每次我的生成器通过 x 轴限制时,它都会在该位置生成一个新精灵并将下一个限制设置为高 10。如果我不开车太快,这很好用。因为那时它停止产卵,世界被切断。当我开车回去让我的产卵器回到已经产卵的区域并再次缓慢驶向它时,它又可以工作了。我相信这种方法效率低下,无法足够快地生成,所以我可能需要另一种方式。

为了理解这里脚本的其余部分:

using UnityEngine;
using System.Collections;

public class Spawner : MonoBehaviour
{
    public GameObject[] obj;
    private int limit = 160;
    public int yAxisValue = -1;
    public bool isOnlyDirt;
    private ArrayList rotationValues = new ArrayList();


void Start()
{
    //Spawn ();
    int value = 0;
    for(int i = 0; i < 4; i++)
    {
        rotationValues.Add(value);
        //Debug.Log(rotationValues[i]);
        value += 90;
    }
}

void Spawn()
{
    Vector3 pos = new Vector3 (Mathf.Round(transform.position.x), yAxisValue, transform.position.z);

    Quaternion rotation = new Quaternion (0, 0, 0, 0);
    if(isOnlyDirt)
    {
        int zRot = (int)rotationValues[Random.Range(0, rotationValues.Count - 1)];
        //Debug.Log(zRot);
        rotation = new Quaternion(0, 0, zRot, 0);
    }

    var SpawnedGround = Instantiate(obj[Random.Range(0, obj.GetLength(0))], pos, rotation);

    (SpawnedGround as GameObject).gameObject.tag = "Gro

我还有一个单线可以将我的刷怪笼移动到我的车前,这样它就可以生成东西了:

public float yCoord;


void Start ()
{
    this.transform.position = new Vector3 (transform.position.x + 160, -yCoord, transform.position.z);
}

我是它的父,所以我只需将它写在启动函数中。

有什么想法可以改进这个吗? 谢谢

【问题讨论】:

    标签: unity3d 2d sprite


    【解决方案1】:

    抱歉,不能以 cmets 的身份发帖。你应该试试

    if(Mathf.Round(this.transform.position.x) >= limit)
    

    而不是

    if(Mathf.Round(this.transform.position.x) == limit)
    

    我认为浮点精度正在跳过检查。

    【讨论】:

    • 哦,谢谢,这是一个非常好的主意 ^^ 并没有完全修复它,所以我留下了一些丑陋的洞,但我想出了在实例化中替换 Mathf.Round 的想法-仅具有限制的方法,现在可以使用。
    • 你也可以尝试将你的轨迹精灵对象池化并改变它们的位置......这样可以避免一直实例化和销毁相同的对象
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 2011-06-07
    • 1970-01-01
    • 2013-04-13
    • 2014-09-28
    • 1970-01-01
    相关资源
    最近更新 更多