Unity, c# -指针使用鼠标



我目前正在制作一个指针,可以直观地显示玩家当前指向的位置。这应该有两个功能:

  1. 指出屏幕中间
  2. 允许玩家与他所指向的任何东西进行交互(因为指针有碰撞器)
  3. 代码:

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;
}
}

最新更新