0

Первоначально это сообщение о единстве ответов единства, но модераторы принимают их сладкое время, одобряя его, поэтому я размещаю его здесь, на более высоком переполнении стека cheer ... так что имейте в виду, что это проблема движка Unity в сценарии C# ... очевидно ...Unity Simple 2D Collider Sensor Script Order of Events Issue

Итак, я пытаюсь создать простой скрипт для отслеживания всех 2D-коллайдеров, касающихся определенного 2D триггерный коллайдер Он должен поддерживать общий открытый 2D-коллайдерный список всех 2D-коллайдеров, которые касались его 2D-коллайдера текущего кадра, к которому можно получить доступ с помощью других сценариев, чтобы делать другие вещи. Я пробовал несколько реализаций и обнаружил, что из-за порядка событий единство выполняет вещи, что это сложнее, чем кажется (для меня в любом случае). Другие скрипты, использующие список коллайдеров из скрипта сенсора, имеют доступ только к списку во время их обновления(), и логически выглядит, что список должен быть правильно заполнен в то время, но я должен ошибаться, потому что это явно не так. Вот моя последняя и лучшая попытка, может кто-нибудь сказать мне, где я ошибаюсь? (Там же 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-проекта физики. Вероятно, я должен упомянуть об этом. Я был бы признателен за любое понимание, которое может иметь любой. Извините, так много. Благодарю.

ответ

0

Я думаю, что вы не можете принять что-либо в том порядке, в котором вы вызываете OnTriggerEnter2D, и если они будут вызваны до или после других функций Update.

Вы можете увидеть Unity Script Lifecycle Блок-схема здесь http://docs.unity3d.com/Manual/ExecutionOrder.html

Но единственное, что мы можем заключить из него, что OnTriggerEnter2D будет вызываться перед функцией обновления конкретного сценария, без упоминания о том, что другие делаем.

Так мое предположение было бы, что единственный способ гарантировать, что любой сценарий будет увидеть точное количество коллайдеров, соприкасающихся курок, чтобы проверить список для кадра предыдущей

Вы бы нуждаться в два списках: Один, в котором вы храните коллайдеры, и тот, который содержит коллайдеры последнего кадра (для доступа к другим скриптам) Что вы можете сделать, это использовать Time.time или Time.frameCount, чтобы определить, в каком кадре вы находитесь.

Вы должны уметь изобразить детали реализации

 Смежные вопросы

  • Нет связанных вопросов^_^