我正在尝试让一个物体跟随我的鼠标沿着游戏表面移动。游戏中有地板和其他物体。该物体应始终位于地板上或其他物体之一上。我想要的是将对象的位置更改为鼠标移动的位置。我正在通过从鼠标投射光线来做到这一点。当光线撞击碰撞体时,对象的位置应更改为撞击位置。
[当我点击播放时,对象沿着所投射的光线移动,从碰撞(命中点)开始,并朝相机移动。到达相机后,它将在hit.point重新开始并重复。当我移动鼠标时,对象的位置会更改为新的hit.point并向相机移动。当我按原样移动鼠标时,以及当鼠标静止不动时,即使对象仍朝着相机移动,hit.point的值也会改变。为什么会这样呢?似乎是因为transform.position的值设置为hit.point,并且从未在代码的其他位置更改过,所以应该始终将其设置为hit.point。
这是附加到正在移动的对象上的代码:
public class FollowCursor : MonoBehaviour
{
void Update()
{
RaycastHit hit;
Ray ray;
int layerMask = 1 << 8;
layerMask = ~layerMask;
ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit))
transform.position = hit.point;
Debug.Log(hit.point);
}
}
这是我的层次结构和场景的screenshot。白色球体是正在移动的对象。我所指的地板是水箱底部的沙子。我希望将物体放在沙滩上或其他物体之一上。第8层是储罐本身,因为我不希望将物体放在储罐上,所以将其排除在射线投射之外。
射线击中地面。物体去那里
下一帧,射线撞击物体。对象移动到那里(光线射到表面上,枢轴在中心,因此它向相机移动的量等于对撞机的半径,根据屏幕截图看起来像是0.5个单位)。
重复。
解决此问题的最佳方法是将自己的地面放到自己的图层上并进行光线投射仅针对要射线照射的图层使用LayerMask
。