OnTriggerExit2D вызывается, когда все еще сталкивается - PullRequest
0 голосов
/ 24 июня 2019

Я создаю 2D сверху вниз игру. Я бы хотел, чтобы игрок вышел на платформу и заставил ее двигаться под ними, чтобы преодолеть препятствия.

Для этого я создал платформу, которая перемещается назад и вперед между позициями. Если игрок сталкивается с платформой, его transform.parent устанавливается на платформы transform.

Это работает, и игрок движется с платформой. Проблема состоит в том, что, как только платформа проходит мимо того места, где она была BoxCollider2D, она вызывает `OnTriggerExit2D. Это называется, даже если игрок все еще сталкивается с платформой. Разница лишь в том, что теперь это ребенок.

[RequireComponent(typeof(Rigidbody2D))]
public class MovingPlatform : MonoBehaviour
{
    public List<Vector2> positions;
    public float speed = 1;
    public bool forward = true;
    public float stopTime = 1;

    private Vector2 nextPosition;
    private Rigidbody2D rigidbody;

    private int currentPosition = 0;
    private float waitTime = 0;

    private GameObject collidingObject;

    // Start is called before the first frame update
    void Start()
    {
        nextPosition = positions[0];
        rigidbody = GetComponent<Rigidbody2D>();
    }

    /**
     * Code to move the platform back and forth between positions
     */
    void Update()
    {
        if (waitTime <= 0)
        {
            if (Vector3.Distance(transform.position, nextPosition) > 0)
            {
                float step = speed * Time.deltaTime;
                transform.position = Vector3.MoveTowards(transform.position, nextPosition, step);
            }
            else
            {
                if (forward)
                {
                    if (currentPosition < positions.Count - 1)
                    {
                        currentPosition++;
                        nextPosition = positions[currentPosition];
                    }
                    else
                    {
                        waitTime = stopTime;
                        forward = false;
                    }
                }
                else
                {
                    if (currentPosition > 0)
                    {
                        currentPosition--;
                        nextPosition = positions[currentPosition];
                    }
                    else
                    {
                        waitTime = stopTime;
                        forward = true;
                    }
                }
            }
        }
        else
        {
            waitTime -= Time.deltaTime;
        }

    }

    private void OnTriggerEnter2D(Collider2D other)
    {
        if (other.tag.Equals("Player"))
        {
            Debug.Log("Connecting");
            collidingObject = other.gameObject;
            collidingObject.transform.parent = transform;
        }

    }

    private void OnTriggerExit2D(Collider2D other)
    {
        if (other.tag.Equals("Player") && collidingObject != null)
        {
            Debug.Log("Disconnecting");
            collidingObject.transform.parent = null;
            collidingObject = null;
        }
    }
}

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

Что может быть причиной этого?

Обновление Я пытался использовать это в Player компоненте.

private void OnTriggerStay2D(Collider2D other)
{
    if (other.tag.Equals("Moving Platform"))
    {
        Debug.Log("Connecting");
        transform.parent = other.transform;
    }
    else
    {
        Debug.Log("Disconnecting");
        transform.parent = null;
    }
}

Он успешно добавляет движущуюся платформу, поскольку она является дочерней, но он все равно заканчивает тем, что устанавливает родителя в ноль, когда он все еще сталкивается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...