在 Unity 的网格上动态生成 3D 对象的最佳方法是什么?
What is the best way to dynamically generate 3D objects on a grid in Unity?
我是一个没有经验的程序员,我正在寻找一个新的统一项目的建议:
我需要从相当大的图块中为 3d 游戏生成地形。现在我只需要一种类型的图块,但我在想,我现在最好设置一个注册表系统并在无限网格中动态生成该默认图块。不过我有一些顾虑,比如当角色移动到新图块(或块,如果你愿意的话)的渲染距离时,对象是否会继续加载。此外,我发现的所有教程在某种程度上对我来说都是错误的,比如它只能在 2d 中工作并且没有碰撞,或者只是一个静态注册表并且不允许更改游戏中的图块内容。
现在我什至不知道在场景中放置 3d 对象而不从矢量构建它们的代码是什么样的,这也许我可以做到。我也不知道如何触发代码。
有人可以告诉我代码是什么样子/要查找的术语/提供我需要的教程吗?
这对于新程序员来说似乎是一个相当大的范围,但让我们试一试。当您不知道自己在做什么时,在性能和优化方面生成地形将是一个很大的学习经验。
首先,您可能想要制作一个脚本作为生成对象的控制器并将其放入播放器中。我会先生成一个小区域或一个块,然后在您了解自己在做什么时继续生成多个块。要 'place' 场景中的对象,您需要制作对象的 instance。我首先尝试制作对象网格,这可以通过 for 循环在初始化(Start() 函数)时很容易地完成,用于测试目的。 IE,如果你想像我的世界一样制作 16x16 的正方形;有一个 运行s 16 次(对于 x)的 for 循环和其中的一个 for 循环到 运行 16 次(对于 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
}
}
}
现在,根据您要执行的具体操作,您从这里去的地方将有很大不同,但您可以从研究 perlin noise 开始,添加一个看起来不错的随机 y 水平。一旦掌握了一般概念,它就非常容易使用,我提供的这个示例应该可以帮助您理解如何使用它。他们甚至在 Unity 文档中给出了如何使用它的好例子。
总而言之,编程就是学习。您将必须学习如何只获取您想要创建的内容所需的部分资源。我认为我为您提供的内容应该为您想要创建的内容提供一个良好的开端,但需要更深入的理解才能自行完成。只需测试不同的东西并真正尝试并理解它们的工作原理,您就可以将它们的一部分实现到您自己的项目中。
希望对您有所帮助,祝您好运!
我是一个没有经验的程序员,我正在寻找一个新的统一项目的建议:
我需要从相当大的图块中为 3d 游戏生成地形。现在我只需要一种类型的图块,但我在想,我现在最好设置一个注册表系统并在无限网格中动态生成该默认图块。不过我有一些顾虑,比如当角色移动到新图块(或块,如果你愿意的话)的渲染距离时,对象是否会继续加载。此外,我发现的所有教程在某种程度上对我来说都是错误的,比如它只能在 2d 中工作并且没有碰撞,或者只是一个静态注册表并且不允许更改游戏中的图块内容。
现在我什至不知道在场景中放置 3d 对象而不从矢量构建它们的代码是什么样的,这也许我可以做到。我也不知道如何触发代码。
有人可以告诉我代码是什么样子/要查找的术语/提供我需要的教程吗?
这对于新程序员来说似乎是一个相当大的范围,但让我们试一试。当您不知道自己在做什么时,在性能和优化方面生成地形将是一个很大的学习经验。
首先,您可能想要制作一个脚本作为生成对象的控制器并将其放入播放器中。我会先生成一个小区域或一个块,然后在您了解自己在做什么时继续生成多个块。要 'place' 场景中的对象,您需要制作对象的 instance。我首先尝试制作对象网格,这可以通过 for 循环在初始化(Start() 函数)时很容易地完成,用于测试目的。 IE,如果你想像我的世界一样制作 16x16 的正方形;有一个 运行s 16 次(对于 x)的 for 循环和其中的一个 for 循环到 运行 16 次(对于 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
}
}
}
现在,根据您要执行的具体操作,您从这里去的地方将有很大不同,但您可以从研究 perlin noise 开始,添加一个看起来不错的随机 y 水平。一旦掌握了一般概念,它就非常容易使用,我提供的这个示例应该可以帮助您理解如何使用它。他们甚至在 Unity 文档中给出了如何使用它的好例子。
总而言之,编程就是学习。您将必须学习如何只获取您想要创建的内容所需的部分资源。我认为我为您提供的内容应该为您想要创建的内容提供一个良好的开端,但需要更深入的理解才能自行完成。只需测试不同的东西并真正尝试并理解它们的工作原理,您就可以将它们的一部分实现到您自己的项目中。
希望对您有所帮助,祝您好运!