我为探测攀登(附加到玩家对象的脚本)制作了一些代码:
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 图像:
为什么它不起作用?如果你知道另一种攀登方式,你能解释一下吗?
答案 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)
对于此方案,请考虑以下情况:
$.parseJSON('<?php echo base_url().'mycontrollers';?>', function(datas) {
console.log(datas);
});
player_top_y <= wall_top_y
计算为player_top_y
,而应直接使用碰撞contact point