【问题标题】:Unity wall climbing 2Dunity 爬墙 2D
【发布时间】:2018-03-23 08:06:43
【问题描述】:

我编写了一些代码来检测攀爬(附加到播放器对象的脚本):

private float PlayerColHeight;
private float PlayerColWidth;
private bool Climb = false;


void Start () {
    PlayerCol = GetComponent<CapsuleCollider2D> ();
    PlayerColHeight = PlayerCol.bounds.size.y;
    PlayerColWidth = PlayerCol.bounds.size.x;
}
private void OnCollisionStay2D(Collision2D col){
    if (!IsGrounded() && (col.gameObject.tag == "Wall")) {
        Vector2 position = transform.position;
        Vector2 wallPos = col.transform.position;
        float wallColHeight = col.gameObject.GetComponent<BoxCollider2D> ().bounds.size.y;
        if ((position.y+PlayerColHeight/2)==(wallPos.y + wallColHeight/2)){
            Climb = true;               
        }
        Debug.Log (Climb);
    }
}    

这意味着当玩家在空中并与墙壁碰撞时,我需要检查玩家顶部 Y = 墙壁顶部 Y 并了解它是否有效。 但这不起作用...控制台仅返回 False。
图片:

为什么它不起作用?如果你知道另一种攀登的方法,你能解释一下吗?

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    我认为你的条件陈述是错误的

        if ((position.y+PlayerColHeight/2)==(wallPos.y + wallColHeight/2)){
        Climb = true;               
    }
    

    应该是

        if ((position.y+PlayerColHeight/2) <= (wallPos.y + wallColHeight/2)){
        Climb = true;               
    }
    

    只有当两个值相等时攀爬才为真,但是当玩家位置小于墙壁时,您对攀爬感兴趣,对吧?

    在任何情况下,您都应该在调试游戏时检查您的值,或者只使用值 position.y+PlayerColHeight/2 和 wallPos.y + wallColHeight/2 编写日志以了解发生了什么。

    编辑:当你接近离开“攀爬区”时,你的玩家可能会被卡住,因为他会得到 Climb = false,理想的情况应该是在你在墙上时启用攀爬,你不要'不在乎再次跳跃是否会让玩家离开墙壁,更重要的是在相同情况下到达墙壁顶部时您可能会感兴趣

    【讨论】:

    • 不,我只需要我的 if 语句,但现在我尝试将 System.Math.Round 添​​加到我的播放器顶点行列式中,它可以工作......
    • 两者都应该工作。但是由于浮点错误,坐标上的“==”几乎永远不会起作用。您将 y=1.00001 与 1 进行比较 - 这将返回 false。
    • 我不知道,我只是尝试调试我的播放器顶点的浮点值并检测到这一点。无论如何感谢您的帮助:)
    【解决方案2】:

    这些变量完全相同相同的可能性很低。播放器会在上一帧,下一帧在下。

    玩家应该在墙下有一个可以攀爬的范围。试试这个:

    const float climbZoneHeight = 1f; // In world unit, the range of the wall on which the player can climb. Choose a value that works well in your case;
    
    const float distToWallTop = (wallPos.y + wallColHeight/2) - (position.y+PlayerColHeight/2);
    
    if (distToWallTop >= 0 && distToWallTop <= climbZoneHeight )
    {
        Climb = true;               
    }
    

    【讨论】:

    • 是的,它有帮助,但我只需要在 Cat 对撞机低于墙顶点时检测爬升
    • 我认为这应该比当前接受的答案更好
    • 我这样做了 if(((wallPos.y + wallColHeight/2) - (position.y+PlayerColHeight/2))
    • 但是当玩家在墙上方时也是如此。我对帖子所做的编辑应该可以解决这个问题
    • 是的,这就是我需要的。然后将开始爬到墙上的动画。你也许认为我的猫会在墙壁之上?不,只是暂时降低,我只是白盒化我的游戏。无论如何感谢这种帮助,也许我将来会使用它,当其他功能将被添加时:)
    【解决方案3】:

    对于这种情况,请考虑以下情况:

    1. 正如已经在另一个回复中发布的那样,您不应该使用相等比较,而是应该进行小于比较,即player_top_y &lt;= wall_top_y
    2. 其次,不要将player_top_y计算为player_y + player_collider_y,而是直接使用碰撞contact point

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多