【问题标题】:Unity Simple 2D Collider Sensor Script Order of Events IssueUnity Simple 2D Collider Sensor Script 事件顺序问题
【发布时间】:2016-09-07 01:37:42
【问题描述】:

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

所以我正在尝试制作一个简单的脚本来跟踪所有接触某个 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 unityscript unity3d-2dtools order-of-execution


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 2014-12-21
      • 2017-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多