Unity animiator 学习记录【2D角色移动】

假设已存在一个玩家对象,想让其能完成4方向的移动。

那么需要4方向的动画,及控制4方向动画转变的控制器,改变玩家位置的某种方法。

添加Animator  动画组件

这个组件需要一个控制器文件 

创建文件

完成各方向的移动动画,需要:1.各方向的动画;2.控制什么时候改变这些动画的控制器(脚本)

在这里创建一个Animation文件夹,一个controller文件夹。前者用来存放动画文件,后者存放控制动画的脚本。

动画控制器

 

然后,在controller文件夹下创建一个动画控制器

 这个动画控制器是用来控制角色按什么键,调用哪个动画的文件。

创建完,重命名放在player的animator组件的控制器属性

创建动画

人物的动画,一般就为4方向的站立及走路图,所以创建8个动画。

因为是要创建对应对象的动画,所以选中对象后,在动画窗口新建剪辑。

创建完 

 

给动画文件上帧,把对应的图拖进对应的动画文件

一开始设置的动画可能 太快,将样本调低能减速。

走路动画:一般只有3张,我一般让静止图设置为2张,看上去比较不违和

 因为我这里的素材只有向左图,没有右图

故用了缩放反转x轴

到此,完成了动画文件的制作。

动画控制器2

总体思路:

创建2个动画混合树,令2个树满足一定条件就相互转换。然后用脚本获取输入,并把输入反馈到条件上,从而实现站立/走路动画的转化。

对于让走路动画实行同时,还让物体移动,有很多方法。这里使用了2D刚体的velocity成员实现改变。

回到刚刚的动画控制器。

这里只学习从新混合树

创建,"Idle" 表示站立的动画,"walk"表示走的动画的两个混合树。

 并双击进去改混合类型

而他们之间的的过渡条件就由我们判断,是否在走还是站立来切换。

这里创建2个参数,horizontal,vertical 接受我们对方向控制的输入,从而判断是走还是静止。

 添加2个参数到这个2D方向融合树

然后列表添加4个motion

设置如图 ,令各方向动画,对应上对应的xy轴。这里参数horizontal,vectical 分别对应pos x,y

 

2D 刚体运动

写移动脚本,挂在玩家对象身上 

 

主要思路:用Input的方法获取方向输入, 让动画控制器animator,使用SetFloat函数,改变刚刚在控制器添加的两个参数。从而实现,改变输入,改变动画。

ani.SetFloat("Horizontal", horizontal);
ani.SetFloat("Vertical", vertical);
public class playerMove : MonoBehaviour
{
    //动画,刚体组件
    private Animator ani;
    private Rigidbody2D rigid;
    void Start()
    {
        //获取组件
        ani = GetComponent<Animator>();
        rigid = GetComponent<Rigidbody2D>();
    }

    // Update is called once per frame
    void Update()
    {
        //一直获取方向参数
        float horizontal = Input.GetAxisRaw("Horizontal");
        float vertical = Input.GetAxisRaw("Vertical");
        if (horizontal != 0)
        {
            //只有4方向,所以只设置一个方向上的量,另一个置零
            ani.SetFloat("Vertical", 0);
            ani.SetFloat("Horizontal", horizontal);
        }
        if (vertical != 0)
        {
            ani.SetFloat("Horizontal", 0);
            ani.SetFloat("Vertical", vertical);
        }
    }
}

切换走路

创建融合树,添加过渡

这里添加Speed参数来表示改变的条件,满足条件的时候就改变动画。

选中两条过渡线,conditon分别添加大于0/小于1,为相互改变的条件。

 

切换行走/站立代码

 用horizontal,vertical两个作为参数构造vector2向量,再利用其长度判断是否有移动。

//切换跑步
Vector2 dir = new Vector2(horizontal, vertical);
//改变参数来改动画
ani.SetFloat("Speed", dir.magnitude);

 改变刚体速度,改变物体移动

//改变刚体速度
rigid.velocity = dir * speed;

把过渡时间调0,可以让动画变化更流畅

 然后就欧克了

 全代码

public class playerMove : MonoBehaviour
{
    [Range(0, 30)]
    public float speed = 5f;

    //动画,刚体组件
    private Animator ani;
    private Rigidbody2D rigid;
    void Start()
    {
        //获取组件
        ani = GetComponent<Animator>();
        rigid = GetComponent<Rigidbody2D>();
    }

    // Update is called once per frame
    void Update()
    {
        //一直获取方向参数
        float horizontal = Input.GetAxisRaw("Horizontal");
        float vertical = Input.GetAxisRaw("Vertical");
        if (horizontal != 0)
        {
            //改动画的关键代码
            ani.SetFloat("Horizontal", horizontal);
            ani.SetFloat("Vertical", 0);
        }
        if (vertical != 0)
        {
            ani.SetFloat("Horizontal", 0);
            ani.SetFloat("Vertical", vertical);
        }


        //切换跑步
        Vector2 dir = new Vector2(horizontal, vertical);
        //改变参数来改动画
        ani.SetFloat("Speed", dir.magnitude);

        //改变刚体速度
        rigid.velocity = dir * speed;
    }

}

问题/总结

  1. 向量不太熟悉,为什么用刚体的速度成员能改变对象的位置?
  2. 因为这次的素材没有向右的图,我用缩放取负值改变了左图,但实际上还是会有些小bug:出现缩放动画帧,暂时懒得深究...QAQ
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值