统一养育和去养育游戏对象

本文关键字:游戏 对象 | 更新日期: 2023-09-27 17:49:17

我目前正在我的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上的第二个参数应该修复定位问题。

虽然你现有的代码应该至少改变层次结构,我怀疑问题是你的碰撞代码-如果你输入一个碰撞标签:墙,那么你将退出碰撞标签:墙,而不是标签:Null。

然而@limoragni是对的,编辑你的层次结构对你的角色的可能运动没有影响,除非你自己特别编码。你可以很容易地设置一个布尔值,并使用你的代码。

参考:http://docs.unity3d.com/ScriptReference/Transform.SetParent.html