Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#世界地砖地图生成器问题_C#_Unity3d - Fatal编程技术网

C#世界地砖地图生成器问题

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++,

我正在制作一个游戏,其中包含一个1000 x 1000的正方形平铺地图,但我遇到了一些问题

我试着用两种不同的脚本来处理这个问题。第一个是对我需要的东西草率的处理。我的第二个脚本是一个更有效的方法来满足我的需要

脚本1:

 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循环。如果这是你正在采取的路线,我也同意这两个脚本都不比另一个“更有效”。你能解释更多关于使用双循环的内容吗?我还在学习基础知识。