c# - 如何停止传送门 A 和 B 之间的无限旅行?

标签 c# algorithm unity3d logic

我正在开发一个 unity 的 2D 游戏,我正在尝试添加一个像黑洞这样的门户系统,当玩家进入黑洞 A 时,他会被传送到黑洞 B,反之亦然......

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

我想要的 是能够从门户 A 移动到 B 并从门户 B 移回到 A 。 不会陷入 A 和 B 之间的无限旅行

这里是负责的代码:

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 移动,负责将玩家 pos 移动到 portal pos 的线会以无限的方式运行,因为玩家会移动到也是门户的门户 B,所以玩家回到门户 A..等等。

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

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

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


这里有一些我已经完成但不起作用或部分起作用的东西:

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

    1. 使用相同的 bool 并在 Update() 中检查它是否为真,然后禁用门户 B 的脚本;直到 pleyer 摆脱它。 (不起作用)。

    2. 使黑洞门户对撞机非常小,然后移动到门户位置 + 1;此解决方案不是最终解决方案(只是一种解决方法),它部分起作用,有时效果很好,有时不起作用。

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

谢谢!

最佳答案

最好的办法是让玩家在传送门的位置 >+1(在 x 或 y 轴上),这样他们实际上就被传送到传送门前...

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

这可以使用 events 和一个名为 canTeleport 的简单 bool 来完成。

关于c# - 如何停止传送门 A 和 B 之间的无限旅行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30398389/

相关文章:

c# - 如何通过单击wpf中的按钮来使用TabIndex导航光标?

algorithm - ID3机器学习算法中统计熵概念相关的一些疑惑

algorithm - 以紧凑的方式使用后缀或前缀对数字进行编码

algorithm - 找到除以haskell的阶乘的数字的最大幂

c# - 无法与 wss ://echo. websocket.org/with UnitySocketIO 握手

c# - C#中的定时器脚本

c# - XNA 4.0 将周围的球体/盒子添加到地形

c# - 将项目从列表框中拖放到特定的 Canvas 中并启动方法

c# - 设置数组的长度属性

c# - Form.OpenFileDialog 使 BinaryFormatter.Serialize 停止工作