我目前正在制作一个指针,可以直观地显示玩家当前指向的位置。这应该有两个功能:
- 指出屏幕中间
- 允许玩家与他所指向的任何东西进行交互(因为指针有碰撞器) 代码:
public class MousePosition3D : MonoBehaviour {
[SerializeField] private Camera mainCamera;
private void Update()
{
Ray ray = mainCamera.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out RaycastHit raycastHit))
{
transform.position = raycastHit.point;
}
}}
以上代码所做的是设置转换。指针在最近的有碰撞器的对象上的位置。这很有效,但是当我在指针上添加一个碰撞器(允许玩家与其他对象交互)时,它开始从我的POV处无限循环到对象,因为每一帧它都在与自己的碰撞器不断改变位置。
参考视频:https://vimeo.com/606446838
有人知道如何解决这个问题吗?或者也许有更好的选择?我的目标是在屏幕中间放置一个指针(移动和相机旋转是分开进行的),让玩家与场景中的其他对象进行交互。
将光标碰撞器设置为专用图层
然后您可以使用例如LayerMask
来忽略PhysicsRacast
中的此特定层。
// Configure this via the Isnpector and select only layers you want to hit
[SerializeField] private LayerMask layersToHit;
private void Update()
{
Ray ray = mainCamera.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out var raycastHit, Mathf.Infinity, layersToHit))
{
transform.position = raycastHit.point;
}
}
或者只设置你想要的图层忽略和使用
// Configure this via the Isnpector and select only layers you want to ignore
[SerializeField] private LayerMask layersToIgnore;
private void Update()
{
Ray ray = mainCamera.ScreenPointToRay(Input.mousePosition);
// The "~" inverts the bitmask so we hit every layer except the ones selected in the mask
// see https://learn.microsoft.com/dotnet/csharp/language-reference/operators/bitwise-and-shift-operators#bitwise-complement-operator-
if (Physics.Raycast(ray, out var raycastHit, Mathf.Infinity, ~layersToIgnore))
{
transform.position = raycastHit.point;
}
}