Exemplo n.º 1
0
        static CompressedShareData getShareData(string dataDir)
        {
            string sharedDataPath         = dataDir + "/" + "shared_data.asset";
            CompressedShareData shareData = AssetDatabase.LoadAssetAtPath <CompressedShareData>(sharedDataPath);

            if (!shareData)
            {
                shareData = ScriptableObject.CreateInstance <CompressedShareData>();
                AssetDatabase.CreateAsset(shareData, sharedDataPath);
                shareData = AssetDatabase.LoadAssetAtPath <CompressedShareData>(sharedDataPath);
            }
            return(shareData);
        }
Exemplo n.º 2
0
        public string Process()
        {
            this.rawClip = animatorState.motion as AnimationClip;
            if (!rawClip)
            {
                return(null);
            }
            this.stateFlag = findStateFlag(animatorState);
            //查找标记,检查是否可以跳过
            if (stateFlag && stateFlag.skipCompressed)
            {
                return(null);
            }
            var size = UnityEngine.Profiler.GetRuntimeMemorySize(rawClip);

            //小于16K 不压缩
            if (size < 1024 * 16)
            {
                return(null);
            }

            string rawClipPath = AssetDatabase.GetAssetPath(rawClip);

            if (string.IsNullOrEmpty(rawClipPath))
            {
                return(null);
            }

            string anim_gen_dir = Path.GetDirectoryName(rawClipPath) + "/_anim_gen_";
            string dataDir      = anim_gen_dir + "/datas";
            string stubDir      = anim_gen_dir + "/stubs";

            Directory.CreateDirectory(anim_gen_dir);
            Directory.CreateDirectory(dataDir);
            Directory.CreateDirectory(stubDir);

            this.shareData = getShareData(anim_gen_dir);
            this.stubClip  = new AnimationClip();
            AnimationClipSettings settings = AnimationUtility.GetAnimationClipSettings(rawClip);

            stubClip.SetCurve("", typeof(CompressedAnimationDirver), "stubAnimParam", AnimationCurve.Linear(0, 0, rawClip.length, 1));
            stubClip.name = rawClip.name + "_stub";
            this.clipData = CompressClipData();
            AnimationUtility.SetAnimationClipSettings(stubClip, settings);

            //*注意:这里是为了兼容通过AnimationClipSettings设置Loop而Wrap没设置
            if (settings.loopTime)
            {
                clipData.wrapMode = (byte)WrapMode.Loop;
                stubClip.wrapMode = WrapMode.Loop;
            }
            else
            {
                stubClip.wrapMode = rawClip.wrapMode;
            }
            animatorState.motion = stubClip;
            AssetDatabase.CreateAsset(stubClip, stubDir + "/" + stubClip.name + ".anim");
            string dataPath = dataDir + "/" + clipData.name + ".asset";

            AssetDatabase.CreateAsset(clipData, dataPath);
            var stateProxy = animatorState.AddStateMachineBehaviour <CompressionAnimatorStateProxy>();

            stateProxy.data = clipData;
            return(dataPath);
        }