【问题标题】:What is the best way to dynamically generate 3D objects on a grid in Unity?在 Unity 的网格上动态生成 3D 对象的最佳方法是什么?
【发布时间】:2023-03-20 00:10:01
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我不知道为什么我的问题被否决了,我的问题与代码有关,它专门参考了我已经做过的研究,所以显然我研究了这个问题,我试图弄清楚是什么样的我面临的问题,如果有特定的代码,我会包含它但还没有,也不建议总是包含代码......我很茫然,我做错了什么?他们只是不喜欢这不是一个高度技术性或完全特定的代码问题吗?似乎这不会让我的问题变得不那么合理......试图制作一个游戏老兄......
  • 堆栈溢出更多地用于帮助解决用户已经尝试解决的代码问题。就您而言,您是在寻求有关如何开始开发的建议,而不是寻求有关您不知道为什么不起作用的代码的特定部分的帮助。我能给你的一条建议是从各种教程、指南和文档中获取一些东西。你永远找不到完全符合你想法的教程。

标签: c# unity3d dynamic 3d virtual-reality


【解决方案1】:

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

首先,您可能想要制作一个脚本,作为控制器来生成您的对象并将其放入播放器中。我会从只生成一个小区域或一个块开始,然后在您了解自己在做什么时继续生成多个块。要在场景中“放置”一个对象,您需要为该对象创建一个instance。我首先尝试创建对象网格,这可以通过 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
        }
    }
}

现在,您从这里开始的位置会因您想要做的事情而大不相同,但您可以从查看perlin noise 开始,添加一个看起来不错的随机 y 水平。一旦你掌握了一般概念,它就很容易使用,我提供的这个例子应该可以帮助你理解如何使用它。他们甚至在 Unity 文档中给出了如何使用它的很好的例子。

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

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

【讨论】:

  • 很好的答案,但我也不推荐 Perlin 噪声/Unity Mathf.PerlinNoise,因为它在其产生的特征中显示出明显的 45 度和 90 度角偏差。寻找一个好的 Simplex 实现,如果您需要 3D+ 噪声,更具体地说是一个开放的实现。部分问题在于 Unity 包含的此功能比单纯形 (Unity.Mathematics.noise.snoise(float2)) 更为突出。但我们可以提供帮助的部分方法是引导新手远离它并使用更好的特性来发挥作用。
  • github.com/KdotJPG/OpenSimplex2/blob/master/csharp/… 是我创建/使用/推荐的,如果您不使用 Burst 编译器,它可能比 Unity.Mathematics 噪声更快。但是,如果您找到其他符合要求的东西,那就太好了!
猜你喜欢
  • 2012-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-26
  • 2016-03-24
  • 2017-09-04
  • 1970-01-01
相关资源
最近更新 更多