Unity - 无限精灵生成器停止高速生成
Unity - Infinite sprite spawner stops spawning at a high speed
我为无限轨道的 2D 汽车游戏编写了脚本。所以我在我的车后面有一个 "killer",它摧毁了屏幕左侧和右侧的所有地面 objects 我有一个生成器,可以生成我所有的块状精灵,它工作得很好.
这是我的更新函数:
void Update()
{
if(Mathf.Round(this.transform.position.x) == limit)
{
//Debug.Log("Limit reached");
limit += 10;
Spawn();
}
}
我将脚本附加到我的相机,并将开始限制设置为 160(因为我已经有 15 个 10x10 精灵作为开始)。每次我的生成器通过 x-axis-limit 时,它都会在这个位置生成一个新的精灵,并将下一个限制设置为高 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
我还有一个 one-liner 可以将我的生成器移到我的车前,这样它就可以生成东西了:
public float yCoord;
void Start ()
{
this.transform.position = new Vector3 (transform.position.x + 160, -yCoord, transform.position.z);
}
我是它的父母,所以我只需要在开始函数中写它。
有什么改进这个的想法吗?
谢谢
抱歉不能post作为评论。你应该试试
if(Mathf.Round(this.transform.position.x) >= limit)
而不是
if(Mathf.Round(this.transform.position.x) == limit)
我认为浮点精度正在跳过检查。
我为无限轨道的 2D 汽车游戏编写了脚本。所以我在我的车后面有一个 "killer",它摧毁了屏幕左侧和右侧的所有地面 objects 我有一个生成器,可以生成我所有的块状精灵,它工作得很好. 这是我的更新函数:
void Update()
{
if(Mathf.Round(this.transform.position.x) == limit)
{
//Debug.Log("Limit reached");
limit += 10;
Spawn();
}
}
我将脚本附加到我的相机,并将开始限制设置为 160(因为我已经有 15 个 10x10 精灵作为开始)。每次我的生成器通过 x-axis-limit 时,它都会在这个位置生成一个新的精灵,并将下一个限制设置为高 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
我还有一个 one-liner 可以将我的生成器移到我的车前,这样它就可以生成东西了:
public float yCoord;
void Start ()
{
this.transform.position = new Vector3 (transform.position.x + 160, -yCoord, transform.position.z);
}
我是它的父母,所以我只需要在开始函数中写它。
有什么改进这个的想法吗? 谢谢
抱歉不能post作为评论。你应该试试
if(Mathf.Round(this.transform.position.x) >= limit)
而不是
if(Mathf.Round(this.transform.position.x) == limit)
我认为浮点精度正在跳过检查。