コード例 #1
0
        private bool ScrapeForAnimations()
        {
            amtToCreate = 0;
            string path = AssetDatabase.GetAssetPath(spritesheet);

            Object[] spriteObjs = AssetDatabase.LoadAllAssetsAtPath(path);

            animations = new List <AnimationCreationData>();
            Dictionary <string, AnimationCreationData> lookup = new Dictionary <string, AnimationCreationData>();

            foreach (var obj in spriteObjs)
            {
                Sprite sprite = obj as Sprite;
                if (sprite == null)
                {
                    continue;
                }
                int last_ = sprite.name.LastIndexOf('_');
                if (last_ == -1)
                {
                    continue;
                }

                string name = sprite.name.Substring(0, last_);
                if (filter != null)
                {
                    if (!name.Contains(filter))
                    {
                        continue;
                    }
                }
                if (int.TryParse(sprite.name.Substring(last_ + 1), out int num))
                {
                    if (lookup.ContainsKey(name))
                    {
                        lookup[name].frameData[num] = sprite;
                    }
                    else
                    {
                        var animData = new AnimationCreationData();
                        animData.name = name;
                        if (spritesheet.name.StartsWith(name))
                        {
                            animData.create = false;
                        }
                        else
                        {
                            ++amtToCreate;
                        }
                        animData.frameData      = new Dictionary <int, Sprite>();
                        animData.frameData[num] = sprite;
                        lookup[name]            = animData;
                    }
                }
            }

            animations.AddRange(lookup.Values);

            return(true);
        }
コード例 #2
0
        private void CreateSingleAnimation(AnimationCreationData animData)
        {
            string path = EditorUtility.SaveFilePanelInProject(
                "Create New Animation", animData.name, "anim",
                "Where to save animation?", lastSavedFolderPath);

            if (path.Length != 0 && AnimatorControllerIsValid(path))
            {
                CreateAnimation(path, animData);
            }
        }
コード例 #3
0
        /// <summary>
        /// TODO: make sure the frames are in order. There is no guarantee (?) that the spritesheet
        /// served these up in any order.
        /// </summary>
        /// <param name="filepath"></param>
        /// <param name="animData"></param>
        private void CreateAnimation(string filepath, AnimationCreationData animData)
        {
            lastSavedFolderPath = Path.GetDirectoryName(filepath);
            AnimationClip clip = new AnimationClip();

            clip.frameRate = frameRate;

            EditorCurveBinding binding = new EditorCurveBinding();

            binding.type         = typeof(SpriteRenderer);
            binding.path         = "";
            binding.propertyName = "m_Sprite";

            ObjectReferenceKeyframe[] keyFrames = new ObjectReferenceKeyframe[animData.frameData.Count];
            for (int i = 0; i < keyFrames.Length; ++i)
            {
                keyFrames[i]      = new ObjectReferenceKeyframe();
                keyFrames[i].time = (float)i / frameRate;
                try
                {
                    keyFrames[i].value = animData.frameData[i];
                }
                catch (KeyNotFoundException)
                {
                    Debug.Log("No key? " + animData.name + " i: " + i);
                }
            }

            AnimationUtility.SetObjectReferenceCurve(clip, binding, keyFrames);
            AssetDatabase.CreateAsset(clip, filepath);
            if (isLoop)
            {
                AnimationClipSettings settings = AnimationUtility.GetAnimationClipSettings(clip);
                settings.loopTime = true;
                AnimationUtility.SetAnimationClipSettings(clip, settings);
            }
            AssetDatabase.SaveAssets();
            AssetDatabase.Refresh();

            animatorController.AddMotion(clip);

            AssetDatabase.SaveAssets();
            AssetDatabase.Refresh();
        }
コード例 #4
0
        private void ScrapeForAnimations()
        {
            string path = AssetDatabase.GetAssetPath(spritesheet);

            UnityEngine.Object[] spriteObjs = AssetDatabase.LoadAllAssetsAtPath(path);
            Dictionary <string, AnimationCreationData> lookup = new Dictionary <string, AnimationCreationData>();

            foreach (var obj in spriteObjs)
            {
                Sprite sprite = obj as Sprite;
                if (sprite == null)
                {
                    continue;
                }
                int last_ = sprite.name.LastIndexOf('_');
                if (last_ == -1)
                {
                    continue;
                }

                string spriteName = sprite.name.Substring(0, last_);                 // name of slice without trailing numbers
                int    second_    = spriteName.LastIndexOf('_');
                if (second_ == -1)
                {
                    continue;
                }

                string spritePrefix = spriteName.Substring(0, second_);                 // character name
                baseName = spritePrefix;
                string spriteMidfix = spriteName.Substring(second_ + 1);                // class name

                if (!int.TryParse(sprite.name.Substring(last_ + 1), out int num))
                {
                    continue;
                }

                if (!lookup.TryGetValue(spriteMidfix, out AnimationCreationData animData))
                {
                    animData = new AnimationCreationData()
                    {
                        name      = spriteMidfix,
                        frameData = new Dictionary <int, Sprite>(),
                    };

                    lookup[spriteMidfix] = animData;
                }

                animData.frameData[num] = sprite;
            }

            animationDict = new Dictionary <string, AnimationCreationData[]>();

            foreach (var spriteRow in lookup.Values)
            {
                AnimationCreationData[] animCreateData = new AnimationCreationData[AnimationData.animations.Values.Count];
                animationDict[spriteRow.name] = animCreateData;                 // all animations for a class

                int animIndex = 0;
                foreach (var animData in AnimationData.animations)
                {
                    animCreateData[animIndex]           = new AnimationCreationData();
                    animCreateData[animIndex].name      = animData.Key;                // name of animation clip
                    animCreateData[animIndex].frameData = new Dictionary <int, Sprite>();

                    for (int i = 0; i < animData.Value.Length; ++i)
                    {
                        int num = int.Parse(animData.Value[i]);
                        animCreateData[animIndex].frameData[i] = spriteRow.frameData[num];
                    }

                    ++animIndex;
                }
            }
        }