コード例 #1
0
        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);
            }
        }
コード例 #2
0
        public override void OnInspectorGUI()
        {
            base.DrawDefaultInspector();

            _wrapperCache.Clear();
            var missingCount = 0;

            foreach (var selected in Selection.objects)
            {
                var wrapper = selected as AnimatorWrapper;
                if (wrapper != null)
                {
                    _wrapperCache.Add(wrapper);
                    if (wrapper.AnimatorController == null)
                    {
                        missingCount++;
                    }
                }
            }

            if (missingCount > 0)
            {
                EditorGUILayout.HelpBox(
                    _wrapperCache.Count == 1
            ? $"Assign a {nameof(RuntimeAnimatorController)}"
            : $"Missing {missingCount} {nameof(RuntimeAnimatorController)}(s)",
                    MessageType.Warning
                    );
            }

            EditorGUI.BeginDisabledGroup(missingCount == _wrapperCache.Count);

            if (GUILayout.Button("Generate"))
            {
                AnimatorWrapper.GenerateAndRefresh(_wrapperCache);
            }

            EditorGUI.EndDisabledGroup();
        }
コード例 #3
0
ファイル: Menu.cs プロジェクト: rhys-vdw/unity-destringer
        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);
                    }
                }
            }
        }