这是我关于堆栈溢出的第一个问题。我是编码新手,所以请忍受我和我可怕的代码。
void ChickenInstantiate()
{
LocOfChkn.Add(spawnLoc);
int i = 0;
for (int ChickenCount = 0; ChickenCount < maxChickenCount; ChickenCount++)
{
while (Vector3.Distance(spawnLoc, LocOfChkn[i]) < 2)
{
spawnLoc = new Vector3(Random.Range(randXMin, randXMax), Random.Range(randYMin, randYMax), 1);
spawnLoc.z = 5;
i += 1;
if (i >= LocOfChkn.Count)
{
break;
}
}
Instantiate(ChickenPrefab1, spawnLoc, Quaternion.identity);
LocOfChkn.Add(spawnLoc);
i = 0;
}
}
这是一些用于恢复预制件的代码,但要确保它不会在某个区域内实例化,并且坦率地说,我不确定如何修复它-它已完全损坏。鸡没有出现,我什至不确定它们是否在正确的区域产卵,等等。(spawnLoc的第一个实例是在启动时定义的,btw)
我正在使用Unity和Visual Studio的最新版本。
答案 0 :(得分:0)
对于添加到Instantiate
的第一个位置,您应该locOfChkn
来一只鸡。这既可以确保您的代码正在运行,又可以避免毫无障碍的地方。
使用VSCode或您最喜欢的IDE对功能进行逐步评估,以确切了解正在发生的事情。除非如此,否则为每个步骤添加Debug.Log
。
检查所有产卵鸡的层次结构。也许他们被禁用了。
现在要解决其他问题:
请遵循C#约定编写代码。 Chkn和Loc尽可能不直观。
如果在评估距离时忽略z位置,请考虑使用Vector2.Distance。
使用仅在一个函数内使用的值的字段是没有用的。只需将spawnLoc
设置为ChickenInstantiate
内的var。
这是您代码的清理版本
void InstantiateChicken()
{
List<Vector3> chickenPositions = new List<Vector3>();
for (int i = 0; i < maxChickenCount; i++)
{
bool doesCollide;
Vector3 spawnLocation;
do
{
spawnLocation = new Vector3(
Random.Range(randXMin, randXMax),
Random.Range(randYMin, randYMax),
5);
doesCollide = false;
foreach (var pos in chickPositions)
{
if (Vector2.Distance(pos, spawnLocation) < 2f)
doesCollide = true;
}
}
while (doesCollide);
Instantiate(chickenPrefab1, spawnLocation, Quaternion.identity);
chickenPositions.Add(spawnLocation);
}
}
或者,只需手动放置所有鸡只,并使其产卵时使它们的位置随机偏移即可。