Advertisement
corp0

Untitled

Dec 4th, 2022
386
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.24 KB | None | 0 0
  1. using System.Collections.Generic;
  2. using Character;
  3. using Character.Sprites;
  4. using UnityEditor;
  5. using UnityEngine;
  6.  
  7. namespace EditorTools.Sprites
  8. {
  9.     public class AnimationGenerator: ScriptableWizard
  10.     {
  11.         [SerializeField] private string pieceName;
  12.         [SerializeField] private Animator destinationAnimator;
  13.        
  14.         [SerializeField] private List<ActionData> actions = new();
  15.  
  16.         [SerializeField] private List<Direction> directions = new()
  17.         {
  18.             Direction.Left,
  19.             Direction.LefUp,
  20.             Direction.Up,
  21.             Direction.RightUp,
  22.             Direction.Right,
  23.             Direction.RightDown,
  24.             Direction.Down,
  25.             Direction.LeftDown
  26.         };
  27.        
  28.         [SerializeField] private List<Sprite> sprites = new();
  29.        
  30.         private const string PATH = "Assets/Animations";
  31.         private Sprite[,] sprites2dArray;
  32.  
  33.  
  34.         [MenuItem("Tools/Animation Generator")]
  35.         public static void ShowWindow()
  36.         {
  37.             DisplayWizard<AnimationGenerator>("Animation Generator", "Generate");
  38.         }
  39.  
  40.         public void OnWizardCreate()
  41.         {
  42.             sprites2dArray = new Sprite[directions.Count, actions.Count];
  43.            
  44.             DistributeSpritesInto2DArray();
  45.             CreateAssets();
  46.         }
  47.  
  48.         private void CreateAssets()
  49.         {
  50.             AssetDatabase.CreateFolder(PATH, pieceName);
  51.  
  52.             foreach (var direction in directions)
  53.             {
  54.                 foreach (var action in actions)
  55.                 {
  56.                     CreateAnimationAsset(direction, action);
  57.                 }
  58.             }
  59.         }
  60.  
  61.         private void CreateAnimationAsset(Direction direction, ActionData actionData)
  62.         {
  63.             var animationClip = new AnimationClip
  64.             {
  65.                 name = $"{pieceName.ToUpper()}_{actionData.Id}_{direction.ToString()}",
  66.                 frameRate = 12,
  67.                 wrapMode = ActionToWrapMode(actionData),
  68.             };
  69.  
  70.             //Create the CurveBinding
  71.             var spriteBinding = new EditorCurveBinding
  72.             {
  73.                 type = typeof(SpriteRenderer),
  74.                 path = "",
  75.                 propertyName = "m_Sprite"
  76.             };
  77.            
  78.             var spriteKeyFrames = new ObjectReferenceKeyframe[actionData.FramesAmount];
  79.             var currentFrame = 0;
  80.             for (int j = 0; j < actionData.FramesAmount; j++)
  81.             {
  82.                 spriteKeyFrames[j] = new ObjectReferenceKeyframe
  83.                 {
  84.                     time = j / animationClip.frameRate,
  85.                     value = sprites2dArray[(int) direction, currentFrame]
  86.                 };
  87.                 currentFrame++;
  88.             }
  89.  
  90.             AnimationUtility.SetObjectReferenceCurve(animationClip, spriteBinding, spriteKeyFrames);
  91.  
  92.             //Set Loop Time to True
  93.             var settings = AnimationUtility.GetAnimationClipSettings(animationClip);
  94.             settings.loopTime = true;
  95.             AnimationUtility.SetAnimationClipSettings(animationClip, settings);
  96.            
  97.            
  98.             AssetDatabase.CreateAsset(animationClip, $"{PATH}/{pieceName}/{animationClip.name}.anim");
  99.             AssetDatabase.SaveAssets();
  100.             AssetDatabase.Refresh();
  101.         }
  102.  
  103.         private void DistributeSpritesInto2DArray()
  104.         {
  105.             for (int row = 0; row < directions.Count; row++)
  106.             {
  107.                 for (int column = 0; column < actions.Count; column++)
  108.                 {
  109.                     sprites2dArray[row, column] = sprites[row * actions.Count + column];
  110.                 }
  111.             }
  112.         }
  113.        
  114.         private static WrapMode ActionToWrapMode(ActionData action)
  115.         {
  116.             switch (action.AnimationType)
  117.             {
  118.                 case AnimationType.OneShot:
  119.                     return WrapMode.Once;
  120.                 case AnimationType.Looping:
  121.                     return WrapMode.Loop;
  122.                 case AnimationType.PingPong:
  123.                 default:
  124.                     Debug.LogWarning($"{action.AnimationType} is not supported. Returning WrapMode.Once");
  125.                     return WrapMode.Once;
  126.             }
  127.         }
  128.     }
  129. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement