目录
一、二段跳、蹬墙跳
GitHub - prime31/CharacterController2D
下载工程后直接打开demo场景:DemoScene(Unity 2019.4.0f1项目环境)
Player物体上的CharacterController2D,Mask添加Wall层(自定义墙体层)
将场景里其中一个障碍物设置为Wall层 Wall标签 并拉伸为墙体高度
Player物体上的Demo Scene脚本控制玩家移动 二段跳 蹬墙跳
蹬墙跳要调整好Jump On Wall H Force 横向力 和 Jump On Wall V Force 纵向力 数值才能表现正常,其中 V Force 是在 1的基础上的增量值,这里的力并非物理力实际是速度增量倍率。
跳跃对Y轴速度影响是用公式:根号2gh
代码则是:Mathf.Sqrt(2f * jumpHeight * -gravity),加速度是重力反方向,跳跃高度固定,则计算出了速度增量,之后用它乘以(1+V Force)得出的一个对Y轴速度影响的增量。
上例子中速度增量根号2gh是8.48,因此每次蹬墙跳Y速度增量是8.48*1.335=11.32
代码默认有重力对Y轴速度影响:_velocity.y += gravity * Time.deltaTime; 即每秒Y轴速度会减去重力加速度(墙上为-24,地面为-25)若帧数是30,则每帧会减少0.8。具体可以将_velocity参数公开查看变化,实际蹬墙跳会离开墙体,重力加速度为-25,可自行调整这些参数来达到理想效果
修改部分代码:
private float rawGravity;
private int jumpLevel;//跳跃阶段 1段跳 2段跳
private int dir; //朝向 -1左 1右
public LayerMask jumpOnWallMask = 0;//墙体Layer层遮罩
private bool isHoldWall; //是否在墙上
public float jumpOnWallHForce = 1; //墙上跳跃横向力度
public float jumpOnWallVForce = 2; //墙上跳跃纵向力度
public float gravityOnWall = -24f;
void Awake()
{
//... ...
rawGravity = gravity;
}
void Update()
{
if (_controller.isGrounded)
{
gravity = rawGravity;
_velocity.y = 0;
jumpLevel = 0;
}
//朝着dir方向发射长度为(碰撞体宽度+自身皮肤厚度)的射线
RaycastHit2D hit = Physics2D.Linecast(playerBottomTrans.position, playerBottomTrans.position +
new Vector3(dir * (Mathf.Abs(transform.localScale.x) * _controller.boxCollider.size.x / 2f + _controller.skinWidth), 0, 0), ju