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); }
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); }