关于实例化的建议?
Advice on Instantiation?
这是我在 Stack Overflow 上的第一个问题。我是一个编码新手,所以请多多包涵我和我可怕的代码。
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 的第一个实例是在启动时定义的,顺便说一句)
我正在使用当前最新版本的 unity 和 visual studio。
您应该 Instantiate
一只鸡作为您添加到 locOfChkn
的第一个位置。这既可以确保您的代码是 运行,又可以避免无鸡的地方。
使用 VSCode 或您最喜欢的 IDE 对您的功能进行逐步评估,以准确了解发生了什么。除此之外,为每个步骤添加 Debug.Log
s。
检查任何生成的鸡的层次结构。也许他们是残疾人。
现在解决其他问题:
请遵循 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);
}
}
或者,只需手动放置所有的鸡,并让它们在产卵时通过随机因素偏移它们的位置。
这是我在 Stack Overflow 上的第一个问题。我是一个编码新手,所以请多多包涵我和我可怕的代码。
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 的第一个实例是在启动时定义的,顺便说一句)
我正在使用当前最新版本的 unity 和 visual studio。
您应该
Instantiate
一只鸡作为您添加到locOfChkn
的第一个位置。这既可以确保您的代码是 运行,又可以避免无鸡的地方。使用 VSCode 或您最喜欢的 IDE 对您的功能进行逐步评估,以准确了解发生了什么。除此之外,为每个步骤添加
Debug.Log
s。检查任何生成的鸡的层次结构。也许他们是残疾人。
现在解决其他问题:
请遵循 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);
}
}
或者,只需手动放置所有的鸡,并让它们在产卵时通过随机因素偏移它们的位置。