Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何停止门户A和B之间的无限旅行?_C#_Algorithm_Unity3d_Logic - Fatal编程技术网

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

C# 如何停止门户A和B之间的无限旅行?,c#,algorithm,unity3d,logic,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

我正在与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));


    }
publicgameobjectexitbl;
公共布尔传送=假;
公共图书馆;
//用于初始化
无效开始()
{
}
//每帧调用一次更新
无效更新()
{
如果(传送){
exitBL.GetComponent().enabled=false;//禁用作为exitBL的门户B的逻辑
戈托布尔(coll);
}
}
无效OnTriggerEnter2D(碰撞的R2D列){
如果(列标记==“玩家”){
coll=col;
//col.transform.position=新矢量3(exitBL.transform.position.x,exitBL.transform.position.y,0f);
传送=真;
}
}
无效OnTriggerExit2D(碰撞的R2D列){
如果(列标记==“玩家”){
exitBL.GetComponent().enabled=true;
}
}
void goToBl(碰撞的R2D列){
传送=假;
col.transform.position=新矢量3(exitBL.transform.position.x+1.0f,exitBL.transform.position.y+1.0f,0f);
coll.rigidbody2D.AddForce(新矢量2(-1f,2f));
}
即使我正在添加
AddForce()
以快速从入口B移动,负责将玩家pos移动到入口pos的线路以无限方式运行,因为玩家将移动到入口B,入口B也是入口,因此玩家返回入口a…等等

有没有办法阻止这种行为?我需要一些逻辑方面的帮助

编辑:我更改了代码:现在我正在禁用远程传输时的逻辑。但我也有同样的问题

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


以下是我做过的一些不起作用或部分起作用的事情:

  • 使用一个名为teleport的bool变量,这个变量在进入触发器碰撞器时获得一个真值,并在更新中检查该变量,如果为真,则执行
    goToBl()
    (更新每帧运行一次)(不起作用)

  • 使用相同的bool并在Update()中检查它是否为true,然后禁用portal B的脚本;直到普莱尔离开它。(不起作用)

  • 使黑洞入口对撞机非常小,然后移动到入口位置+1;这个解决方案不是最终的解决方案(只是一种变通方法),它部分有效,有时效果很好,有时不起作用

  • 有谁能给我一个解决这个问题的办法吗


    谢谢你

    没有技术方面的问题,事实上,当你传送A=>B时,你想要的是远离门户B


    一个简单的解决方案是将你的角色放得更远一点,因此他必须后退一步才能再次进入门户。

    你最好的选择是让玩家的位置
    +1
    (在x轴或y轴上),这样他们实际上被传送到门户前面

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


    这可以通过使用
    事件
    和名为
    canTeleport
    的简单
    bool
    来完成。我有两种可能的解决方案供您选择:

  • (我的意见是最好的)-
  • 在每个门户使用时间计数器。-->当你的字符处于入口位置时,开始计数3秒,然后传送将激活。(如果玩家在3秒内不离开另一个传送站,他将被传送回来)

  • 使用“邻近”-->使用一个布尔变量,该变量始终为false,只要字符从传送中到达“1空格”,则该变量为true,如果该布尔为true,则仅传送

  • 你需要在你的门户之间建立一个链接,来投票你是否应该发起一个远程传送,因为你的远程传送者总是被调用的。当你轮询你的目的地,看看你是否被允许传送玩家时,上面类似的东西应该起作用。这样,玩家必须在传送门再次传送他们之前完全退出传送门。

    我在问题中说(最后看第3条),我已经尝试过了,但我认为这不是最好的解决方案,我正在寻找一种技术,使这行代码只运行一次。那么,仅仅字符位置就允许他们进入门户?如果角色已经通过了入口逻辑,我会抑制它,然后当他们离开入口的边界区域时,你可以重置对逻辑的抑制,直到他们再次移动回入口。这听起来像是你们已经尝试过的。这被称为聊天,典型的解决方案是实现滞后:在传送后,除非移动一点,否则你们不能传送回来。科学提示:“黑洞”不是入口系统。理论上的虫洞可能是。@DeltaWeb如果代码足够小,请不要让我们单击链接获取它,然后将代码放入其中。(在这个网站上,让用户访问外部源代码通常被认为是“不礼貌的”)+1。对于@DeltaWeb,我建议使用en
    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));
        }
    }