游戏对象的父子关系和解除父子关系

问题描述 投票:0回答:2

我正在我的 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");
    }
}

但是,当我运行这个时,我的播放器不会立即消失。我做得对吗?

我也不知道如何开始我的另一个问题,即让玩家粘在与他们相连的墙壁上。有人可以帮我解决我的问题吗?

c# unity-game-engine
2个回答
0
投票

理想情况下,您可以使用

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


0
投票

我没有写过任何攀爬机制,但操纵育儿对我来说似乎很容易出错。 这是我的处理方法:

  • 在攀爬时定义角色的中心点(比如说腹部)
  • 当您击中可攀爬的对撞机时,停止重力并清除所有力(可以选择存储力,以便您可以按照自己想要的方式使用它们,这对于抛光步骤很有用)
  • 从腹部(您定义的中心点)向可攀爬碰撞体进行射线投射,并使用接触来正确设置角色的位置和旋转。
  • 更改代码中某处的枚举/布尔值,以便现在可以使用您编写的攀爬角色移动函数。

按“空格”退出攀爬模式,同时为你的角色添加ForceImpulse以离开墙壁

© www.soinside.com 2019 - 2024. All rights reserved.