统一墙攀登2D

时间:2018-03-23 08:06:44

标签: c# unity3d

我为探测攀登(附加到玩家对象的脚本)制作了一些代码:

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 图像:

enter image description here

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

3 个答案:

答案 0 :(得分:3)

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

    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而陷入困境,理想的应该是当你在墙上时爬山,你不要如果再次跳跃会让玩家高于墙壁,那么你可能会对在相同情况下到达墙顶的感兴趣更多

答案 1 :(得分:3)

这些变量完全相同的可能性很低。玩家将在一个框架上方,下一个框架在下方。

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

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;               
}

答案 2 :(得分:1)

对于此方案,请考虑以下情况:

  1. 正如已经在另一个回复中发布的那样,您不应该使用相等比较,而应该进行小于比较,即$.parseJSON('<?php echo base_url().'mycontrollers';?>', function(datas) { console.log(datas); });
  2. 其次,不应将player_top_y <= wall_top_y计算为player_top_y,而应直接使用碰撞contact point