一、角色移动
1.动画状态机设置:
(1):角色移动动作通常作分为Idle,Run,Jump,Fall
(2):然后在细分一下:地面动作(Idle,Run),空中动作(Jump,Fall)
(3):具体设置如下:
在Animator界面 右键-> create sub-state创建一个子状态(GroundState)和 (AirState)
GroundState内部:
AirState内部:
参数设置:
然后我们看一下这些state的transition条件:
isGround用于判断Player是否在地面,在地面就进入GroundState,反之AirState
isRun是用来判断Player移动的,我们进入GroundState内部
而我们从子状态退出到AirState的条件也是isGround判断接触地面(Run,Idle同理)
然后我们进入到AirState内部,我们初始的状态连接到Fall上面,保持Player离开地面时,执行Fall动画,同时Fall动画退出子状态条件:isGround = true;
最后,经过这样,Idle-Run-Fall的动画状态过渡就设计好啦
二、角色跳跃
1.动画状态机设置:
我们创建参数isJump(Trigger类型)
注:Trigger类型会自动变成false,个人理解好用于一些触发的操作吧~
因为跳跃也会下降嘛,我们也是会进入AirState状态的,所以Ground到AirState的过渡条件:
然后我们进入AirState,注意我们是Jump操作,我们过渡的条件需要指向Jump动画,如图:
等Jump动画结束呢,我们直接过渡到Fall动画,如图:
这样,Player基本动画过渡就实现啦
接下来就是脚本控制了
三、脚本基本思路
角色移动:RigidBody2D组件
private float dix; // 角色水平方向
// 获取角色的水平方向
dix = Input.GetAxisRaw("Horizontal");
// 设置速度
rigidbody2D.velocity = new Vector2(dix * runSpeed,rigidbody2D.velocity.y);
// 判断是否移动 当前值大于一个很小的值
isMove = Mathf.Abs(rigidbody2D.velocity.x) > Mathf.Epsilon;
//Debug.Log("当前的isMove:" + isMove);
animator.SetBool("isRun", isMove);
角色左右翻转:我们使用SpriteRenderer组件的FIipX属性
角色跳跃:
1.我们需要判断Player是否接触地面
在创建一个GameObject放在Player的脚下检测是否接触地面
/// <summary>
/// 接触地面检测
/// </summary>
public void IsTouchGround()
{
isGround = Physics2D.OverlapCircle(pointGround.transform.position, 0.05f, LayerMask.GetMask("Ground"));
animator.SetBool("isGround", isGround);
}
2.然后就到了跳跃实现(二段跳~我们可以Fall的状态返回DoubleJump的状态)
/// <summary>
/// 角色跳跃
/// OverlapCircle 检测2D圆形区域内碰撞的方法
/// </summary>
public void Jump()
{
if (isGround)
{
isCanDouble = true;
}
// 按下space键
if (Input.GetButtonDown("Jump"))
{
// 如果在地面,可以跳跃
if (isGround)
{
// 设置向上速度
rigidbody2D.velocity = Vector2.up * new Vector2(0f, jumpSeed);
animator.SetTrigger("isJump");
}
else if(isCanDouble)
{
// 二段跳
rigidbody2D.velocity = Vector2.up * new Vector2(0f, jumpSeed + 1.5f);
animator.SetTrigger("isCanDouble");
isCanDouble = false;
}
}
}
请大家多多指教啦~
运行结果如下: