要在运行中修改动画播放速度的话不能用UnityEditor,只能修改animator的速度,不能修改animator里某个状态的速度,运行中修改animator的速度不会保存,但是运行中修改animator里某个状态的速度则会保存下来,这大概是为了方便在界面上的运行中修改某个状态的速度所作的妥协吧,如果用了UnityEditor的脚本不在Editor文件夹下,则打包的时候会报错,就算不报错,打出来也没有效果,所以修改animator中某个状态的速度的话,可以判断当前播放的动画是不是指定的状态,如果是则修改animator的速度,如果不是则改回原本的速度,我自己是这样实现的
单独写一个脚本,这个脚本只管修改动画状态的参数
using UnityEngine;
public class AniStateInfoMgr : MonoBehaviour
{
Animator anim;
AnimatorStateInfo animatorInfo;
string stateName;
float aniStateSpeed;
int layer;
float lastSpeed;
bool isStart;
public void SetAniSpeed(Animator anim, string stateName, int layer, float aniStateSpeed)
{
this.anim = anim;
this.stateName = stateName;
this.layer = layer;
this.aniStateSpeed = aniStateSpeed;
lastSpeed = anim.speed;
isStart = true;
}
void Update()
{
if (isStart)
{
animatorInfo = anim.GetCurrentAnimatorStateInfo(layer);
if (animatorInfo.IsName(stateName))//注意这里指的不是动画的名字而是动画状态的名字
{
anim.speed = aniStateSpeed;
}
else
{
anim.speed = lastSpeed;
}
}
}
private void OnDestroy()
{
anim.speed = lastSpeed;
}
}
然后再需要的时候可以创建一个空物体,挂上这个脚本
/// <summary>
/// 在运行时更改Speed
/// </summary>
public static GameObject SetAnimatorSpeed(Animator anim, int _layer, string _stateName, float _speed)
{
GameObject go = new GameObject("AniStateInfoMgr");
go.AddComponent<AniStateInfoMgr>().SetAniSpeed(anim, _stateName, _layer, _speed);
return go;
}
这样在运行中的时候就可以修改动画的播放速度了,如果不需要修改了则删除这个物体就行了
|