0

これはもともと Unity の「Unity Answers」に関する投稿でしたが、モデレーターが承認に時間を費やしているため、はるかに優れたスタック オーバーフローの声援にここに投稿します...これは Unity エンジンの問題であることを覚えておいてくださいC# スクリプト...明らかに...

そこで、特定の 2D トリガー コライダーに接触するすべての 2D コライダーを追跡するための簡単なスクリプトを作成しようとしています。他のスクリプトが他のことを行うためにアクセスできる現在のフレームの 2D コライダーに触れていたすべての 2D コライダーの一般的なパブリック 2D コライダー リストを維持することになっています。私はいくつかの実装を試しましたが、イベントの順序が原因で unity が物事を実行することがわかりました。センサー スクリプトのコライダ リストを使用する他のスクリプトは、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」は更新時に設定するだけで同じように機能するようですが、別のことを試していたので、現在更新が遅れています。とにかく、リストには衝突するはずのコライダーが欠けていることがよくありますが、いくつかのコライダーがあります。はい、センサーとセンシーのコライダーは、物理 2D プロジェクト設定で衝突するように設定されています。私はおそらくそれを言及する必要があります。誰でも知っているかもしれない洞察をいただければ幸いです。申し訳ありませんが冗長です。ありがとう。

4

1 に答える 1

0

OnTriggerEnter2D が呼び出される順序、および他の Update 関数の前または後に呼び出されるかどうかについては、何も想定できないと思います。

ここで Unity スクリプトのライフサイクル フローチャートを参照できますhttp://docs.unity3d.com/Manual/ExecutionOrder.html

しかし、ここから結論付けられる唯一のことは、OnTriggerEnter2D が特定のスクリプトの Update 関数の前に呼び出され、他のスクリプトが何をしているかについて言及されていないということです。

したがって、トリガーに触れたコライダーの正確な数をスクリプトが確認できるようにする唯一の方法は、のフレームのリストを確認することだと思います

2 つのリストが必要になります。1 つはコライダーを格納するリスト、もう 1 つは最後のフレームのコライダーを含むリスト (他のスクリプトからアクセスするため) です。それは。

実装の詳細を理解できるはずです

于 2016-05-11T15:21:08.450 に答える