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); }
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); } }
/// <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(); }
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; } } }