Дочерний объект Unity иногда переходит на vector3 (0,0,0)

У меня очень надоедливый баг, и я не могу от него избавиться. Ситуация такова, что у меня есть родительский объект со следующим прикрепленным скриптом и триггерный коллайдер box2d. У него есть дочерний элемент с жестким телом2d (кинематика, сила тяжести = 0, положение фиксации x и вращение z), средство визуализации спрайтов и коллайдер многоугольников (с 4 краями). Моя проблема в том, что когда сцена загружена, иногда мои дочерние объекты (всегда произвольно, сколько из них и какие) перескакивают на transform.position 0,0,0.

Связываю скрипт, который прикреплен к родительскому

using UnityEngine;
using System.Collections;

public class FallingSpikeHazard : MonoBehaviour
{
    public GameObject spike;
    private Rigidbody2D spikeRigidbody;
    [SerializeField]
    private Vector3 startPosition;

    void Awake ()
    {       
        startPosition = spike.transform.localPosition; 
    }

    void Start ()
    {
        spikeRigidbody = spike.GetComponent<Rigidbody2D> ();
        
        Helper.JustReset += ResetMe;
        Invoke ("CheckPosition", Time.deltaTime);
    }

    void CheckPosition ()
    {
        if (spike.transform.localPosition != startPosition) {
            Debug.LogError ("t1" + spike.transform.localPosition);
            spike.transform.localPosition = startPosition;
            Debug.LogError ("t2" + spike.transform.localPosition);
        }
    }

    void OnDestroy ()
    {
        
        Helper.JustReset -= ResetMe;
    }

    void ResetMe ()
    {
        spikeRigidbody.gravityScale = 0;
        spikeRigidbody.isKinematic = true;
        if (startPosition != Vector3.zero) {
            spike.transform.localPosition = startPosition;
        }
    }

    void OnTriggerEnter2D (Collider2D other)
    {
        if (other.gameObject.tag.Equals ("Player")) {
            spikeRigidbody.isKinematic = false;
            spikeRigidbody.gravityScale = 1;
        }
    }
}

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

Что могло вызвать мою проблему?


person BazsBazs    schedule 02.07.2015    source источник
comment
Хорошо, ребята, с кодом все в порядке. Проблема связана с компонентом RigidBody2d. По сути, если вы отметите фиксированную позицию x или y, это сломает вашу игру. В прямом смысле. Я поместил сюда видео, чтобы показать вам, в чем на самом деле заключается ошибка. youtube.com/watch?v=HweD8A-q34Y   -  person BazsBazs    schedule 03.07.2015
comment
Решение действительно простое: если вам нужно использовать фиксированные углы, напишите для этого свой собственный сценарий. для угла x сделайте следующее: public Rigidbody2d myRigidB; public float fixedX; void FixedUpdate(){ Vector2 myVeloc = myRigidB.velocity; myVeloc = new Vector2(0,myVeloc.y); myRigidB.velocity=myVeloc; transform.position=new vector2(fixedX,transform.position.y); } Этот скрипт не тестировался, но решение примерно такое :)   -  person BazsBazs    schedule 03.07.2015


Ответы (1)


Для вызова функции OnTriggerEnter в родительском GameObject должен быть компонент Rigidbody2D.

person user2796283    schedule 03.07.2015
comment
Извините, возможно, я не достаточно ясно понял. Моя проблема не связана с коллайдером родителей. У моего плеера жесткое тело2d, и если запуск не глючит, коллизия работает нормально. Я снова устраняю свою проблему: 1. Когда я запускаю игру, некоторые из моих игровых объектов FallSpike отсутствуют. 2. Они перескакивают на vector3.zero 3. Если я коснусь ЧТО-либо после этого, мои журналы покажут мне, что я столкнулся с игровым объектом spike, что невозможно (новая позиция с ошибками и старая позиция находятся далеко от точки появления) . - person BazsBazs; 03.07.2015
comment
1) Попробуйте переместить код из Awake () в Start (), потому что пробуждение вызывается до включения объекта. 2) Почему вы работаете в локальных координатах? Если GameObject шипа, который вы передаете, является дочерним по отношению к другому объекту и расположен в Vector3 (0,0,0) в этом родительском объекте, то шипы localPosition вернут Vector3.zero. - person user2796283; 03.07.2015
comment
Это было в функции Start (), но особой разницы нет, потому что отключенные объекты все еще имеют transform.position. Локальные координаты - результат очень печального процесса отладки, с первого раза везде было transform.position. Моя иерархия выглядит так: -SpikeSpawner (у него есть сценарий) -Spike (это дочерний элемент SpikeSpawner). LocalPosition Spike находится около Vector3 (0.35f, 1, 0), поэтому нет возможности вернуть Vector3.zero. С другой стороны, я хотел бы подчеркнуть, что проблема все еще в программе, даже если скрипт отключен. - person BazsBazs; 03.07.2015
comment
Я хотел бы помочь, но ваш код уже кажется запутанным. На вашем месте я бы начал объект заново с нуля. Спайку просто нужны RigidBody, Collider и скрипт для обнаружения столкновений. Превратите шип в префаб, перетащив его в папку с ресурсами. Затем объявите публичный экземпляр GameObject шипа в своем скрипте SpikeSpawner и перетащите экземпляр префаба шипа в окно инспектора SpikeSpawner. SpikeSpawner должен легко создавать экземпляры префаба шипа с помощью Instantiate (...) - person user2796283; 03.07.2015
comment
Хорошо, теперь я почти уверен, что проблема в проекте или в моем Unity. Я удалил скрипт и сделал отладчик, который перезагружает сцену через 0,1 сек. Ошибка все еще существует, и нет ни одного скрипта, только эти строки: void Start () {Invoke (ResetLevel, 0.1f); } void ResetLevel () {Application.LoadLevel (Application.loadedLevel); } Что, черт возьми, это может быть? - person BazsBazs; 03.07.2015
comment
Иногда вам нужно выключить Unity, а затем снова включить. Звучит примитивно, но часто позволяет сэкономить часы разочарования, когда вы думаете, что что-то не так с кодом, который выглядит идеально. - person user2796283; 03.07.2015
comment
Я добавляю комментарий к вопросу, это ошибка в компоненте Unity Rigidbody2d. У меня была эта проблема в течение 2 недель, но я понял, что это такое. Завтра сделаю тикет в трекере проблем, потому что это смешно - person BazsBazs; 03.07.2015