Unity 简单 2D 碰撞传感器脚本事件顺序问题

问题描述 投票:0回答:1

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

所以我试图制作一个简单的脚本来跟踪接触某个 2D 触发碰撞器的所有 2D 碰撞器。它应该维护一个通用的公共 2D 碰撞器列表,其中包含所有接触当前帧的 2D 碰撞器的 2D 碰撞器,其他脚本可以访问该列表来执行其他操作。我尝试了几种实现,发现由于统一执行事件的顺序,这比看起来更难(无论如何对我来说)。使用传感器脚本中的碰撞器列表的其他脚本仅在 update() 期间访问该列表,从逻辑上讲,该列表看起来应该在那时正确填充,但我一定是错的,因为它显然不是。这是我最近和最好的尝试,有人可以告诉我哪里出错了吗? (还有一个 bool 来确保只添加新的碰撞器,这部分与我所要求的无关......无论如何我认为是这样......)

 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 项目设置中发生碰撞。我也许应该提到这一点。我很感激任何人可能有的见解。抱歉这么啰嗦。谢谢。

c# collision-detection unity3d-2dtools order-of-execution
1个回答
0
投票

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

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.