封裝 Raycast 呼叫

如果你需要在將來更改碰撞矩陣,讓指令碼直接呼叫 Raycast 可能會導致問題,因為你必須跟蹤每個 LayerMask 欄位以適應更改。根據專案的規模,這可能會成為一項艱鉅的任務。

封裝 Raycast 呼叫可能會讓你的生活更輕鬆。

SoC 原理來看,遊戲物件真的不應該知道或關心 LayerMasks。它只需要一種掃描周圍環境的方法。光線投射結果是否返回此物件或對遊戲物件無關緊要。它應該只根據收到的資訊採取行動,而不對其所處的環境做出任何假設。

解決此問題的一種方法是將 LayerMask 值移動到 ScriptableObject 例項,並將其用作你注入指令碼的光線投射服務形式。

// RaycastService.cs
using UnityEngine;

[CreateAssetMenu(menuName = "StackOverflow")]
public class RaycastService : ScriptableObject
{
    [SerializeField]
    LayerMask layerMask;

    public RaycastHit2D Raycast2D(Vector2 origin, Vector2 direction, float distance)
    {
        return Physics2D.Raycast(origin, direction, distance, layerMask.value);
    }

    // Add more methods as needed

}
// MyScript.cs
using UnityEngine;

public class MyScript : MonoBehaviour
{
    [SerializeField]
    RaycastService raycastService;

    void FixedUpdate()
    {
        RaycastHit2D hit = raycastService.Raycast2D(Vector2.zero, Vector2.down, 1f);
    }
}

這允許你製作一些光線投射服務,所有這些服務都針對不同情況使用不同的 LayerMask 組合。你可以有一個只擊中地面對撞機,另一個擊中地面對撞機和單向平臺。

如果你需要對 LayerMask 設定進行重大更改,則只需更新這些 RaycastService 資產。

進一步閱讀