示例#1
0
        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();
        }
示例#2
0
        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();
        }
示例#4
0
        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--;
            }
        }