封裝 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 資產。