IEnumerator DoConvertAnimatorMeta(AnimatorMeta oldMeta, AnimateMeta newMeta, string assetPath) { foreach (var oldTake in oldMeta.takes) { var newTake = new Take(); AddMessage(" - convert take: " + oldTake.name); yield return(EditorCoroutines.StartCoroutine(DoConvertTake(oldTake, newTake, true, assetPath), this)); newMeta.takes.Add(newTake); } }
/// <summary> /// if copyTakes is true, overrides all takes in newMeta (if null, then to our dataholder) with current data /// </summary> public void MetaSet(AnimatorMeta newMeta, bool copyTakes) { if(mMetaHolder.meta != newMeta) { AnimatorMeta prevMeta = mMetaHolder.meta; List<AMTakeData> prevTakes = new List<AMTakeData>(takes); //preserve the list of takes from previous string prevPlayOnStartName = mData.defaultTakeName; mMetaHolder.meta = newMeta; //this will clear out internal takes list if(mMetaHolder.meta) { if(copyTakes) { //duplicate takes to the new meta mMetaHolder.meta.takes.Clear(); foreach(AMTakeData take in prevTakes) DuplicateTake(take, true, true); } //clear out non-meta stuff if(mMetaHolder.dataHolder) { UnityEditor.Undo.DestroyObjectImmediate(mMetaHolder.dataHolder); mMetaHolder.dataHolder = null; } } else { //create data holder #if MATE_DEBUG_ANIMATOR mMetaHolder.dataHolder = new GameObject("_animdata", typeof(AnimatorDataHolder)); #else mMetaHolder.dataHolder = new GameObject("_animdata"); #endif mMetaHolder.dataHolder.transform.parent = mData.transform; UnityEditor.Undo.RegisterCreatedObjectUndo(mMetaHolder.dataHolder, "Set Meta"); if(copyTakes) { //duplicate meta to takeData foreach(AMTakeData take in prevTakes) DuplicateTake(take, true, false); } } if(takes == null || takes.Count == 0) { //add at least one take AddNewTake(); } //get new play on start if(!string.IsNullOrEmpty(prevPlayOnStartName)) { string newPlayOnStart = ""; foreach(AMTakeData take in takes) { if(take.name == prevPlayOnStartName) { newPlayOnStart = take.name; break; } } mData.defaultTakeName = newPlayOnStart; } else mData.defaultTakeName = ""; // //destroy previous meta if it is not prefab if(prevMeta && UnityEditor.PrefabUtility.GetPrefabType(prevMeta) != UnityEditor.PrefabType.Prefab) { UnityEditor.Undo.DestroyObjectImmediate(prevMeta.gameObject); } } }