基本就是知乎用Unity重现《空洞骑士》的苦痛之路(2)——人物控制篇 - 知乎 (zhihu.com)
的内容。文章纯自己梳理逻辑而已。
核心逻辑
左右控制+检测障碍物
跳跃+蓄力跳
public float jumpTime; //跳跃的最大蓄力时间
float timeJump; //跳跃当前的蓄力时间
public void Jump()
{
if (Input.GetKeyDown(KeyCode.Space))
{
jumpState = true; //进入跳跃状态
moveSpeed.y += jumpPower;//初始添加向上的力
timeJump = 0;//蓄力时间清零
}
else if (Input.GetKey(KeyCode.Space) && jumpCount<=2 && jumpState)
{
timeJump += Time.deltaTime;//蓄力时间增加
if (timeJump < jumpTime)
{
moveSpeed.y += jumpPower;//蓄力
}
}
else if (Input.GetKeyUp(KeyCode.Space))
{
jumpState = false;//退出跳跃状态
timeJump = 0;//蓄力时间清零
}
}
冲刺状态
public bool gravityEnable; //重力开关
public bool inputEnable; //接受输入开关 true 游戏接受按键输入 false不接受按键输入
public void SprintFunc()
{
if (Input.GetKeyDown(KeyCode.J) && isCanSprint)
{
StartCoroutine(SprintMove(sprintTime));//冲刺协程
}
}
IEnumerator SprintMove(float time)
{
inputEnable = false;
gravityEnable = false;//关闭按键输入,以及不在应用重力
moveSpeed.y = 0;//Y轴速度清零
isCanSprint = false;
if (nowDir == PlayDir.Left)
{
moveSpeed.x = 15*-1;
}
else
{
moveSpeed.x = 15;
}//根据方向施加速度
yield return new WaitForSeconds(time);//延迟time秒后执行
inputEnable = true;
gravityEnable = true;
isCanSprint = true;//状态回滚
}
爬墙切换
原版游戏里,在空中时碰到特定墙壁会进入到爬墙的状态。
条件是下一帧需要碰到墙壁,且距离地面有一定的高度才行。代码如下:
下面代码也就是检测是否在地面一定高度上:
进入爬墙状态不能冲刺
public void EnterClimpFunc(Vector3 rayPoint) //移动检测到下一帧碰到墙壁时调用
{
//设定碰到墙 且 从碰撞点往下 玩家碰撞盒子高度内 没有碰撞体 就可进入碰撞状态。
RaycastHit2D hit2D = Physics2D.BoxCast(rayPoint, boxSize, 0, Vector2.down, boxSize.y, playerLayerMask);
if (hit2D.collider != null)
{
Debug.Log("无法进入爬墙状态 "+ hit2D.collider.name);
}
else
{
playAnimator.SetTrigger("IsClimb");//动画切换
isClimb = true;
isCanSprint = true; //爬墙状态,冲刺重置
}
}
有3种方式可以退出爬墙状态:
1.玩家自己受重力下落,超出墙壁的范围。
2.玩家按下跳跃键退出。
3.玩家按下反方向移动键退出。