栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > Unity3D

在运行中修改unity的animator中某个状态的速度

Unity3D 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在运行中修改unity的animator中某个状态的速度

要在运行中修改动画播放速度的话不能用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;
    }
}

然后再需要的时候可以创建一个空物体,挂上这个脚本

    /// 
    /// 在运行时更改Speed
    /// 
    public static GameObject SetAnimatorSpeed(Animator anim, int _layer, string _stateName, float _speed)
    {
        GameObject go = new GameObject("AniStateInfoMgr");
        go.AddComponent().SetAniSpeed(anim, _stateName, _layer, _speed);
        return go;
    }

这样在运行中的时候就可以修改动画的播放速度了,如果不需要修改了则删除这个物体就行了

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/898199.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号