繁体   English   中英

在 Unity 的网格上动态生成 3D 对象的最佳方法是什么?

[英]What is the best way to dynamically generate 3D objects on a grid in Unity?

我是一个没有经验的程序员,我正在寻找关于一个新的统一项目的建议:

我需要从相当大的瓷砖为 3d 游戏生成地形。 现在我只需要一种类型的磁贴,但我在想,我现在最好设置一个注册表系统,并在无限网格中动态生成默认磁贴。 不过,我有一些担忧,比如当角色移动到新图块(或块,如果你愿意)的渲染距离时,对象是否会继续加载。 此外,我发现的所有教程在某种程度上对我来说都是错误的,比如它只适用于 2d 并且没有碰撞,或者只是一个 static 注册表并且不允许更改游戏中瓷砖的内容。

现在我什至不知道在场景中放置 3d object 而不从向量构建它们的代码是什么样的,也许我可以这样做。 我也不知道我想如何触发代码。

有人可以让我了解代码的外观/查找术语/提供我需要的教程吗?

对于新程序员来说,这看起来像是一个相当大的 scope,但让我们试一试。 当您不知道自己在做什么时,在性能和优化方面生成地形将是一次重要的学习体验。

首先,您可能想要制作一个脚本,充当 controller 用于生成对象并将其放入播放器中。 我会从只生成一个小区域或一个块开始,然后在您了解自己在做什么时继续生成多个块。 要在场景中“放置”一个 object,您需要创建一个 object 的实例 我首先尝试创建对象网格,这可以通过 for 循环在初始化(Start() 函数)时非常容易地完成,用于测试目的。 IE,如果你想像 minecraft 一样制作 16x16 的方块; 有一个运行 16 次的 for 循环(对于 x)和一个运行 16 次的 for 循环(对于 z)。 这样你就可以制作一个完整的正方形,在这种情况下,立方体。 这里有一些非常未经测试的代码,只是为了给你一个我正在谈论的例子。

public GameObject cube; //Cube you want to make a copy of, this will appear in the editor
void Start(){
    for(var x=0; x < 16; x++){
        for(var z=0; z < 16; z++){
           GameObject newCube = Instantiate(cube); //Creates an instance of the 'cube' object, think of this like a copy.
           newCube.transform.position = new Vector3(x, 0, z); //Places the cube on the x and z which is updated in the for loops
        }
    }
}

现在,您从这里开始的 go 将非常不同,具体取决于您正在尝试做什么,但您可以从研究perlin 噪声开始,添加一个看起来不错的随机 y 水平。 一旦你掌握了一般概念,它就很容易使用,我提供的这个例子应该可以帮助你理解如何使用它。 他们甚至在 Unity 文档中给出了如何使用它的很好的例子。

总之,编程就是学习。 您必须学习如何仅获取您尝试创建的资源所需的部分资源。 我认为我为您提供的内容应该让您对想要创建的内容有一个良好的开端,但需要更深入的了解才能自行完成。 只需测试不同的东西并真正尝试并了解它们是如何工作的,您就可以将它们的一部分实施到您自己的项目中。

我希望这会有所帮助,祝你好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM