我正在我的 2D 游戏中实现爬墙系统,但我遇到了一些比较棘手的部分。
我的想法是,当墙对象与附加的 2D 对撞机发生碰撞时,我会让我的玩家父对象成为墙对象。当玩家与墙壁碰撞时,玩家将成为该墙壁的子级,并且只能在墙上上下移动。当玩家跳跃或到达顶部时,他们不再是墙的孩子。但玩家有能力跳到他们着陆的墙上的任何点并停留在该点。
现在我已经使用以下代码解决了育儿部分(此代码已附加到播放器):
void OnCollisionEnter2D(Collision2D collision)
{
if(collision.gameObject.tag == "Wall")
{
this.transform.parent = collision.transform;
Debug.Log("hit a wall");
}
}
我正在努力解决的两个问题是让我的玩家脱离墙壁,并让玩家仍然停留在墙壁上着陆的位置。
对于第一部分(取消父子关系),我相信我需要使用以下代码:
void OnCollisionExit2D(Collision2D collision)
{
if(collision.gameObject.tag == null)
{
this.transform.parent = null;
Debug.Log("not hitting anythin");
}
}
但是,当我运行这个时,我的播放器不会立即消失。我做得对吗?
我也不知道如何开始我的另一个问题,即让玩家粘在与他们相连的墙壁上。有人可以帮我解决我的问题吗?
理想情况下,您可以使用
tranform.SetParent
来获得超过位置的额外费用。
transform.SetParent(parentTransform, true);
transform.SetParent(null, true);
如果后一行被触发,据我所知,它应该与它的父级分离,并且 SetParent 上的第二个参数应该修复定位问题。
虽然您现有的代码至少应该更改层次结构,但我怀疑问题在于您的碰撞代码 - 如果您输入与 Tag:Wall 的碰撞,那么您将退出与 Tag:Wall 而不是 Tag:Null 的碰撞。
但是@limoragni是对的,编辑你的层次结构不会对你的角色可能的移动产生影响,除非你自己专门编码了。您可以轻松地设置一个布尔值并使用您的代码。
参考: http://docs.unity3d.com/ScriptReference/Transform.SetParent.html
我没有写过任何攀爬机制,但操纵育儿对我来说似乎很容易出错。 这是我的处理方法:
按“空格”退出攀爬模式,同时为你的角色添加ForceImpulse以离开墙壁