首页 > 解决方案 > Unity2D中有相交边时让角色在画布之间穿梭

问题描述

我正在创建一个视频游戏,其中角色必须在文字艺术画布(用于绘画的画布)中旅行才能达到最终目标。

请注意,我所指的“画布”不是 UI 元素,而是您在现实生活中看到的实际画布。

下图描述了游戏的核心运动机制

我的代码基于门户的概念。这可能不是处理它的最有效方法,我会考虑所有建议。

这是我当前的代码:

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;
}

“原始角色”将与门户的盒子碰撞器发生碰撞,并在门户的另一端创建一个副本。在下面的第一张图片中,box collider 用红色标注。请注意,尺寸完全相同。

请注意,从技术上讲,它不是一个门户,但由于它是一个将角色从一个地方带到另一个地方的盒子,我不妨称之为门户。

一旦原件离开盒子对撞机,它将被删除,然后克隆将成为“原件”。

我正在使用队列系统来确定首先删除哪个“克隆”。

这样做有几个问题:

  1. 这是非常低效的。我必须为画布中的每个交叉点手动创建门户。想象一个充满画布的关卡,想象一个充满关卡的游戏......
  2. 当它接触到传送门时,原始角色会生成一个副本。有三个字符,但 Clones.Count 只注册了两个。
  3. 我不确定代码对于垂直遍历的效果如何。
  4. 当角色穿过传送门时,它应该能够返回。在这段代码中,如果角色要返回而不被 OnExit 函数删除,他会在地板上出现故障。我怀疑这与传送门的大小有关,但我可以预见,即使它更大,如果他回头,角色也会立即消失。
  5. 我认为 OnTriggerEnter 功能在角色被传送到另一侧时被激活。这可能会对我刚才所说的错误产生影响,但在不久的将来可能会导致更多。 触摸时复制和注释盒对撞机

原件离开碰撞箱并被删除,但意外副本仍然存在

当前的原始人触及另一侧的门户并产生另一个副本

当前原件一旦越过碰撞盒就会被删除,但意外副本仍然存在

标签: c#unity3d

解决方案


推荐阅读