Unity学习笔记:动画与动画状态机(一)

创建动画

 以2D动画的创建为例子:有两种方法创建动画;

 1.直接选中多张动画拖拽到场景中,unity默认会创建一个动画,并创建出一个动画控制机;

 2.手动创建动画,首先拖拽一张精灵图片到场景中然后选中,再点击window-animation,弹出animation窗口,点击creat,随后可以手动拖拽添加帧,Samples可以控制动画播放的速度,手动创建动画控制机,赋值给角色;

Unity学习笔记:动画与动画状态机(一)_第1张图片


动画控制机(状态机)

Unity学习笔记:动画与动画状态机(一)_第2张图片

可以拖拽以创建好的动画到状态机中,右键动画MakeTransition可以创建动画转换线

Unity学习笔记:动画与动画状态机(一)_第3张图片

可以创建Bool,Int,Float,Trigger四种状态转换条件,并且可以为动画转换线添加转换条件;Has Exit Time最好不要勾选,此为前一动画转换退出时间,即当处于前一动画播放时要转到下一动画时,要播放完前一动画才能转到下一动画;

Unity学习笔记:动画与动画状态机(一)_第4张图片

代码控制动画切换:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerControll : MonoBehaviour
{
    public Rigidbody2D rig;
    public Animator anim;
    public float moveSpeed = 5.0f;
    public float jumpSpeed = 5.0f;
    public bool isrun = false;
    public bool isGround = false;
    public bool isjump = false;
    private KeyCode left = KeyCode.A;
    private KeyCode right = KeyCode.D;
    private KeyCode up = KeyCode.W;
    // Use this for initialization
    void Start()
    {
        rig = GetComponent();
        anim = GetComponent();
    }
    
    // Update is called once per frame
    void Update()
    {
        //float h = Input.GetAxis("Horizontal");
        //float v = Input.GetAxis("Vertical");
        //rig.AddForce(new Vector2(5, 0) * moveSpeed);
        Act();
        Change();
    }
    private void Act()
    {
        if (Input.GetKey(left))
        {
            rig.AddForce(new Vector2(-6, 0) * moveSpeed);
            transform.localScale = new Vector3(-1, 1, 1);
            isrun = true;
        }
        if (Input.GetKeyUp(left))
        {
            isrun = false;
        }
        if (Input.GetKey(right))
        {
            rig.AddForce(new Vector2(6, 0) * moveSpeed);
            transform.localScale = new Vector3(1, 1, 1);
            isrun = true;
        }
        if (Input.GetKeyUp(right))
        {
            isrun = false;
        }
        //跳跃
        if (isGround == false)
        {
            rig.gravityScale = 30;
        }
        else
        {
            rig.gravityScale = 5;
        }
        if (Input.GetKeyDown(up)&&isGround==true)
        {
            isjump = true;
            rig.AddForce(new Vector2(0, 700) * moveSpeed);
        }
        if (Input.GetKeyUp(up))
        {
            isjump = false;
        }

    }
    private void Change()
    {
        if (isrun == true)
        {
            anim.SetBool("isRun", isrun);
        }
        else
        {
            anim.SetBool("isRun", isrun);
        }
        if (isjump == true)
        {
            anim.SetBool("isJump", isjump);
        }
        if (isjump == false)
        {
            anim.SetBool("isJump", isjump);
        }
        if (isGround == true)
        {
            anim.SetBool("isGround", isGround);
        }
        if (isGround == false)
        {
            anim.SetBool("isGround", isGround);
        }
    }
    private void OnCollisionEnter2D(Collision2D collision)
    {
        if(collision.transform.tag=="Wall")
            this.isGround = true;
        if (collision.transform.tag == "Award")
            Destroy(collision.gameObject);
        if (collision.transform.tag == "Emeny")
            playerDie();
    }
    private void OnCollisionExit2D(Collision2D collision)
    {
        if (collision.transform.tag == "Wall")
            this.isGround = false;
    }
    //玩家碰到敌人就死亡
    private void playerDie()
    {

    }
}
  public Animator anim;
  anim = GetComponent();//start中获得Animator组件
if (Input.GetKey(right))
        {
            rig.AddForce(new Vector2(6, 0) * moveSpeed);
            transform.localScale = new Vector3(1, 1, 1);
            isrun = true;//根据各种条件对切换条件进行判断
        }

 anim.SetBool("isRun", isrun);//用SetBool函数传递参数,用来控制动画切换

此方式难在对动画控制条件的控制上,如果动画过多,动画切换逻辑复杂,这种方式经常会遗忘某些条件,造成动画切换的问题;

还在深入学习

你可能感兴趣的:(Unity学习笔记:动画与动画状态机(一))