0

这最初是关于统一的“统一答案”的帖子,但版主正在花时间批准它,所以我将它发布在更优越的堆栈溢出欢呼上......所以请记住,这是一个 Unity 引擎问题C# 脚本...显然...

所以我正在尝试制作一个简单的脚本来跟踪所有接触某个 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”可以在更新中设置并且它的工作方式相同,但我正在尝试不同的东西,所以它现在处于后期更新中。无论如何,列表经常缺少它应该与之碰撞的碰撞器,但有一些碰撞器。是的,传感器和感知对撞机被设置为在物理 2D 项目设置中发生碰撞。我可能应该提到这一点。我将不胜感激任何人可能有的见解。抱歉太啰嗦了。谢谢。

4

1 回答 1

0

我认为你不能假设你 OnTriggerEnter2D 被调用的顺序,以及它们是否会在其他更新函数之前或之后被调用。

您可以在此处查看 Unity 脚本生命周期流程图http://docs.unity3d.com/Manual/ExecutionOrder.html

但我们唯一能从中得出的结论是 OnTriggerEnter2D 将在特定脚本的 Update 函数之前被调用,而没有提及其他人在做什么。

所以我的猜测是,确保任何脚本都能看到触及触发器的对撞机的确切数量的唯一方法是检查前一帧的列表

您将需要两个列表:一个存储碰撞器,一个包含最后一帧的碰撞器(由其他脚本访问)您可以做的是使用 Time.time 或 Time.frameCount 来确定您在哪个帧中是。

您应该能够弄清楚实现细节

于 2016-05-11T15:21:08.450 回答