2017-11-18 9 views
1

私は、プレイヤーを原点とする範囲内のオブジェクトを検出しようとしています。 コリドーを使用せずにプレーヤー周辺の任意の領域からTransformsを見つけるにはPhysics.OverlaptSphere()私が必要とする情報は、与えられたLayerMaskからの近くのオブジェクトの変形です(より具体的には、位置そして回転)私が物理学を使うなら、私は不必要なすべての点にトリガをかけなければならないでしょう。物理/レイキャストなしで近くのゲームオブジェクトを検出するにはどうすればよいですか?

物理学を使った以外の近くの点を見つける他の方法はありますか?

+0

、あなたのゲーム宇宙のマスターです。あなたはそれらをすべて得ることができるはずです。あなたのプレイヤーから望むオブジェクトまでの距離を計算してください。あなたが設定されています - これは無理な力です。あなたはあなたの好きな更新にスクリプトをつけて、プレイヤーまでの距離を計算させることができます。スレッショルド以下であれば、あなたが "プレーヤーの影響範囲内"であることを簿記者オブジェクトに通知します。このspehere ...から出てきたものを更新して削除します。それについて考えて、それをコード化します。 –

+0

Vector3.Distanceを使用していません。 – Noobie

+1

あなたはプレイヤーの周りにレイキャストを投げて、彼らが距離xyzで何をしているかを見ることができます。 aproachを決めて問題が発生した場合は、コードを表示してください。 –

答えて

1

PhyscicsまたはCollidersなしでこれを行うには、すべてのオブジェクトにアクセスします。それらをループしてレイヤーを確認し、一致する場合はVector3.Distanceを使用して各オブジェクトの距離を比較します。結果を返します。

List<GameObject> findNearObjects(GameObject targetObj, LayerMask layerMask, float distanceToSearch) 
{ 
    //Get all the Object 
    GameObject[] sceneObjects = UnityEngine.Object.FindObjectsOfType<GameObject>(); 

    List<GameObject> result = new List<GameObject>(); 

    for (int i = 0; i < sceneObjects.Length; i++) 
    { 
     //Check if it is this Layer 
     if (sceneObjects[i].layer == layerMask.value) 
     { 
      //Check distance 
      if (Vector3.Distance(sceneObjects[i].transform.position, targetObj.transform.position) < distanceToSearch) 
      { 
       result.Add(sceneObjects[i]); 
      } 
     } 
    } 
    return result; 
} 

これは、すべてのGameObjectsを取得するためにScene.GetRootGameObjectsを使用することによって改善することができるが、それはDontDestroyOnLoadとしてマークされたオブジェクトを返しません。拡張機能として拡張

public static class ExtensionMethod 
{ 
    public static List<GameObject> findNearObjects(this GameObject targetObj, LayerMask layerMask, float distanceToSearch) 
    { 
     GameObject[] sceneObjects = UnityEngine.Object.FindObjectsOfType<GameObject>(); 
     List<GameObject> result = new List<GameObject>(); 
     for (int i = 0; i < sceneObjects.Length; i++) 
      if (sceneObjects[i].layer == layerMask.value) 
       if (Vector3.Distance(sceneObjects[i].transform.position, targetObj.transform.position) < distanceToSearch) 
        result.Add(sceneObjects[i]); 
     return result; 
    } 
} 

使用法:

List<GameObject> sceneObjects = gameObject.findNearObjects(layerMask, 5f); 
関連する問題