假设已存在一个玩家对象,想让其能完成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;
}
}
问题/总结
- 向量不太熟悉,为什么用刚体的速度成员能改变对象的位置?
- 因为这次的素材没有向右的图,我用缩放取负值改变了左图,但实际上还是会有些小bug:出现缩放动画帧,暂时懒得深究...QAQ