C#世界地砖地图生成器问题
我正在制作一个游戏,其中包含一个1000 x 1000的正方形平铺地图,但我遇到了一些问题 我试着用两种不同的脚本来处理这个问题。第一个是对我需要的东西草率的处理。我的第二个脚本是一个更有效的方法来满足我的需要 脚本1:C#世界地砖地图生成器问题,c#,unity3d,C#,Unity3d,我正在制作一个游戏,其中包含一个1000 x 1000的正方形平铺地图,但我遇到了一些问题 我试着用两种不同的脚本来处理这个问题。第一个是对我需要的东西草率的处理。我的第二个脚本是一个更有效的方法来满足我的需要 脚本1: void fill() { for (float i = 0; i != 1000; i++) { Instantiate(GameObject.Find("Dirt"), new Vector2(xPos++,
void fill()
{
for (float i = 0; i != 1000; i++)
{
Instantiate(GameObject.Find("Dirt"), new Vector2(xPos++, yPos), Quaternion.identity);
xrepeat++;
if (xrepeat == 1000)
{
xPos = 0;
yPos = yPos - 1;
yrepeat++;
if(yrepeat != 1000)
{
i = 0;
xPos = 0;
}
if(xPos < 0) //Prevents an overflow.
{
break;
}
}
}
第一个脚本将我的污垢块复制了1000次,然后将y轴减去1并重复,直到达到配额。这种方法奏效了,但在工作快结束时就放弃了。第二个脚本在x轴和y轴之间来回乒乓球,检查1000个配额,但由于某种原因它冻结了
我几乎放弃了脚本1而选择了脚本2,因为我认为脚本2更有效
有什么办法可以让脚本2正常工作吗?我强烈建议查看Unity的作业系统,但您的循环令人难以置信地混乱,不知道会发生什么。。。看来你已经把事情复杂化了。因此,如果我必须全部实例化1000x1000个图块,我将以这种方式实例化这些图块:
public int mapWidth = 30;
public int mapHeight = 30;
void fill()
{
// Doing this once at the beginning, so it isn't super expensive...
GameObject basePrefab = GameObject.Find("Dirt");
// Creating 1 Vector3 that we can just update the values on
Vector3 spawnPosition = Vector3.zero;
for(int x = 0; x < mapWidth; ++x)
{
// Update the spawn x Position
spawnPosition.x = x;
for(int y = mapHeight; y > 0; y--)
{
// Update the spawn y position
spawnPosition.y = y;
Instantiate(basePrefab, spawnPosition, Quaternion.identity);
}
}
}
public int mapWidth=30;
公共地图高度=30;
填空()
{
//开始时只做一次,所以不会太贵。。。
GameObject baseprefabride=GameObject.Find(“污垢”);
//创建一个向量3,我们只需更新其上的值
Vector3位置=Vector3.0;
对于(int x=0;x0;y--)
{
//更新“繁殖y”位置
位置y=y;
实例化(baseprefact、spawnPosition、Quaternion.identity);
}
}
}
如果你想阅读或看到一个类似于平铺贴图的系统的对象池的例子,这里有一个我不久前写的答案,它应该给你一个灵感:我强烈建议你研究Unity的作业系统,但是你的循环令人难以置信地困惑,不确定那里发生了什么。。。看来你已经把事情复杂化了。因此,如果我必须全部实例化1000x1000个图块,我将以这种方式实例化这些图块:
public int mapWidth = 30;
public int mapHeight = 30;
void fill()
{
// Doing this once at the beginning, so it isn't super expensive...
GameObject basePrefab = GameObject.Find("Dirt");
// Creating 1 Vector3 that we can just update the values on
Vector3 spawnPosition = Vector3.zero;
for(int x = 0; x < mapWidth; ++x)
{
// Update the spawn x Position
spawnPosition.x = x;
for(int y = mapHeight; y > 0; y--)
{
// Update the spawn y position
spawnPosition.y = y;
Instantiate(basePrefab, spawnPosition, Quaternion.identity);
}
}
}
public int mapWidth=30;
公共地图高度=30;
填空()
{
//开始时只做一次,所以不会太贵。。。
GameObject baseprefabride=GameObject.Find(“污垢”);
//创建一个向量3,我们只需更新其上的值
Vector3位置=Vector3.0;
对于(int x=0;x0;y--)
{
//更新“繁殖y”位置
位置y=y;
实例化(baseprefact、spawnPosition、Quaternion.identity);
}
}
}
如果您想阅读或查看类似于平铺贴图的系统的对象池示例,下面是我不久前写的一个答案,它应该会给您带来灵感:“我的第二个脚本是实现我需要的更有效的方法”。。。那你能描述一下你需要什么吗?你没有告诉我们,你也不想让我们猜。但我最好的猜测是:谷歌。“但它因为某种原因冻结了”,这就是调试器的作用。在战略位置放置一些断点(或记录/打印一些消息-‘aka poor man's debugation’)并查看它的作用。你可以通过删除游戏对象来提高效率。查找(“污垢”)每个循环,因为每次你实例化一个新的游戏对象时,这会变得更昂贵,其次,不要创建“平铺”对于每个对象,我建议查看对象池。顺便提一下,这是非常有用的建议。我决定通过在buildy()中将xPos更改为0来进一步清理第二个脚本,但它似乎仍然冻结。我研究了对象池,并尝试让玩家认为他们周围还有其他瓷砖,但事实上,只有当玩家打破相邻的瓷砖时,才会创建瓷砖。老实说,我不认为这两个脚本中的任何一个比另一个“更有效”。。。只需使用双for循环。如果这是你正在采取的路线,我也同意这两个脚本都不比另一个“更有效”。你能解释更多关于使用双循环的内容吗?我仍在学习基础知识。“我的第二个脚本是一个更有效的方法来满足我的需要”。。。那你能描述一下你需要什么吗?你没有告诉我们,你也不想让我们猜。但我最好的猜测是:谷歌。“但它因为某种原因冻结了”,这就是调试器的作用。在战略位置放置一些断点(或记录/打印一些消息-‘aka poor man's debugation’)并查看它的作用。你可以通过删除游戏对象来提高效率。查找(“污垢”)每个循环,因为每次你实例化一个新的游戏对象时,这会变得更昂贵,其次,不要创建“平铺”对于每个对象,我建议查看对象池。顺便提一下,这是非常有用的建议。我决定通过在buildy()中将xPos更改为0来进一步清理第二个脚本,但它似乎仍然冻结。我研究了对象池,并尝试让玩家认为他们周围还有其他瓷砖,但事实上,只有当玩家打破相邻的瓷砖时,才会创建瓷砖。老实说,我不认为这两个脚本中的任何一个比另一个“更有效”。。。只需使用双for循环。如果这是你正在采取的路线,我也同意这两个脚本都不比另一个“更有效”。你能解释更多关于使用双循环的内容吗?我还在学习基础知识。