Unity Assets:Sunnyland

Day3

1. 添加idle动画

添加Animator组件:

unity animator 动画总时长 unity animator动画切换_Time


建文件夹并创建Animator Controller,拖入上面的组件:

unity animator 动画总时长 unity animator动画切换_游戏开发_02


创建一个名为idle的动画,拖入图片。如果播放速度太快,减少Samples。

unity animator 动画总时长 unity animator动画切换_Time_03


注意:拖入图片前,记得修改

unity animator 动画总时长 unity animator动画切换_unity_04

Window->Animator中可以看见idle是默认动画,点击试玩,即开始播放。

unity animator 动画总时长 unity animator动画切换_游戏开发_05

2. run和idle的切换

同上,新建clip。

unity animator 动画总时长 unity animator动画切换_Time_06


记得勾选:

unity animator 动画总时长 unity animator动画切换_游戏开发_07


在Animator中,设置两个状态的切换条件。

unity animator 动画总时长 unity animator动画切换_ide_08


添加一个布尔型的参数判断是否在跑动状态。

unity animator 动画总时长 unity animator动画切换_游戏开发_09


还要取消两个运动状态中间的过渡。

unity animator 动画总时长 unity animator动画切换_ci_10


脚本中,设置参数的变化。

//角色移动
        if(horizontalmove!=0)
        {
            rb.velocity = new Vector2(speed * horizontalmove * Time.deltaTime, rb.velocity.y);
            anim.SetBool("isRunning", true);
        }
        else
        {
            anim.SetBool("isRunning", false);
        }

3. 添加jump

jump这里和run、idle的不同之处在于,它分为跳起和下落。需要分别创建clip。

unity animator 动画总时长 unity animator动画切换_ci_11


jump:

unity animator 动画总时长 unity animator动画切换_unity_12

fall:

unity animator 动画总时长 unity animator动画切换_ide_13

关系:

unity animator 动画总时长 unity animator动画切换_ci_14

设置参数调整切换状态:

unity animator 动画总时长 unity animator动画切换_unity_15


我们希望跳到最高点时,isJumping变为false,isFalling变为true。

//最高点切换为下落动画
        if(anim.GetBool("isJumping"))
        {
            if(rb.velocity.y < 0)
            {
                anim.SetBool("isJumping", false);
                anim.SetBool("isFalling", true);
            }
        }

4. 切换为idle(LayerMask)

到地上时,isFalling变为false,isIdle变为true。
在脚本中创建一个变量来获取地面tilemap。

如何判断到达地面呢?
y = 0?!不行。地图中地面的位置不一定。

public LayerMask ground;//获取地面信息

设置LayerMask

给tileMap添加一个Layer为Ground:

unity animator 动画总时长 unity animator动画切换_Time_16


将LayerMask设置为Ground,告诉系统哪一个才是地面。

unity animator 动画总时长 unity animator动画切换_ide_17


利用碰撞体判断是否碰到地面:

//碰到地面切换为idle
        else if(coll.IsTouchingLayers(ground))
        {
            anim.SetBool("isFalling", false);
            anim.SetBool("isIdle", true);
        }

脚本中完整代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    public float speed = 400;
    public float jumpforce = 400;
    public LayerMask ground;//获取地面信息

    private Rigidbody2D rb;
    private Animator anim;
    public Collider2D coll;

    // Start is called before the first frame update
    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
        anim = GetComponent<Animator>();
        //coll = GetComponent<Collider2D>();
    }

    // Update is called once per frame
    void FixedUpdate()
    {
        Movement();
        SwitchAnim();
    }

    void Movement()
    {
        float horizontalmove = Input.GetAxis("Horizontal");
        float direction = Input.GetAxisRaw("Horizontal");

        //角色移动
        if(horizontalmove!=0)
        {
            rb.velocity = new Vector2(speed * horizontalmove * Time.deltaTime, rb.velocity.y);
            anim.SetBool("isRunning", true);
        }
        else
        {
            anim.SetBool("isRunning", false);
        }
        //角色朝向
        if(direction!=0)
        {
            transform.localScale = new Vector3(direction, 1, 1);
        }
        //角色跳跃
        if(Input.GetButtonDown("Jump"))
        {
            rb.velocity = new Vector2(rb.velocity.x, jumpforce * Time.deltaTime);
            anim.SetBool("isJumping", true);
            anim.SetBool("isIdle", false);
        }
    }

    void SwitchAnim()
    {
        //最高点切换为下落动画
        if(anim.GetBool("isJumping"))
        {
            if(rb.velocity.y < 0)
            {
                anim.SetBool("isJumping", false);
                anim.SetBool("isFalling", true);
            }
        }
        //碰到地面切换为idle
        else if(coll.IsTouchingLayers(ground))
        {
            anim.SetBool("isFalling", false);
            anim.SetBool("isIdle", true);
        }
    }
}

unity animator 动画总时长 unity animator动画切换_ide_18