当前位置:   article > 正文

Unity animiator 学习记录【2D角色移动】_unity2d角色方向控制

unity2d角色方向控制

假设已存在一个玩家对象,想让其能完成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函数,改变刚刚在控制器添加的两个参数。从而实现,改变输入,改变动画。

  1. ani.SetFloat("Horizontal", horizontal);
  2. ani.SetFloat("Vertical", vertical);
  1. public class playerMove : MonoBehaviour
  2. {
  3. //动画,刚体组件
  4. private Animator ani;
  5. private Rigidbody2D rigid;
  6. void Start()
  7. {
  8. //获取组件
  9. ani = GetComponent<Animator>();
  10. rigid = GetComponent<Rigidbody2D>();
  11. }
  12. // Update is called once per frame
  13. void Update()
  14. {
  15. //一直获取方向参数
  16. float horizontal = Input.GetAxisRaw("Horizontal");
  17. float vertical = Input.GetAxisRaw("Vertical");
  18. if (horizontal != 0)
  19. {
  20. //只有4方向,所以只设置一个方向上的量,另一个置零
  21. ani.SetFloat("Vertical", 0);
  22. ani.SetFloat("Horizontal", horizontal);
  23. }
  24. if (vertical != 0)
  25. {
  26. ani.SetFloat("Horizontal", 0);
  27. ani.SetFloat("Vertical", vertical);
  28. }
  29. }
  30. }

切换走路

创建融合树,添加过渡

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

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

 

切换行走/站立代码

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

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

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

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

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

 然后就欧克了

 全代码

  1. public class playerMove : MonoBehaviour
  2. {
  3. [Range(0, 30)]
  4. public float speed = 5f;
  5. //动画,刚体组件
  6. private Animator ani;
  7. private Rigidbody2D rigid;
  8. void Start()
  9. {
  10. //获取组件
  11. ani = GetComponent<Animator>();
  12. rigid = GetComponent<Rigidbody2D>();
  13. }
  14. // Update is called once per frame
  15. void Update()
  16. {
  17. //一直获取方向参数
  18. float horizontal = Input.GetAxisRaw("Horizontal");
  19. float vertical = Input.GetAxisRaw("Vertical");
  20. if (horizontal != 0)
  21. {
  22. //改动画的关键代码
  23. ani.SetFloat("Horizontal", horizontal);
  24. ani.SetFloat("Vertical", 0);
  25. }
  26. if (vertical != 0)
  27. {
  28. ani.SetFloat("Horizontal", 0);
  29. ani.SetFloat("Vertical", vertical);
  30. }
  31. //切换跑步
  32. Vector2 dir = new Vector2(horizontal, vertical);
  33. //改变参数来改动画
  34. ani.SetFloat("Speed", dir.magnitude);
  35. //改变刚体速度
  36. rigid.velocity = dir * speed;
  37. }
  38. }

问题/总结

  1. 向量不太熟悉,为什么用刚体的速度成员能改变对象的位置?
  2. 因为这次的素材没有向右的图,我用缩放取负值改变了左图,但实际上还是会有些小bug:出现缩放动画帧,暂时懒得深究...QAQ
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号