Позволение персонажу перемещаться между художественными полотнами, когда в Unity2D есть пересекающиеся стороны - PullRequest
0 голосов
/ 30 октября 2018

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

Обратите внимание, что «холст», о котором я говорю, - это не элемент пользовательского интерфейса, а фактические холсты, которые вы бы увидели в реальной жизни.

The image below describes the game's core movement mechanics

Я основал свой код на концепциях порталов. Возможно, это не самый эффективный способ справиться с этим, и я рассмотрю все советы.

Это мой текущий код:

public Transform PortalB;
public CharacterController2D Player;
public GameObject PlayerObject;

private GameObject CloneTemporary;

public Queue<GameObject> Clones = new Queue<GameObject>();

private bool isCreated = false;

// Use this for initialization
void Start () {
    Clones.Enqueue(PlayerObject);
}

// Update is called once per frame
void Update () {
    // Portal adapts to the player's current position
    if (Player == null) {
        Player = GameObject.FindWithTag("Player").GetComponent<CharacterController2D>();    
        PlayerObject = GameObject.FindWithTag("Player");
    }

}

void OnTriggerEnter2D (Collider2D other) {

    if (other.gameObject.tag == "Player") {

        if (Vector2.Distance(transform.position, other.transform.position) > 0.7f) {



            if (!isCreated) {

                CloneTemporary = Instantiate(PlayerObject, new Vector2 (PortalB.position.x, PortalB.position.y), Quaternion.identity) as GameObject;

                Clones.Enqueue(CloneTemporary);

                isCreated = true;
            }

        }

    }
}

void OnTriggerExit2D (Collider2D other) {
    if (Vector2.Distance(transform.position, other.transform.position) > 0.7f) {
        print(Clones.Count);
        if (Clones.Count > 1) {
            UnityEngine.Object.Destroy(Clones.Dequeue());
        }
    }

    isCreated = false;
}

«Оригинальный персонаж» столкнется с коллайдером портала и создаст копию на другом конце портала. Ящик-коллайдер помечен красным на первом изображении ниже. Обратите внимание, что размеры точно такие же.

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

Как только оригинал покидает коробочный коллайдер, он будет удален, и клон станет «оригиналом».

Я использую систему очередей, чтобы определить, какой «клон» удаляется первым.

Есть несколько проблем с этим:

  1. Это очень неэффективно. Я должен создать порталы вручную для каждой точки пересечения на полотнах. Вообразите уровень, полный холстов, и представьте игру, полную уровней ...
  2. Когда он касается портала, дубликат будет порожден оригинальным персонажем. Есть три символа, но Clones.Count регистрирует только два.
  3. Я не уверен, насколько хорошо код будет работать для вертикальных обходов.
  4. Когда персонаж пересекает портал, он должен иметь возможность повернуть назад. В этом коде персонаж проскочил бы сквозь пол, если бы он повернул назад и не был удален функцией OnExit. Я подозреваю, что это как-то связано с размером портала, но я могу предвидеть, что даже если он будет больше, персонаж немедленно исчезнет, ​​если он повернет назад.
  5. Я думаю, что функция OnTriggerEnter активируется, когда персонаж телепортируется на другую сторону. Это может повлиять на ошибки, о которых я только что говорил, но может привести к большему в ближайшем будущем. Duplication upon touching and box colliders annotated

The original leaves the collision box and gets deleted, but the accidental copy still remains

The current original one touches the portal on the other side and spawns another duplicate

The current original gets deleted once it crosses over the collider box, but the accidental copy still remains

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