private static void ExportController(AnimatorOverrideController overrideController) { string overrideControllerPath = AssetDatabase.GetAssetPath(overrideController); string controllerPath = AssetDatabase.GetAssetPath(overrideController.runtimeAnimatorController); string copyControllerPath = overrideControllerPath.Replace(".overrideController", ".controller"); if (AssetDatabase.CopyAsset(controllerPath, copyControllerPath)) { RuntimeAnimatorController controller = AssetDatabase.LoadAssetAtPath <RuntimeAnimatorController>(copyControllerPath); AnimatorController animator = controller as AnimatorController; AnimatorControllerLayer baseLayer = animator.layers[0]; var overrides = overrideController.GetOverridesUnite(); foreach (var clipPair in overrides) { AnimationClip overrideClip = new AnimationClip(); EditorUtility.CopySerialized(clipPair.Value, overrideClip); overrideClip.hideFlags = HideFlags.None; AssetDatabase.AddObjectToAsset(overrideClip, controller); for (int i = 0; i < baseLayer.stateMachine.states.Length; i++) { AnimatorState state = baseLayer.stateMachine.states[i].state; if (state.motion == clipPair.Key) { state.motion = overrideClip; } } } } AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); }
public static void SetupController(AnimatorOverrideController overrideController, RuntimeAnimatorController controller = null) { if (controller != null) { overrideController.runtimeAnimatorController = controller; } var overrides = overrideController.GetOverridesUnite(); foreach (var clipPair in overrides) { string overrideClipName = clipPair.Key.name.Replace("Original", ""); List <AnimationClip> clips = AnimatorOverrideControllerInspector.GetIncludeAnimations(overrideController); foreach (AnimationClip clip in clips) { if (clip.name == overrideClipName) { overrideController[clipPair.Key] = clip; break; } } if (overrideController[clipPair.Key] == clipPair.Key) { AnimationClip overrideClip = new AnimationClip(); EditorUtility.CopySerialized(clipPair.Key, overrideClip); overrideClip.name = overrideClipName; #if UNITY_5_5 || UNITY_5_4 || UNITY_5_3 || UNITY_5_2 || UNITY_5_1 || UNITY_5_0 || UNITY_4 overrideClip.hideFlags = HideFlags.HideInHierarchy; #endif AssetDatabase.AddObjectToAsset(overrideClip, overrideController); overrideController[clipPair.Key] = overrideClip; } } AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); }
public static void ExportController(this AnimatorOverrideController overrideController) { string overrideControllerPath = AssetDatabase.GetAssetPath(overrideController); string controllerPath = AssetDatabase.GetAssetPath(overrideController.runtimeAnimatorController); string copyControllerPath = overrideControllerPath.Replace(".overrideController", ".controller"); if (AssetDatabase.LoadAssetAtPath <RuntimeAnimatorController>(copyControllerPath) != null) { Debug.Log("File " + copyControllerPath + " already exists."); return; } if (AssetDatabase.CopyAsset(controllerPath, copyControllerPath)) { RuntimeAnimatorController controller = AssetDatabase.LoadAssetAtPath <RuntimeAnimatorController>(copyControllerPath); AnimatorController animator = controller as AnimatorController; List <AnimatorState> states = animator.LoadAllAsset <AnimatorState>(); var overrides = overrideController.GetOverridesUnite(); foreach (var clipPair in overrides) { if (clipPair.Value == null) { continue; } AnimationClip overrideClip = new AnimationClip(); EditorUtility.CopySerialized(clipPair.Value, overrideClip); overrideClip.hideFlags = HideFlags.None; AssetDatabase.AddObjectToAsset(overrideClip, controller); foreach (AnimatorState state in states) { if (state.motion == null) { continue; } bool isSame = false; if (AssetDatabase.GetAssetPath(state.motion) == AssetDatabase.GetAssetPath(state)) { isSame = state.motion.GetFileId() == clipPair.Key.GetFileId(); } else { isSame = state.motion == clipPair.Key; } if (isSame) { state.motion = overrideClip; } } } List <AnimationClip> clips = animator.LoadAllAsset <AnimationClip>(); states = animator.LoadAllAsset <AnimatorState>(); foreach (AnimationClip clip in clips) { bool isFound = false; foreach (AnimatorState state in states) { if (state.motion == clip) { isFound = true; break; } } if (!isFound) { Object.DestroyImmediate(clip, true); } } } AssetImporter assetImporter = AssetImporter.GetAtPath(copyControllerPath); assetImporter.SaveAndReimport(); }
public override void OnInspectorGUI() { base.OnInspectorGUI(); AnimatorOverrideController overrideController = this.target as AnimatorOverrideController; if (this.quickSetupFlagsFoldOut = EditorGUILayout.Foldout(this.quickSetupFlagsFoldOut, "Quick Setup")) { EditorGUI.indentLevel++; Dictionary <string, List <RuntimeAnimatorController> > qscs = new Dictionary <string, List <RuntimeAnimatorController> >(); foreach (var controller in OverrideControllerToolsSettings.instance.quickSetupControllers) { if (controller == null) { continue; } string folder = System.IO.Path.GetDirectoryName(AssetDatabase.GetAssetPath(controller)).Replace("\\", "/"); if (!qscs.ContainsKey(folder)) { qscs[folder] = new List <RuntimeAnimatorController>(); } qscs[folder].Add(controller); } foreach (var kvp in qscs) { string folder = kvp.Key; if (!this.quickSetupFolderFoldOuts.ContainsKey(folder)) { this.quickSetupFolderFoldOuts[folder] = true; } if (this.quickSetupFolderFoldOuts[folder] = EditorGUILayout.Foldout(this.quickSetupFolderFoldOuts[folder], folder)) { EditorGUI.indentLevel++; foreach (var controller in kvp.Value) { string controllerName = controller.name; foreach (var replace in OverrideControllerToolsSettings.instance.quickSetupControllerNameReplaces) { controllerName = controllerName.Replace(replace.oldValue, replace.newValue); } this.DrawButton( true, controllerName, () => { overrideController.runtimeAnimatorController = controller; overrideController.CreateOverrideAnimations(overrideController.GetOverridesUnite().FindAll(cp => cp.Value == null).Select(cp => cp.Key).ToArray()); } ); } EditorGUI.indentLevel--; } } EditorGUI.indentLevel--; } if (this.mainFoldOut = EditorGUILayout.Foldout(this.mainFoldOut, "Override Controller Tools")) { EditorGUI.indentLevel++; var unSetupClips = overrideController.GetOverridesUnite().FindAll(cp => cp.Value == null).Select(cp => cp.Key).ToArray(); string[] unSetupClipsName = unSetupClips.Select(c => c.name).ToArray(); this.DrawButton( unSetupClipsName.Length > 0, "Cteate Override Animations" + (unSetupClipsName.Length > 0 ? " (" + string.Join(", ", unSetupClipsName) + ")" : ""), () => { overrideController.CreateOverrideAnimations(unSetupClips); } ); List <AnimationClip> unusedClips = overrideController.GetUnusedAnimations(); this.DrawButton( unusedClips.Count > 0, "Delete Unused Animations" + (unusedClips.Count > 0 ? " (" + string.Join(", ", unusedClips.Select(c => c.name).ToArray()) + ")" : ""), () => { foreach (AnimationClip clip in unusedClips) { Object.DestroyImmediate(clip, true); } AssetImporter assetImporter = AssetImporter.GetAtPath(AssetDatabase.GetAssetPath(overrideController)); assetImporter.SaveAndReimport(); } ); this.DrawButton( overrideController.runtimeAnimatorController != null, "Export to Animator", () => { overrideController.ExportController(); } ); if (this.hideFlagsFoldOut = EditorGUILayout.Foldout(this.hideFlagsFoldOut, "Set Include Animations Hide Flags")) { EditorGUI.indentLevel++; this.DrawButton( true, HideFlags.None.ToString(), () => { overrideController.SetAnimationsHideFlags(HideFlags.None); } ); this.DrawButton( true, HideFlags.HideInHierarchy.ToString(), () => { overrideController.SetAnimationsHideFlags(HideFlags.HideInHierarchy); } ); EditorGUI.indentLevel--; } if (this.moreFoldOut = EditorGUILayout.Foldout(this.moreFoldOut, "More...")) { EditorGUI.indentLevel++; string url = "http://u3d.as/U4e"; this.DrawButton( true, "Asset Inspector - " + url, () => { System.Diagnostics.Process.Start(url); } ); EditorGUI.indentLevel--; } EditorGUI.indentLevel--; } }