【发布时间】: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。