2D портал работает иногда только в Unity - PullRequest
3 голосов
/ 06 марта 2020

Я пытаюсь создать 2D-портал в Unity, который не просто переносит игрока на другой игровой объект портала. Но сохраняя положение игроков, направление и скорость движений после прохождения портала.

Я не значит быть художником, но например: enter image description here Игрок подпрыгивает от мяча вокруг области, когда он проходит через портал, его скорость поддерживается, а также тот факт, что он вошел в центр портала.

Где здесь, например: enter image description here Если игрок входит в нижнюю половину портала, он выходит из нижней половины портала.

Когда это работает, это прекрасно работает! Тем не менее, это работает только в 50% случаев, тогда как 50% могут иметь кучу разных проблем, хотя иногда мяч просто не телепортируется. Иногда мяч попадает на первый портал, телепортируется на второй портал, а затем обратно на первый портал, и он делает это многократно навсегда. И эти проблемы кажутся случайными.

Вот мой скрипт:

public GameObject otherPortal;
    public PortalController otherPortalScript;
    private BallController ballController;
    public float waitTime = 0.5f;

    [HideInInspector]
    public bool teleporting;

    // Use this for initialization
    void Start () 
    {

    }

    // Update is called once per frame
    void Update () 
    {

    }

    void OnTriggerEnter2D(Collider2D other)
    {
        if (other.gameObject.tag == "Ball")
        {
            ballController = other.GetComponent<BallController>();
            if(!teleporting)
            {
                var offset = other.transform.position - transform.position;
                offset.x = 0;
                other.transform.position = otherPortal.transform.position + offset;
                otherPortalScript.teleporting = true;
                teleporting = true;
                StartCoroutine("Teleport");
            }            
        }
    }

    void OnTriggerExit2D(Collider2D other)
    {
        if (other.gameObject.tag == "Ball")
        {
            teleporting = false;
            otherPortalScript.teleporting = false;
        }

    }

    IEnumerator Teleport()
    {
        yield return new WaitForSeconds(waitTime);
        teleporting = false;
        otherPortalScript.teleporting = false;
        ballController.teleporting = false;
    }
}

Скрипт прикреплен к обоим порталам, которые оба являются префабами одного и того же объекта. Я установил в редакторе «otherPortal», «otherPortalScript» и «waitTime». «waitTime - это то, что я должен был» добавить после факта, чтобы исправить другую проблему, с которой у меня иногда «телепортация» никогда не становилась ложной. Я считаю, что причина этой проблемы - та же причина этой проблемы, делая «waitTime» «просто повязка для большего вопроса. Кроме того, каждый раз, когда сценарий портала изменяет переменную в «ballController», например «ballController.teleporting = false;», это происходит только потому, что мяч добавляет / удаляет точки из системы очков, это никак не влияет на его движение. .

1 Ответ

1 голос
/ 06 марта 2020

Подумайте над тем, чтобы избавиться от свойства teleporting порталов и мяча, а также waitTime.

Теперь присвойте мячу List<PortalController> inUseControllers (обратите внимание, вам нужно добавить using System.Collections.Generic) , Всякий раз, когда он входит в один портал, проверьте, пуст ли список через inUseControllers.Count == 0, и, если так, добавьте оба задействованных PortalController в этот список и обработайте движение телепортации. Когда мяч сталкивается с выходом PortalController, удалите его из списка inUseControllers; таким образом, он будет очищен только после того, как мяч покинет каждую зону портала.

Этот подход должен упростить код, но при этом надежно защитить от случайных возвратно-поступательных кругов.

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