我的问题是在随机生成的2d流道中,不同尺寸的预制件之间保持相同的间距。
我想每秒产生一个新的游戏对象
假设我有一个名为Square的简单精灵
我使用协程生成它,并且距离始终等于运动的1s
我添加了不同大小的正方形阵列作为预制件,当我以1个单位正方形生成它时,我希望预制件之间具有相同的距离,就像我要一个接一个地生成单个正方形一样。
基本上,我希望生成不同大小的预制件,并通过在不同预制件之间保持相同的距离来以相同的间隔生成它们。
也许解决方案是根据预制件之间的测量距离生成预制件,而不是根据时间生成
您如何解决这个问题?
我可以根据子对象数组的宽度来计算空gameObject的宽度吗?
我希望你能理解我在问什么
谢谢!
void Start() {
stvaranjeFunkc();
}
// Update is called once per frame
void Update() {
if (privremeniNiz.tag == "zamka")
{
if (privremeniNiz.transform.position.x + privremeniNiz.transform.localScale.x / 2 < stvarac.transform.position.x - vrijednostGranice)
stvaranjeFunkc();
}
if (privremeniNiz.tag == "nizPreprekaZamka")
{
// if ((privremeniNiz.GetComponent<nizKutija>().niz[privremeniNiz.GetComponent<nizKutija>().randomBrKutija].transform.position.x + privremeniNiz.GetComponent<nizKutija>().niz[privremeniNiz.GetComponent<nizKutija>().randomBrKutija].transform.localScale.x / 2)
//> stvarac.transform.position.x - vrijednostGranice)
if ((privremeniNiz.gameObject.GetComponent<nizKutija>().niz[0].transform.position.x + privremeniNiz.GetComponent<nizKutija>().niz[0].transform.localScale.x / 2)
> stvarac.transform.position.x - vrijednostGranice)
return;
// if (privremeniNiz.GetComponent<nizKutija>().niz[privremeniNiz.GetComponent<nizKutija>().randomBrKutija].transform.position.x + privremeniNiz.GetComponent<nizKutija>().niz[privremeniNiz.GetComponent<nizKutija>().randomBrKutija].transform.localScale.x / 2 < stvarac.transform.position.x - vrijednostGranice)
stvaranjeFunkc();
}
//if (!cekanje)
// StartCoroutine(stvaranje());
//else return;
}
void stvaranjeFunkc()
{
int poz = Random.Range(0, prepreka.Length);
GameObject temp =Instantiate(prepreka[poz], stvarac.transform.position, stvarac.transform.rotation);
privremeniNiz = temp;
}
当我有简单的游戏对象(tag = zamka)时,我却能正常工作,但是当我 生成标签为nizPreprekaZamka的游戏对象,它是一个空的游戏对象,具有附加的脚本,该脚本创建了简单对象的数组。生成器只会一次生成数百个游戏对象。
答案 0 :(得分:0)
您可能知道游戏水平滚动的速度。我假设您正在跟踪每个块的位置,并且可以知道它们的宽度。
诀窍是在屏幕外生成块,以便您始终有足够的内容滚动到视图中以覆盖下一帧。
屏幕外有多少内容?我假设您只是将新块追加到数组的末尾。这意味着最后一块永远是离屏幕最远的一块,这对我们有帮助。它还有助于了解屏幕的大小。在这种情况下,您可以将屏幕外的内容量计算为last block position + its length + fixed_space - screen size
,其中fixed_space
是每个块后所需的空间量。
检查每帧是否滚动速度>屏幕外内容。如果是这样,则需要生成一个新块。您的广告块的开始位置应该恰好是屏幕外内容的结束位置。
答案 1 :(得分:0)
GameObject
的位置位于其中心,而scale是其总大小。
因此,对象的边缘位于其位置加上比例尺的一半:
float distance = transform.position.x + (transform.scale.x / 2f);
因此,对于每个新的预制件,您都希望添加两个GameObject的中心和边缘之间的距离以及应将它们分开的距离。
public GameObject[] prefabs;
public float distanceBetweenObjects;
float newPosition = prefabs[0].transform.position.x;
newPosition += (prefabs[0].transform.scale.x / 2f);
newPosition += distanceBetweenObjects;
newPosition += (prefabs[1].transform.scale.x / 2f);