我目前正在開發一個指標,該指標將直觀地顯示玩家當前所指向的位置。這應該有2個功能:
代碼:
public class MousePosition3D : MonoBehaviour {
[SerializeField] private Camera mainCamera;
private void Update()
{
Ray = mainCamera.ScreenPointToRay(Input.mousePosition)。
if (Physics.Raycast(ray, out RaycastHit raycastHit))
{
transform.position = raycastHit.point。
}
}}
上述代碼所做的是將指標的transform.position設定在離它最近的有碰撞器的物體上。這很好,但是當我在指標上添加一個碰撞器時(允許玩家與其他物體互動),它開始無限地回圈到我的POV所在的物體上,因為每一幀它都在與自己的碰撞器碰撞,不斷地改變位置。
視頻供參考。 https://vimeo.com/606446838
有人知道如何解決這個問題嗎?或者有一個更好的替代方案?我的目標是在螢屏中間有一個指標(移動和相機旋轉是分開進行的),并讓玩家與場景中的其他物體互動。
uj5u.com熱心網友回復:
將你的游標碰撞器設定為一個專門的層
然后你可以在PhysicsRacast中使用例如LayerMask忽略這個特定層。
//通過Isnpector配置這個,只選擇你想打的層。
[SerializeField] private LayerMask layersToHit;
private void Update()
{
Ray = mainCamera.ScreenPointToRay(Input.mousePosition)。
if (Physics.Raycast(ray, out var raycastHit, Mathf.Infinity, layersToHit)
{
transform.position = raycastHit.point。
}
}
或者只將你想要的層設定為ignore并使用
。//通過Isnpector配置這個,只選擇你想忽略的層。
[SerializeField] private LayerMask layersToIgnore;
private void Update()
{
Ray = mainCamera.ScreenPointToRay(Input.mousePosition)。
// "~"顛倒了位圖,所以我們擊中了每一層,除了在遮罩中選擇的那些。
//見https://docs.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。
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/312435.html
標籤:
