C# 如何停止门户A和B之间的无限旅行?
我正在与unity一起开发一个2D游戏,我正在尝试添加一个类似黑洞的门户系统,当玩家进入黑洞a时,他会被传送到黑洞B,反之亦然 主要问题是当玩家对象位置更改为黑洞“B”时,由于黑洞B本身是一个入口,玩家在a和B之间的无限行程中受阻,导致许多错误和非常糟糕的行为 我想要的是能够从入口A移动到入口B,并从入口B移回入口A。而不会被困在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
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…等等
有没有办法阻止这种行为?我需要一些逻辑方面的帮助
编辑:我更改了代码:现在我正在禁用远程传输时的逻辑。但我也有同样的问题
**注意**:现在,我正在使我的对撞机变得非常小,并传送我的播放器并添加一个偏移量,这个解决方案可行,但应该有更好的方法
以下是我做过的一些不起作用或部分起作用的事情:
goToBl()
(更新每帧运行一次)(不起作用)
谢谢你 没有技术方面的问题,事实上,当你传送A=>B时,你想要的是远离门户B
一个简单的解决方案是将你的角色放得更远一点,因此他必须后退一步才能再次进入门户。你最好的选择是让玩家的位置
+1
(在x轴或y轴上),这样他们实际上被传送到门户前面
但是,如果出于任何原因你想让他们直接传送到传送门:每次传送后,在玩家离开传送门位置之前,不允许玩家再次传送
这可以通过使用
事件
和名为canTeleport
的简单bool
来完成。我有两种可能的解决方案供您选择:
你需要在你的门户之间建立一个链接,来投票你是否应该发起一个远程传送,因为你的远程传送者总是被调用的。当你轮询你的目的地,看看你是否被允许传送玩家时,上面类似的东西应该起作用。这样,玩家必须在传送门再次传送他们之前完全退出传送门。我在问题中说(最后看第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));
}
}