0

これはもともとユニティの「統一解答」のポストだったが、司会者はそれを承認する甘い時間を取っているので、ここでは上位のスタックオーバーフローで掲示している。応援 ...これはC#スクリプトのUnityエンジンの問題です...明らかに...ユニティシンプルな2Dコライダーセンサースクリプトイベントの注文

私は、特定の2Dに触れるすべての2Dコライダーを追跡する簡単なスクリプトを作成しようとしていますトリガーコライダー。それは、他のスクリプトを使ってアクセスできる現在のフレームを2Dコライダーに触れていたすべての2Dコライダーの一般的な公開2Dコライダーリストを維持することになっています。私はいくつかの実装を試してみましたが、イベントの順番のために統一性があることが分かりました。センサースクリプトのコライダーリストを使用している他のスクリプトは、それらのupdate()中にリストにアクセスするだけで、論理的にはその時にリストが適切に設定されているように見えますが、明らかにそうではないので間違っていなければなりません。ここに私の最も最近の、そして最高の試みがあります、誰かが私が間違っていると私に言うことができますか?

using UnityEngine; 
using System.Collections; 
using System.Collections.Generic; 

public class SimpleColliderSensor : MonoBehaviour { 

    public bool repeatsallowed; 
    public List<Collider2D> sensedobjs; 
    bool clearlist; 

    public void init() 
    { 
     clearlist = false; 
     repeatsallowed = false; 
     sensedobjs = new List<Collider2D>(); 
    } 

    void FixedUpdate() 
    { 

    } 

    void Update() 
    { 

    } 

    void LateUpdate() 
    { 
     clearlist = true; 
    } 

    void OnTriggerEnter2D(Collider2D c) 
    { 
     OnTriggerStay2D(c); 
    } 

    void OnTriggerStay2D(Collider2D c) 
    { 

     if (clearlist) 
     { 
      sensedobjs.Clear(); 
      clearlist = false; 
     } 


     if (repeatsallowed) 
     { 
      sensedobjs.Add(c); 
     } 
     else 
     { 
      if (!sensedobjs.Contains(c)) 
      { 
       sensedobjs.Add(c); 
      } 
     } 
    } 

    void OnCollisionStay2D(Collision2D c) 
    { 
     OnTriggerStay2D(c.collider); 
    } 

    void OnCollisionEnter2D(Collision2D c) 
    { 
     OnTriggerStay2D(c.collider); 
    } 

} 

それだけで設定することができ、「clearlistを」らしい(...私はそうとにかくだと思う...その部分は私が求めているものには無関係である、唯一の新しいコライダーが追加されていることを確認することもBOOLあります)それは同じように動作するだろうが、私は別のものを試していたので、今は遅刻している。とにかく、リストには衝突するはずのコライダーがないことがよくありますが、コライダーがいくつかあります。そして、物理と2Dのプロジェクト設定でセンサーとセンスの衝突が衝突するように設定されています。私はおそらくそれを言及すべきである。私は誰もが持つ可能性のある洞察に感謝します。申し訳ありませんが冗長です。ありがとう。

答えて

0

あなたはOnTriggerEnter2Dが呼び出された順番や、他のUpdate関数の前後に呼び出されるものは何も想定できないと思います。

あなたがここにhttp://docs.unity3d.com/Manual/ExecutionOrder.html

をユニティスクリプトのライフサイクルフローを見ることができます。しかし、我々はそこから結論付けることができます唯一のことはOnTriggerEnter2Dは、どのような他人のは言及しないで、特定のスクリプトのUpdate関数の前に呼び出されるということですやっている。

だから私の推測では、任意のスクリプトがトリガーに触れたコライダーの正確な数を確認することを保証する唯一の方法は次の2つのリストが必要になります前のフレーム

のためのリストを確認することであることを次のようになります。コライダーを格納するものと、最後のフレームのコライダーを含むもの(他のスクリプトによってアクセスされるもの) あなたができることは、あなたがどのフレームであるかを識別するためにTime.timeまたはTime.frameCountを使用することです。

実装の詳細を把握できるはずです