【问题标题】:How to create 3D tile maps using a Plane object divided into tiles?如何使用分成瓦片的平面对象创建 3D 瓦片地图?
【发布时间】:2018-10-11 22:17:42
【问题描述】:

我想在 3D 世界空间中创建一个以 0,0,0 为中心的 2D 平面。然后,我想在 2d 平铺坐标中定义这个平面。所以 例如一个平面除以 3 个图块将成为数组 [3,3] 的地图

问题是这仍然会给出一个带有负分的瓦片地图。世界左上角 -1,1 将是数组 -1 中的 0,0,- 将是 1,0 等等...

世界:

-1,1   0,1   1,1             
-1,0   0,0   1,0
-1,-1  0,-1  1,-1 

数组:

0,0  0,1  0,2   
1,0  1,1  1,2
2,0  2,1  2,2   

我对 Unity 的主要希望是我可以避免图形数学并专注于逻辑脚本。所以,我在问 Unity 2018 是否有任何一组功能可以轻松完成我上面描述的操作?

从长远来看,这段代码的原因是创建一个游戏和编辑器,用于将 3d 预制件放置到 3d 世界中,但使用 2D 数组来定义它们的属性。弄乱 y 轴目前不是问题。我想知道我是否可以使用它创建一个开源 XCOM 风格的游戏。我目前负担不起资产,因为我在经济上依赖并且不喜欢询问。我也注意到也非常缺乏免费的 3D 瓷砖游戏编辑器。感谢您的帮助...

【问题讨论】:

  • 澄清一下:您想要一个函数自动将任意大小的 2d 平面划分为 n 个部分,并让光线投射返回部分 [0-n]?
  • 是的。 0,0 是平面的中心部分
  • 还要澄清一下,我有一种方法可以做到这一点。在我的 update() 中,我使用以下内容: ray = Camera.main.ScreenPointToRay(Input.mousePosition);
  • 然后在鼠标点击中: if (coll.Raycast(ray, out hitInfo,100f)) 给了我需要的 hitinfo 值。即使我平移相机位置,这仍然有效。但是,一旦我使用 Camera.main.transform.Rotate(new Vector3(0,-45,0),Space.World); 旋转位置,它就会中断。相机的起始位置为(0, 20, -40),旋转为(30,0,0)
  • 我将编辑 OP 以使用我在这些 cmets 中提供的信息进行更新。仍在学习如何使用 SO。

标签: arrays graphics 3d 2d raycasting


【解决方案1】:

将二维平面映射到二维数据数组:

  • 使用 numTiles 和 tileSize 在 3d 空间中创建网格。它将具有 (numTiles * tileSize) 的宽度,因此平面的顶点与点 Vector3.zero 的距离为该值的一半

  • 在您的 Update() 函数中,使用光线投射来检测网格上的鼠标点击。我使用了来自 Camera.main.ScreenPointToRay(Input.mousePosition) 的射线,并检查了我是否受到了我飞机的 MeshCollider 的命中。使用该命中点的数据,我能够将浮点值映射到整数 xz 坐标。

  • 将 xz 整数坐标映射到数据数组的 r 行和 c 列:

  • shiftX = x + Floor(numTiles / 2)
  • shiftZ = z - Floor(numTiles / 2)
  • r = 楼层(shiftZ)*-1
  • c = 楼层(shiftX)

这比我喜欢的数学要多,但它确实有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-24
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多