如何阻止门户A和B之间的无限旅行?

时间:2015-05-22 13:45:48

标签: c# algorithm unity3d logic

我正在制作一个团结的2D游戏,我正在尝试添加一个类似黑洞的门户系统,当玩家进入Blackhole A时,他会被传送到黑洞B,反之亦然...

主要问题是当玩家对象位置变为黑洞“B”时,由于黑洞B本身就是一个门户,玩家会陷入A和B之间的无限行程,导致许多错误和非常糟糕的行为。

我想要的是能够从门户网站A移动到B并从门户网站B移回A。 没有陷入A& A之间的无限旅行乙

这里的代码负责:

public GameObject exitBL ;
    public bool teleport = false;
    public Collider2D coll;
            // Use this for initialization
            void Start ()
            {

    }

            // Update is called once per frame
            void Update ()
    {
            if (teleport) {
                    exitBL.GetComponent<BlackHolePortal>().enabled = false; // Disable the logic for portal B which is exitBl
                    goToBl(coll);
                            }

    }
    void OnTriggerEnter2D(Collider2D col){
            if (col.tag == "Player") {
                    coll = col;
                    //col.transform.position = new Vector3 (exitBL.transform.position.x  , exitBL.transform.position.y , 0f);
                    teleport = true;


                            }

    }
    void OnTriggerExit2D(Collider2D col){
            if (col.tag == "Player") {
                    exitBL.GetComponent<BlackHolePortal>().enabled = true;
                            }

            }
    void goToBl(Collider2D col){
            teleport = false;
             col.transform.position = new Vector3 (exitBL.transform.position.x + 1.0f  , exitBL.transform.position.y + 1.0f  , 0f);

            coll.rigidbody2D.AddForce (new Vector2 (-1f,2f));


    }

即使我正在快速添加AddForce()从Portal B移动,由于玩家将移动到门户B,因此将玩家pos移动到门户pos的线路以无限方式运行这也是一个门户,所以玩家回到门户网站A..etc。

有什么方法可以阻止这种行为吗?我在逻辑上需要一些帮助。

编辑:我已经更改了代码:现在我在传送时禁用了逻辑。但我得到同样的问题。

**注意**:现在,我正在使我的对手非常小并传送我的播放器并添加偏移量,这个解决方案有效,但应该有更好的方法。

这里有一些我已经完成的东西,它们不能正常工作或部分工作:

  1. 使用名为teleport的bool var,当它进入触发器对撞机时,它会获得一个真值,并在Update中检查该var,如果为true,则执行goToBl()(每帧更新运行一次)(不起作用)

    1. 使用相同的bool并检查Update()中是否为true,然后禁用门户网站B的脚本;直到讨厌离开它。 (不起作用)。

    2. 使黑洞门户碰撞器非常小,然后移动到门户位置+ 1;这个解决方案不是最后的解决方案(只是一种解决方法),它可以部分工作,有时效果非常好,有时它不起作用。

  2. 任何人都可以建议我解决这个问题的解决方案吗?

    谢谢!

4 个答案:

答案 0 :(得分:1)

最好的办法是让玩家在门户网站上>+1(在x或y轴上),这样他们实际上就可以在门户网站前传送了......

但是,如果由于某种原因你想让他们直接传送到门户网站:每次传送后都不允许玩家再次传送,直到他们离开传送器位置。

可以使用events和名为bool的简单canTeleport来完成此操作。

答案 1 :(得分:0)

关于技术方面没有任何内容,当你传送A =&gt;时,你想要的是门户网站B.乙

一个简单的解决方案是让你的角色更进一步,因此他必须再次回到门户网站。

答案 2 :(得分:0)

我有两种可能的解决方案:

  1. (我的意见是最好的) -
  2. 每个门户使用时间计数器。 - &GT;当您的char处于门户位置时,开始计数为3秒,然后传送将激活。 (如果玩家在3秒钟内没有离开另一个传送点,他将被传送回传输)

    1. 使用&#34;邻近&#34; - &GT;使用一个boolean varible,它总是为false,只要char到达&#34; 1 space&#34;从传送它是真的,然后只有传送,如果那个布尔是真的。

答案 3 :(得分:0)

public class Portal
{
    public bool canBeTeleportedTo = true;
    public Portal partnerPortal; // Assign this however you want

    void OnTriggerEnter2D(Collider2D col)
    {
        if (col.tag == "Player")
        {
            if (partnerPortal.canBeTeleportedTo == true)
            {
                TeleportToPartner(col);
            }
        }

    }
    void OnTriggerExit2D(Collider2D col){
        if (col.tag == "Player")
        {
            partnerPortal.canBeTeleportedTo = true;
        }

    }

    void TeleportToPartner(Collider2D col)
    {
        canBeTeleportedTo = false;

        col.transform.position = new Vector3 (partnerPortal.transform.position.x , partnerPortal.transform.position.y, 0f);

        col.rigidbody2D.AddForce (new Vector2 (-1f,2f));
    }
}

您需要在门户网站之间建立链接,以便轮询您是否应该启动传送,因为您的OnTriggerEnters将始终被调用。当您轮询目的地以查看是否允许您传送播放器时,上述内容应该有效。这样,您的玩家必须在门户网站再次传送门户之前完全退出门户网站。