public static AnimationClip AddClipToAnimatorComponent(GameObject animatedObject, AnimationClip newClip)
        {
            Animator animator = animatedObject.GetComponent <Animator>();

            if (animator == null)
            {
                animator = animatedObject.AddComponent <Animator>();
            }
            AnimatorController animatorController = AnimatorController.GetEffectiveAnimatorController(animator);

            if (animatorController == null)
            {
                string path = Path.GetDirectoryName(AssetDatabase.GetAssetPath(newClip)) + "/" + animatedObject.name + ".controller";

                AnimatorController controllerForClip = AnimatorController.CreateAnimatorControllerAtPathWithClip(path, newClip);
                AnimatorController.SetAnimatorController(animator, controllerForClip);
                if (controllerForClip != null)
                {
                    return(newClip);
                }
                else
                {
                    return(null);
                }
            }
            else
            {
                AnimatorController.AddAnimationClipToController(animatorController, newClip);
                return(newClip);
            }
        }
        static AnimationClip GenerateTriggerableTransition(string name, AnimatorController controller)
        {
            var clip = AnimatorController.AllocateAnimatorClip(name);

            AssetDatabase.AddObjectToAsset(clip, controller);

#if UNITY_5 || UNITY_5_3_OR_NEWER
            var state = controller.AddMotion(clip);

            controller.AddParameter(name, UnityEngine.AnimatorControllerParameterType.Trigger);

            var stateMachine = controller.layers[0].stateMachine;
            var transition   = stateMachine.AddAnyStateTransition(state);
            transition.AddCondition(UnityEditor.Animations.AnimatorConditionMode.If, 0, name);
#else
            var state = AnimatorController.AddAnimationClipToController(controller, clip);

            controller.AddParameter(name, AnimatorControllerParameterType.Trigger);

            var stateMachine = controller.GetLayer(0).stateMachine;
            var transition   = stateMachine.AddAnyStateTransition(state);
            var condition    = transition.GetCondition(0);
            condition.mode      = TransitionConditionMode.If;
            condition.parameter = name;
#endif

            return(clip);
        }
Beispiel #3
0
        private static AnimationClip GenerateTriggerableTransition(string name, AnimatorController controller)
        {
            // Create the clip
            var clip = AnimatorController.AllocateAnimatorClip(name);

            AssetDatabase.AddObjectToAsset(clip, controller);

            // Create a state in the animatior controller for this clip
            var state = AnimatorController.AddAnimationClipToController(controller, clip);

            // Add a transition property
            controller.AddParameter(name, AnimatorControllerParameterType.Trigger);

            // Add an any state transition
            var stateMachine = controller.GetLayer(0).stateMachine;
            var transition   = stateMachine.AddAnyStateTransition(state);
            var condition    = transition.GetCondition(0);

            condition.mode      = TransitionConditionMode.If;
            condition.parameter = name;
            return(clip);
        }
    public static AnimationClip AddClipToAnimatorComponent(GameObject go, Animator animator, AnimationClip newClip)
    {
        AnimatorController animatorController = AnimatorController.GetEffectiveAnimatorController(animator);

        if (animatorController == null)
        {
            AnimatorController controllerForClip = AnimatorController.CreateAnimatorControllerForClip(newClip, go);
            AnimatorController.SetAnimatorController(animator, controllerForClip);
            if (controllerForClip != null)
            {
                return(newClip);
            }
            else
            {
                return(null);
            }
        }
        else
        {
            AnimatorController.AddAnimationClipToController(animatorController, newClip);
            return(newClip);
        }
    }
Beispiel #5
0
        static void ImportScml(string assetPath)
        {
            string folderPath = Path.GetDirectoryName(assetPath);

            //Load the SCML as XML
            var doc = new XmlDocument();

            doc.Load(assetPath);

            //Parse the SCML file
            var scml = new Spriter.ScmlObject(doc);

            //TODO: Verify that all files/folders exist
            var pb = new PrefabBuilder();

            foreach (var entity in scml.Entities)
            {
                //TODO: Settings file to customize prefab location
                var prefabPath = Path.Combine(folderPath, entity.Name + ".prefab");

                //Change to forward slash for asset database friendliness
                prefabPath = prefabPath.Replace('\\', '/');

                //Either instantiate the existing prefab or create a new one
                GameObject go;
                var        prefabGo = AssetDatabase.LoadAssetAtPath(prefabPath, typeof(GameObject));
                if (prefabGo == null)
                {
                    go       = new GameObject();
                    prefabGo = PrefabUtility.CreatePrefab(prefabPath, go, ReplacePrefabOptions.ConnectToPrefab);
                }
                else
                {
                    go = GameObject.Instantiate(prefabGo) as GameObject;

                    var oldAnimator = go.GetComponent <Animator>();
                    if (oldAnimator)
                    {
                        GameObject.DestroyImmediate(oldAnimator);
                    }
                }

                //Build the prefab based on the supplied entity
                pb.MakePrefab(entity, go, folderPath);

                var animator = go.AddComponent <Animator>();



                //Add animations to prefab object
                var anim         = new AnimationBuilder();
                var allAnimClips = anim.BuildAnimationClips(go, entity, prefabPath);
                AssetDatabase.SaveAssets();

                var animatorControllerPath = Path.ChangeExtension(prefabPath, "controller");
                var oldController          = (AnimatorController)AssetDatabase.LoadAssetAtPath(animatorControllerPath, typeof(AnimatorController));
                var controller             = oldController;

                if (!oldController)
                {
                    controller = AnimatorController.CreateAnimatorControllerAtPath(animatorControllerPath);
                    foreach (var animationClip in allAnimClips)
                    {
                        if (animationClip)
                        {
#if UNITY_5
                            controller.AddMotion(animationClip);
#else
                            AnimatorController.AddAnimationClipToController(controller, animationClip);
#endif
                        }
                    }
                }
                AnimatorController.SetAnimatorController(animator, controller);
                go.SetActive(true);
                //Update the prefab
                PrefabUtility.ReplacePrefab(go, prefabGo, ReplacePrefabOptions.ConnectToPrefab);

                //Add a generic avatar - because why not?
                //TODO: May need to eventually break this into a separate class
                //  ie: if we want to look for a root motion node by naming convention
                //var avatar = AvatarBuilder.BuildGenericAvatar(go, "");
                //avatar.name = go.name;
                //AssetDatabase.AddObjectToAsset(avatar, prefabPath);

                GameObject.DestroyImmediate(go);

                AssetDatabase.SaveAssets();
            }
        }