我正在制作一个团结的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。
有什么方法可以阻止这种行为吗?我在逻辑上需要一些帮助。
编辑:我已经更改了代码:现在我在传送时禁用了逻辑。但我得到同样的问题。
**注意**:现在,我正在使我的对手非常小并传送我的播放器并添加偏移量,这个解决方案有效,但应该有更好的方法。
这里有一些我已经完成的东西,它们不能正常工作或部分工作:
使用名为teleport的bool var,当它进入触发器对撞机时,它会获得一个真值,并在Update中检查该var,如果为true,则执行goToBl()
(每帧更新运行一次)(不起作用)
使用相同的bool并检查Update()中是否为true,然后禁用门户网站B的脚本;直到讨厌离开它。 (不起作用)。
使黑洞门户碰撞器非常小,然后移动到门户位置+ 1;这个解决方案不是最后的解决方案(只是一种解决方法),它可以部分工作,有时效果非常好,有时它不起作用。
任何人都可以建议我解决这个问题的解决方案吗?
谢谢!
答案 0 :(得分:1)
最好的办法是让玩家在门户网站上>+1
(在x或y轴上),这样他们实际上就可以在门户网站前传送了......
但是,如果由于某种原因你想让他们直接传送到门户网站:每次传送后都不允许玩家再次传送,直到他们离开传送器位置。
可以使用events
和名为bool
的简单canTeleport
来完成此操作。
答案 1 :(得分:0)
关于技术方面没有任何内容,当你传送A =&gt;时,你想要的是门户网站B.乙
一个简单的解决方案是让你的角色更进一步,因此他必须再次回到门户网站。
答案 2 :(得分:0)
我有两种可能的解决方案:
每个门户使用时间计数器。 - &GT;当您的char处于门户位置时,开始计数为3秒,然后传送将激活。 (如果玩家在3秒钟内没有离开另一个传送点,他将被传送回传输)
答案 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将始终被调用。当您轮询目的地以查看是否允许您传送播放器时,上述内容应该有效。这样,您的玩家必须在门户网站再次传送门户之前完全退出门户网站。