2017-06-13 5 views
0

実際に私はマウスといくつかのオブジェクト間の衝突を検出するためにこの次のコードを使用しています。マウスの行を交差する複数のgameobjectのリストを取得

私は、コードが複数のGameObjects(最初のものだけでなく、上記のもの)をキャプチャしてListに格納するようにします。

私は約Physics.RaycastAllを見たが、私は少し混乱していた。

void Update() 
{ 
    RaycastHit hit; 

    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 

    if(Physics.Raycast(ray,out hit)) 
    {  
     if (hit.collider != null) 
     { 
      print (hit.transform.gameObject.name);   

     }    
    } 
} 
+0

RaycastAllについて何が困惑しますか?ドキュメントにも例があります。 – Lestat

答えて

3

ここでは何も混乱しません。唯一の違いは、Physics.RaycastAllRaycastHitの配列を返している間に何かがヒットした場合、Physics.Raycasttrueまたはfalseを返します。その配列RaycastHitをループするだけです。

void Update() 
{ 
    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 

    RaycastHit[] hit = Physics.RaycastAll(ray); 

    for (int i = 0; i < hit.Length; i++) 
    { 
     if (hit[i].collider != null) 
     { 
      print(hit[i].transform.gameObject.name); 
     } 
    } 
} 

あなたがすべてのオブジェクトのヒットを検出したい場合はPhysics.RaycastNonAllocの代わりPhysics.RaycastAllを使用することをお勧めします。これは、特にUpdate関数でこれを行うときにメモリを割り当てません。

//Detect only 10. Can be changed to anything 
RaycastHit[] results = new RaycastHit[10]; 

void Update() 
{ 
    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 

    int hitCount = Physics.RaycastNonAlloc(ray, results); 

    for (int i = 0; i < hitCount; i++) 
    { 
     if (results[i].collider != null) 
     { 
      print(results[i].transform.gameObject.name); 
     } 
    } 
} 

上記のコードでは最大10個のオブジェクトが検出されます。あなたはそれを増やすことができます。

+0

答えをいただきありがとうございます。途中でメモリを割り当てないとどういう意味ですか? – JamesB

+1

あなたのアプリがメモリブロックをOSから要求したとき。あなたは毎フレームそれをやっています。これは、更新関数でクラスの新しいインスタンスを作成するのと同じですが、これは配列です。関数外の配列を宣言し、 'Physics.RaycastNonAlloc'関数で再利用することで、毎回割り当てメモリがなくなります。したがって、その関数内の 'NonAlloc'キーワード。 C++から来て、私たちはそれを呼んでいます。それがC#と同じであるかどうかは分かりません。各フレームにメモリを割り当てると、GCが頻繁に発生する可能性があります。これはしばらくの間ゲームを凍結し、 のゲーム体験を破壊する可能性があります。 – Programmer

+1

GCがわからない場合は、Googleの "C#GC"をクリックしてください。まだ混乱している場合は、 "C#stack vs heap"を検索することができます。それはおそらくあなたを助けるでしょう。 – Programmer

関連する問題