static void OnWillSaveAssets(string[] paths) { HashSet <AnimatorWrapper> dirty = new HashSet <AnimatorWrapper>(); // Search for wrappers to update. List <AnimatorWrapper> wrappers = null; foreach (string path in paths) { var controller = (RuntimeAnimatorController)AssetDatabase.LoadAssetAtPath(path, typeof(RuntimeAnimatorController)); // Has a controller been reimporter? if (controller != null) { // Lazily initialize. if (wrappers == null) { wrappers = AnimatorWrapper.LoadAll(); } // Record all the wrappers that need to be reimported. foreach (var wrapper in wrappers) { if (wrapper.AnimatorController == controller) { dirty.Add(wrapper); } } continue; } var dirtyWrapper = (AnimatorWrapper)AssetDatabase.LoadAssetAtPath(path, typeof(AnimatorWrapper)); if (dirtyWrapper != null) { // Record all the wrappers that need to be reimported. dirty.Add(dirtyWrapper); continue; } } if (dirty.Count > 0) { AnimatorWrapper.GenerateAndRefresh(dirty); } }
static void GenerateFromSelection() { var gameObjects = Selection.gameObjects; var animatorsByController = new Dictionary <RuntimeAnimatorController, List <Animator> >(gameObjects.Length); // Find controllers in selected game objects (scene objects and prefabs). for (int i = 0; i < gameObjects.Length; i++) { var gameObject = gameObjects[i]; var animator = gameObject.GetComponent <Animator>(); if (animator == null) { Debug.LogWarning($"No animator found on {gameObject}", gameObject); } else if (animator.runtimeAnimatorController == null) { Debug.LogWarning($"Animator on {gameObject} has no {nameof(UnityEngine.RuntimeAnimatorController)}", animator); } else { var controller = animator.runtimeAnimatorController; if (animatorsByController.TryGetValue(controller, out var animators)) { animators.Add(animator); } else { animatorsByController[controller] = new List <Animator> { animator }; } } } // Find any selected controller assets from the project. var assetGuids = Selection.assetGUIDs; for (int i = 0; i < assetGuids.Length; i++) { var path = AssetDatabase.GUIDToAssetPath(assetGuids[i]); var controller = AssetDatabase.LoadAssetAtPath <RuntimeAnimatorController>(path) as RuntimeAnimatorController; if (controller != null) { if (!animatorsByController.TryGetValue(controller, out var animators)) { animatorsByController[controller] = new List <Animator>(); } } } if (animatorsByController.Count == 0) { Debug.LogError($"Select {nameof(RuntimeAnimatorController)} assets or {nameof(GameObject)}s with animators before running this command."); return; } // Find or create wrappers as required. var allWrappers = AnimatorWrapper.LoadAll(); var toGenerate = new List <AnimatorWrapper>(); foreach (var kvp in animatorsByController) { var controller = kvp.Key; var animators = kvp.Value; var wrapper = allWrappers.Find(a => a.AnimatorController == controller); if (wrapper == null) { wrapper = AnimatorWrapper.Create(controller); wrapper.name = $"{controller.name}{nameof(AnimatorWrapper)}"; var path = AnimatorWrapper.DefaultWrapperPath; var assetDirPath = $"Assets/{AnimatorWrapper.DefaultWrapperPath}"; var absoluteDirPath = $"{Application.dataPath}/{path}"; Directory.CreateDirectory(absoluteDirPath); var wrapperAssetPath = $"{assetDirPath}/{wrapper.name}.asset"; AssetDatabase.CreateAsset(wrapper, wrapperAssetPath); Debug.Log($"Created {wrapperAssetPath}", wrapper); } toGenerate.Add(wrapper); } // Regenerate all assets. AnimatorWrapper.GenerateAndRefresh(toGenerate); // Attach the updated controllers to any animators that were selected. for (var i = 0; i < toGenerate.Count; i++) { var generated = toGenerate[i]; var scriptName = generated.GeneratedScriptAsset.name; var animators = animatorsByController[generated.AnimatorController]; for (var j = 0; j < animators.Count; j++) { var prevComponent = animators[j].gameObject.GetComponent(scriptName); if (prevComponent == null) { AddScriptComponent(animators[j].gameObject, generated.GeneratedScriptAsset); } } } }