【问题标题】:2D Portal only working sometimes in Unity2D Portal 有时只能在 Unity 中工作
【发布时间】:2020-03-06 15:57:07
【问题描述】:

我正在尝试在 Unity 中创建一个 2D 门户,而不仅仅是将玩家传送到另一个门户游戏对象。但是在通过传送门后保持玩家的位置和移动方向和速度。

我不是艺术家,但例如: 玩家是一个在一个区域内弹跳的球,当他穿过传送门时,他的速度保持不变,同时他进入了传送门的中心。

这里例如: 如果玩家进入传送门的下半部分,他会从传送门的下半部分出来。

当它工作时,它工作得很好!然而,它只在 50% 的情况下有效,虽然这 50% 可能有很多不同的问题,但有时球不会传送。有时球会击中第一个传送门,然后传送到第二个传送门,然后又回到第一个传送门,并且它会一直重复此过程。它似乎随机地遇到这些问题。

这是我的脚本:

public GameObject otherPortal;
    public PortalController otherPortalScript;
    private BallController ballController;
    public float waitTime = 0.5f;

    [HideInInspector]
    public bool teleporting;

    // Use this for initialization
    void Start () 
    {

    }

    // Update is called once per frame
    void Update () 
    {

    }

    void OnTriggerEnter2D(Collider2D other)
    {
        if (other.gameObject.tag == "Ball")
        {
            ballController = other.GetComponent<BallController>();
            if(!teleporting)
            {
                var offset = other.transform.position - transform.position;
                offset.x = 0;
                other.transform.position = otherPortal.transform.position + offset;
                otherPortalScript.teleporting = true;
                teleporting = true;
                StartCoroutine("Teleport");
            }            
        }
    }

    void OnTriggerExit2D(Collider2D other)
    {
        if (other.gameObject.tag == "Ball")
        {
            teleporting = false;
            otherPortalScript.teleporting = false;
        }

    }

    IEnumerator Teleport()
    {
        yield return new WaitForSeconds(waitTime);
        teleporting = false;
        otherPortalScript.teleporting = false;
        ballController.teleporting = false;
    }
}

脚本附加到两个门户,它们都是同一对象的预制件。我在编辑器中设置了“otherPortal”、“otherPortalScript”和“waitTime”。 “waitTime 是我必须”在解决另一个问题之后添加的,有时“传送”从未设置为 false,我相信该问题的原因与此问题的原因相同,使得“waitTime “只是一个更大问题的绷带。此外,任何时候 Portal 脚本更改“ballController”中的变量,例如“ballController.teleporting = false;”,它只是因为球是从得分系统中添加/删除点,它根本不会影响球的运动.

【问题讨论】:

  • 观看this coding adventures 视频,他经历了他在制作门户网站时遇到的所有错误。我很确定他会遇到类似的问题,如果不是同样的问题。
  • 由于浮点错误,将入口视为有厚度会有所帮助,并意识到触摸入口与完全处于其两侧是一种不同的状态。
  • @GTBebbo 我可能是错的,但在观看视频后,它似乎只是解释了视觉门户错觉的斗争,我的门户是 2D 的,不需要那种错觉,因为它们玩家不需要让相机通过另一个门户查看。我错过了什么吗?
  • @LeoBartkus 说得很好,你会如何反驳它?
  • @JhonPiper 如果我没记错的话,他确实扩大了传送门的厚度以处理 LeoBartkus 建议的并非总是传送的问题。但是很抱歉,我错过了原始帖子,没有意识到它只是 2D。

标签: c# unity3d


【解决方案1】:

考虑去掉传送门和球的teleporting 属性以及waitTime

现在给球一个List&lt;PortalController&gt; inUseControllers(注意你需要添加using System.Collections.Generic)。每当它碰撞进入一个传送门时,通过inUseControllers.Count == 0 检查列表是否为空,如果是,则将涉及的PortalController 添加到该列表并处理传送运动。当球碰撞退出PortalController 时,将其从inUseControllers 列表中删除;因此只有在球离开每个入口区域后才会再次清空。

这种方法应该简化代码,同时安全地防止意外的来回循环。

【讨论】:

  • 好吧,作为一个新程序员,我从来不用那样处理列表,当你说“将两个相关的 PortalController 都添加到该列表中”时,我很难弄清楚该放在哪里.你能给我一个更详细的例子吗?
  • 要将它们添加到列表中,请使用例如inUseControllers.Add(this); (如果您在 PortalController 类之一中)后跟inUseControllers.Add(otherPortalScript);。确保它已经通过List&lt;PortalController&gt; inUseControllers = new List&lt;PortalController&gt;(); 在顶部创建过一次。祝你好运!
  • 感谢您的回复,我删除了 teleportwaitTime 函数,并将其替换为列表,因此现在看起来像这样:pastebin.com/Nckgbp7i 使用列表消除了球根本不会传送;并将传送并立即传送回来的问题减少到大约只有 10% 的时间。但这 10% 仍然是个问题。你知道那 10% 的原因吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多