增加起跳和下落动画,素材文件是:
把四个动画的关系理顺:
增加两个参数 Jumping 和 Falling。
把指向 Jump 的两条线的 Settings 按如下设置:
然后都增加一个 Jumping 为 true 的条件。
在角色跳跃的时候增加一条动画转换代码:
专门写一个起跳到落下的函数逻辑:
SwitchAnim 放在 FixedUpdate 中与 Movement 一起执行。到这里,已经完成了起跳 -> 下落的转变,但是下落到站立的动画还没有实现。
下落到站立,即角色与地面相接触就变为站立动画,那么需要对是否接触到地面进行判断。
给 Tilemap 的 ground 增加一个 Layer:
在脚本中定义一个 LayerMask 变量
然后在脚本组件界面就可以看到这个变量了,选择刚刚添加的 Layer。
这里的 Layer 就是作为碰撞监测的一种方案。
那么在代码中首先需要获取到角色的 Collider 2D,定义变量:
然后在 SwitchAnim 函数中写和地面接触的逻辑:
这样在与地面接触时动画状态就变成站立了。
到此,所有的动画及其转化逻辑已经全部实现(不包括优化跳跃和移动手感)。
目前为止的完整代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerControler : MonoBehaviour
{
public Rigidbody2D rb;
public Animator anim;
public float speed;
public float jumpForce;
public LayerMask ground;
public Collider2D coll;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void FixedUpdate()
{
Movement();
SwitchAnim();
}
void Movement(){
float horizontalMove = Input.GetAxis("Horizontal");
float faceDirrection = Input.GetAxisRaw("Horizontal");
// 角色移动
rb.velocity = new Vector2(horizontalMove * speed * Time.deltaTime, rb.velocity.y);
anim.SetFloat("Running", Mathf.Abs(faceDirrection)); // 绝对值
if(faceDirrection != 0){
transform.localScale = new Vector3(faceDirrection, 1, 1);
}
// 角色跳跃
if(Input.GetButtonDown("Jump")){
rb.velocity = new Vector2(rb.velocity.x, jumpForce * Time.deltaTime);
anim.SetBool("Jumping", true);
}
}
void SwitchAnim ()
{
anim.SetBool("Idling", false);
if(anim.GetBool("Jumping")){
// 开始下落
if(rb.velocity.y < 0){
anim.SetBool("Jumping", false);
anim.SetBool("Falling", true);
}
}
// 和地面接触
else if(coll.IsTouchingLayers(ground)){
anim.SetBool("Falling", false);
anim.SetBool("Idling", true);
}
}
}