如果我想檢查最近的具有“Enemy”類的游戲物件,我有兩個選擇:
- 我可以為每個實體化的 Enemy 游戲物件構建一個靜態串列,并使用該串列找到最接近的一個,或者
- 我可以使用物理光線投射來找到每個 Enemy 游戲物件,將它們放入串列中,然后找到最接近的那個。
他們看起來差不多;如果有的話,似乎構建靜態串列會有更好的性能,因為不涉及光線投射,但另一方面,使用方法 2 似乎更易于擴展以進行進一步更改。
uj5u.com熱心網友回復:
這聽起來很基于意見,但這是我會做的
public class Enemy : MonoBehaviour
{
private static readonly List<Enemy> _instances = new ();
public static IReadOnlyList<Enemy> Instances => _instances;
private void Awake()
{
_instances.Add(this);
}
private void OnDestroy()
{
_instances.Remove(this);
}
}
通過這種方式,您始終擁有現有實體的實際串列,而無需一直輪詢它們。
現在你可以獲得最接近的一個,例如使用 Linq
var closestEnemy = Enemy.Instances.OrderBy(e => (e.transform.position - transform.position).sqrMagnitude).FirstOrDefault();
如果您無論如何都需要找到所有Enemy實體,那么使用物理學并不是一個好方法。
取決于您的用例。您可能只想獲得特定范圍內的那些。在那種情況下,您可以再次使用上述方法并在特定距離上進行過濾,或者您可以使用例如OverlapSphere. 在性能方面,我聲稱物理學總是會更糟。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/534923.html
標籤:C#列表unity3d
上一篇:協程在yieldreturn后不運行代碼-UnityC#腳本
下一篇:按順序淡出影像
