问题如下,因为再激活Animator时,它会重置一次,参数也会丢失

这个问题一直存在,论坛给出的解释是把参数缓存下来,在激活时重置

http://answers.unity3d.com/questions/919995/parameters-and-states-of-animator-reset-on-objects.html

我把论坛的脚本修改了一下,在需要关闭GameObject时添加该脚本,再次打开GameObject时会自动删除,即可解决参数丢失问题

//Modify from: http://answers.unity3d.com/questions/919995/parameters-and-states-of-animator-reset-on-objects.html

using UnityEngine;
using System.Collections.Generic;

public class AnimParamRecover : MonoBehaviour
{
    class AnimCacheParam
    {
        public AnimatorControllerParameterType type;
        public string paramName;
        object mData;

        public AnimCacheParam(Animator anim, string paramName, AnimatorControllerParameterType type)
        {
            this.type = type;
            this.paramName = paramName;
            switch (type)
            {
                case AnimatorControllerParameterType.Int:
                    this.mData = (int)anim.GetInteger(paramName);
                    break;
                case AnimatorControllerParameterType.Float:
                    this.mData = (float)anim.GetFloat(paramName);
                    break;
                case AnimatorControllerParameterType.Bool:
                    this.mData = (bool)anim.GetBool(paramName);
                    break;
            }
        }

        public object getData()
        {
            return mData;
        }
    }

    Animator mAnimator;
    List<AnimCacheParam> mParamsCacheList;
    bool mIsDisable;

    void Awake()
    {
        Record();
    }

    /// <summary>
    /// Recovery.
    /// </summary>
    void OnEnable()
    {
        if (mIsDisable)
        {
            mIsDisable = false;
        }
        else
        {
            return;
        }

        Recovery();
        Destroy(this);
    }

    void OnDisable()
    {
        mIsDisable = true;
    }

    [ContextMenu("Manual Record")]
    public void Record()
    {
        mParamsCacheList = new List<AnimCacheParam>();
        mAnimator = GetComponent<Animator>();

        ; i < mAnimator.parameters.Length; i++)
        {
            var p = mAnimator.parameters[i];
            var animParam = new AnimCacheParam(mAnimator, p.name, p.type);
            mParamsCacheList.Add(animParam);
        }
    }

    [ContextMenu("Manual Recovery")]
    public void Recovery()
    {
        foreach (var param in mParamsCacheList)
        {
            switch (param.type)
            {
                case AnimatorControllerParameterType.Int:
                    mAnimator.SetInteger(param.paramName, (int)param.getData());
                    break;
                case AnimatorControllerParameterType.Float:
                    mAnimator.SetFloat(param.paramName, (float)param.getData());
                    break;
                case AnimatorControllerParameterType.Bool:
                    mAnimator.SetBool(param.paramName, (bool)param.getData());
                    break;
            }
        }

        mParamsCacheList.Clear();
    }
}

AnimParamRecover

Animator组件关闭再打开后参数丢失问题的更多相关文章

  1. Extjs4---Cannot read property 'addCls' of null 或者 el is null 关于tab关闭后再打开不显示或者报错

    做后台管理系统时遇到的问题,关于tab关闭后再打开不显示,或者报错 我在新的tabpanel中加入了一个grid,当我关闭再次打开就会报错Cannot read property 'addCls' o ...

  2. Android实现点击通知栏后,先启动应用再打开目标Activity ,极光推送等推送的也可以参考一下(转)

    我因为项目中集成了极光推送,推送的通知栏点开需要确定进入哪个界面就参考了这边文章,感谢作者的无私. 标签: 情况简述 在开发Android app的过程中,遇到这样一个需求:app中启动一个Servi ...

  3. java在线聊天项目1.0版 异常处理——开启多个客户端,关闭一个客户端后,在其他客户端中再发出信息会出现异常的处理

    异常一 只开启一个客户端,输入信息后关闭,客户端出现如下异常 根据异常说明 ChatClientFrame客户端117行 提示原因是Socket关闭 分析原因 客户端代码 while (connect ...

  4. 点击按钮使用window.open打开页面后,再次点击按钮会再打开一个页面,如何解决?

    点击按钮使用window.open打开页面后,再次点击按钮会再打开一个页面,如何解决? window.open("page1.html","win1"); 这句 ...

  5. 关于数据库一致改关闭下redo日志文件丢失的处理办法的总结

    数据库一致性关闭下redo日志文件丢失的处理办法(归档和非归档都行) 1. inactive log  在一致性关闭后删除重启时可以在mount下(不丢失数据) alter database clea ...

  6. 工控随笔_03_西门子_Step7项目打开后CPU显示问号解决方法

    我们在利用西门子的S7-300/400 PLC的编程软件Step7的时候会出现下面如图所示的问题. 在打开项目的时候,我们会在Simatic Manager里面看到CPU以及一些其他一些组件显示问号. ...

  7. vue 路由传参中刷新页面参数丢失 及传参的几种方式?

    在页面跳转中,我通过路由传参,结果发现页面参数丢失了.路径返回了根目录.... 1. 先说下路由传参的几种方式吧? 比如:<div v-for="item in items" ...

  8. Java socket中关闭IO流后,发生什么事?(以关闭输出流为例)

    声明:该博文以socket中,关闭输出流为例进行说明. 为了方便讲解,我们把DataOutputstream dout = new DataOutputStream(new BufferedOutpu ...

  9. vue 通过 name 和 params 进行调整页面传参刷新参数丢失问题&vue路由可选参数

    vue  通过 name 和 params 进行调整页面传参刷新参数丢失问题 router.js: export default new Router({ routes: [ { path: '/', ...

随机推荐

  1. 1.Spring Web MVC有什么

    Spring Web MVC使用了MVC架构模式的思想,将web层进行职责解耦. 同样也是基于请求驱动的,也就是使用请求-响应模型.它主要包含如下组件: DispatcherServlet :前端控制 ...

  2. Java 类型转换以及Object转成其他类型

    Object转int int count=(int)map.get("count") int count=Integer.parseInt((String)map.get(&quo ...

  3. 转:python webdriver API 之上传文件

    文件上传操作也比较常见功能之一,上传功能操作 webdriver 并没有提供对应的方法,关键上传文件的思路.上传过程一般要打开一个系统的 window 窗口,从窗口选择本地文件添加.所以,一般会卡在如 ...

  4. [Reprint]C++函数前和函数后加const修饰符区别

    c++中关于const的用法有很多,const既可以修饰变量,也可以函数,不同的环境下,是有不同的含义.今天来讲讲const加在函数前和函数后面的区别.比如: 01 #include<iostr ...

  5. [原创]java WEB学习笔记44:Filter 简介,模型,创建,工作原理,相关API,过滤器的部署及映射的方式,Demo

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  6. [转] linux中pam模块

    一.pam简介 Linux-PAM(linux可插入认证模块)是一套共享库,使本地系统管理员可以随意选择程序的认证方式. 换句话说,不用(重新编写)重新编译一个包含PAM功能的应用程序,就可以改变它使 ...

  7. AS-demo09

    ,mainifast: <uses-permission android:name="android.permission.SET_WALLPAPER"/> , < ...

  8. c#读取INI文件类

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.IO;na ...

  9. VS2012发布网站详细步骤

    1.打开你的VS2012网站项目,右键点击项目>菜单中 重新生成一下网站项目:再次点击右键>发布: 2.弹出网站发布设置面板,点击<新建..>,创建新的发布配置文件: 输入你自 ...

  10. CDC

    CDC中最重要的问题是metastability问题. 加入Synchronizer来进行异步时钟的同步,两级的Sync,第二级仍然会出现亚稳态的概率由MTBF决定. MTBF:mean time b ...