在 Unity 中制作让玩家跳跃碰到墙跳下来,如夹在俩面墙之间,则依托于另外一面墙,继续向上跳跃,直至遇到障碍物停止,该过程需要检测玩家何时撞到墙并使其能够跳跃。

因此实现这一目标,则需要在播放器脚本中,创建了一些变量来配置跳墙的物理特性。
如下:
// 跳跃墙变量
[SerializeField]
private bool _canwallJump = false; // Bool检查玩家是否可以跳跃
private Vector3 _wallJumpDirection; // 墙壁的发现表面向量
private Vector3 _wallJumpBoost; // 矢量和速度相加
[SerializeField]
private float _wallJumpForce = 5.0f; // 墙跳力
然后使用 OnControllerColliderHit,因为需要检测玩家是否接地了?是否被碰到的物体?是否是墙壁?如果碰到该干嘛!
如果玩家在半空中接触到墙壁,且碰撞均为真,那么 _canWallJump 更改为 true,wallJumpBoots 为 0,其中 hit.normal 的 wallJumpDirection 是一个 Vector3,它指向玩家接触的墙的相反方向。
如下:
private void OnControllerColliderHit(ControllerColliderHit hit)
{
if (_controller.isGrounded == false && hit.transform.tag =="wall')
{
Debug. DrawRay(hit.point, hit.normal, color.blue);
_canwallJump = true;
_wallJumpBoost = Vector3.zero;
_wallJumpDirection = hit.normal;
}
}
private void SetwallJumpPhysics(bool canwallJump, bool doubleJump, Vector3 wallJumpBoost, float speed)
{
_canwalljump = canwallJump;
_doubleJump = doubleJump;
_wallJumpBoost = wallJumpBoost;
_speed = speed;
}
因为玩家在地面上,因此在玩家接触到地面时的 Update 方法中,可以使用 SetWallJumpPhysics 函数设置默认值。
然后当玩家没有接地并按下空格键时,将检查 canWallJump 是否为真。
在这种情况下,将 canWallJump 和 DoubleJump 设置为 false 以使玩家无法再次跳跃,wallJumpBoost 将是 wallJumpDirection 乘以 wallJumpForce 最后将玩家速度设置为 1 以使玩家无法水平移动跳墙。
之后,只需将 wallJumpBoost 添加到玩家速度并使用 Move 函数来移动玩家。
如下:
void Update()
{
// 水平运动
float h = Input.GetAxis("Horizontal");
Vector3 direction = new Vector3(h,0,0);
Vector3 velocity = direction * _speed;
if (_controller.isGrounded)
{
SetwallJumpPhysics(false,true,Vector3.zero,DEFAULT_SPEED);
// .. 更多与跳跃墙无关的代码
} else
{
if ( Input.GetKeyDown(KeyCode.Space))
{
if (_canwallJump == true)
{
_yVelocity = _jumpHeight;
SetwallJumpPhysics(false,false,_wallJumpDirection * _wallJumpForce,1.0f);
}
else if (_doubleJump == true)
{
// 更多与跳跃墙无关的代码
}
}else
{
// 更多与跳跃墙无关的代码
}
}
velocity.y = _yVelocity;
velocity += _wallJumpBoost;
_controller.Move(velocity * Time.deltaTime);
// 更多与跳跃墙无关的代码
}
到这里, 现在就可以在场景中操纵玩家实现具有物理属性的跳跃动画了。
