好的,所以我在此描述中添加了图像,以便使问题更清晰。
我有一个Parent Object
,其中包含三个Blocks
。
父级具有这三个块的组合网格。
玩家(蓝色圆圈)能够摧毁方块。为此,我有一个raycast
,从玩家朝其所面对的方向发送,并返回hit.point
的位置。
当玩家站在玩家位置1时,命中点可能类似于X = 0.5
和Z = 0.5
(在此示例中,我们忽略Y)。
所以我需要做类似的事情:
float xx = hit.point.x + (1 - (hit.point.x % 1));
然后xx = 1
。
然后我可以对z做同样的事情。
但是:
当玩家在玩家Pos 2上时,此操作无效。
然后xx将是4,而不是3(这是必需的)。
我考虑过只是检查一下,如果玩家的transform.position.x
比hit.point.x
小还是大,但这还有一个问题:
如果玩家在x = 2 z = 1处摧毁了方块,然后进入 在其余两个块之间的中间,然后面向x = 1 z = 1的块,结果将是x = 2,因此他无法销毁左侧的块。
如果不清楚,很抱歉,英语不是我的母语。
我希望有人可以帮助我!
答案 0 :(得分:1)
因此,为简单起见,我们仅考虑X-Z平面并将父对象放在原点,并假定“块”的大小为1单位* 1单位。
播放器位于P点,光线投射的命中点为H。我们向向量PH添加了非常小的偏移量(类似于0.001 * PH.normalized),因此它将落在块内。然后,我们使用 <img src={umberlla} alt="text"></img>
方法来确定玩家击中的方块。代码类似于:
Mathf.FloorToInt
以下是图形说明(P是玩家,H是命中点,HN是偏移量(出于解释目的而夸大)):
但是,此解决方案存在一些次要缺陷:
首先,它不关心父对象的旋转,平移和缩放。您应该做一些数学运算,以便将所有内容置于父对象的局部坐标系下。
其次,当击点位于块的边缘或关节附近时,它不起作用(因为偏移量会导致您离开块外),但这确实很少见(只要您将浮点精度保持在合理范围内) )。