c#Unity 3D-1000立方体实例化脚本

本文关键字:脚本 实例化 立方体 3D-1000 c#Unity | 更新日期: 2023-09-27 18:20:11

为什么下面的脚本使Unity运行非常缓慢且不可用?

public Transform brick;
public int gridWidth=10;
public int gridDepth=10;
public int gridHeight=10;
void Start() {
    for (int y = 0; y < gridHeight; y=y+2) 
    {
        for (int z = 0; z < gridDepth; z=z+2) 
        {
            for (int x = 0; x < gridWidth; x=x+2) 
            {
                Instantiate (brick, new Vector3 (x, y, z), Quaternion.identity);
            }
        }
    }
}

在变换中,我放置了一个预制件,它基本上是一个刚体立方体。

如果我删除包含z int的For循环,它运行正常(所以10x10网格/100个立方体就可以了)。然而,当z int循环到位时,它会中断(10x10x10网格/1000立方体)

我如何才能在不让Unity无法使用的情况下让它真正合理地工作?

c#Unity 3D-1000立方体实例化脚本

我认为最好的解决方案是使用Oclussion Culling。这是一个"不渲染"活动摄像头看不到的对象的系统。

这是Unity的相关信息。

Unity手动(仅限PRO)上的视觉消隐

然而,这个功能只适用于Unity Pro用户,如果你有免费版本,你应该寻找一个像这样的自定义Oclussion Culling脚本:

视觉消隐

请记住,这只是我在网上找到的一个剧本,可能还有更好的剧本。无论如何,用剧本创作者的话来说:

在我的测试场景中,该脚本将绘制调用/tris/verts减少了80%以上,渲染器循环速度加快了85%以上,但帧速率降低了12%(从75到66 FPS)。虽然这对那些因绘制调用而陷入困境的场景来说很好,但我对任何可以减少脚本开销以使其适合一般使用的反馈都很感兴趣。

不妨去看看。

我想您可以从预制件中移除刚体;只把它留给箱式对撞机,让它静止。首先,这将使Unity能够有效地批量抽取调用。PhysX将能够利用宽相位并提高碰撞检测的性能。

我可能对这个例子看得太远了,但看起来就像你试图模拟"块ly"渲染的体素。

虽然对于非常的简单示例立方体可能会工作,但实例化、渲染和跟踪物理系统的数量有一定的限制,即使是剔除。

您应该使用一种渲染体素的方法,该方法可以生成预定义大小区域的奇异网格(通常称为"块")。这允许对每个材质进行一次绘制调用,固有的剔除速度比自动生成的任何东西都快(因为这是生成网格的"免费"副作用),消除了多个碰撞器的开销,更多

这是一项听起来比实际任务艰巨得多的任务。有很多教程会介绍你需要什么。我还发现这三个来源写得特别好。

我个人不建议尝试仅使用遮挡剔除和批处理来实现当前的方法,因为这仍然是一种效率极低的方法。还要注意的是,Unity Pro的遮挡剔除是预先计算的,所以在您的情况下不起作用。

展开一个立方体。

public Transform cubePrefab;
public int rows,columns,depth;
public float padding;
// Use this for initialization
void Start () {
    for(int i =0; i < depth; i ++) {
        for(int j=0;j< columns;j++){
            for(int k=0; k < rows;k++){
                Vector3 pos = new Vector3(k * padding,j * padding,i * padding);
                //print(pos);
                Transform foo = (Transform) Instantiate(cubePrefab,pos,Quaternion.identity);
            }
        }
    }
}