Advertisement
Guest User

Untitled

a guest
Jan 16th, 2015
1,456
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.71 KB | None | 0 0
  1. using UnityEngine;
  2. using UnityEditor;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6.  
  7.  
  8. public class AnimationCopier: EditorWindow
  9. {
  10.     [MenuItem ("Window/Animation Copier")]
  11.     public static void ShowWindow ()
  12.     {
  13.         EditorWindow.GetWindow(typeof(AnimationCopier));
  14.     }
  15.     private AnimationClip selectedAnimationClip;
  16.     private CurveInformation curveInformation;
  17.     private Vector2 scrollViewVector;
  18.     private static List<AnimationClipCurveData> animationCurveClipboard = new List<AnimationClipCurveData>();
  19.     public void OnGUI()
  20.     {
  21.         EditorGUILayout.LabelField("");
  22.         var animationClips = Resources.FindObjectsOfTypeAll<AnimationClip>().ToList();
  23.         EditorGUILayout.BeginHorizontal();
  24.         int selectedAnimationClipIndex = EditorGUILayout.Popup("Animation Clips",animationClips.IndexOf(selectedAnimationClip), animationClips.Select(x => x.name).ToArray() );
  25.         if (selectedAnimationClipIndex < 0)
  26.         {
  27.             selectedAnimationClipIndex = 0;
  28.         }
  29.         if(selectedAnimationClip != animationClips[selectedAnimationClipIndex] || curveInformation == null)
  30.         {
  31.             curveInformation = new CurveInformation(animationClips[selectedAnimationClipIndex].name);
  32.         }
  33.         selectedAnimationClip = animationClips[selectedAnimationClipIndex];
  34.  
  35.         if (GUILayout.Button("Copy", EditorStyles.miniButton))
  36.         {
  37.            animationCurveClipboard = curveInformation.GetSelectedAnimationCurves();
  38.         }
  39.         if (GUILayout.Button("Copy All", EditorStyles.miniButton))
  40.         {
  41.             animationCurveClipboard = AnimationUtility.GetAllCurves(selectedAnimationClip, true).ToList();
  42.         }
  43.         if (GUILayout.Button("Paste", EditorStyles.miniButton))
  44.         {
  45.             Paste();
  46.         }
  47.         if (GUILayout.Button("Remove", EditorStyles.miniButton))
  48.         {
  49.             var curvesToDelete =  curveInformation.GetSelectedAnimationCurves();
  50.             var allCurves = curveInformation.GetSelectedAnimationCurves(new List<AnimationClipCurveData>(), true);
  51.             selectedAnimationClip.ClearCurves();
  52.             foreach (var curveInfo in allCurves)
  53.              {
  54.                  if (curveInfo == null)
  55.                  {
  56.                      continue;
  57.                  }
  58.                  if (!curvesToDelete.Contains(curveInfo))
  59.                  {
  60.                      InsertCurve(curveInfo);
  61.                  }
  62.              }
  63.             Refresh();
  64.        
  65.         }
  66.         if (GUILayout.Button("Refresh", EditorStyles.miniButton))
  67.         {
  68.             Refresh();
  69.         }
  70.         EditorGUILayout.EndHorizontal();
  71.         foreach (AnimationClipCurveData curveData in AnimationUtility.GetAllCurves(selectedAnimationClip, true))
  72.         {
  73.             UpdateCurveInformation(selectedAnimationClip.name , curveInformation, curveData);
  74.            
  75.         }
  76.  
  77.         scrollViewVector = EditorGUILayout.BeginScrollView(scrollViewVector);
  78.         curveInformation.DisplayCurveInformation();
  79.         EditorGUILayout.EndScrollView();
  80.     }
  81.  
  82.     private void Refresh()
  83.     {
  84.  
  85.         curveInformation = new CurveInformation(selectedAnimationClip.name);
  86.     }
  87.  
  88.  
  89.     private void Paste()
  90.     {    
  91.         foreach (AnimationClipCurveData animationClipCurveData in animationCurveClipboard)
  92.         {
  93.             if (animationClipCurveData == null)
  94.             {
  95.                 continue;
  96.             }
  97.             InsertCurve(animationClipCurveData);
  98.         }
  99.     }
  100.  
  101.     private void InsertCurve(AnimationClipCurveData animationClipCurveData)
  102.     {
  103.         EditorCurveBinding editorCurveBinding = new EditorCurveBinding();
  104.         editorCurveBinding.path = animationClipCurveData.path;
  105.         editorCurveBinding.propertyName = animationClipCurveData.propertyName;
  106.         editorCurveBinding.type = animationClipCurveData.type;
  107.  
  108.         AnimationUtility.SetEditorCurve(selectedAnimationClip, editorCurveBinding, animationClipCurveData.curve);
  109.     }
  110.  
  111.     private void UpdateCurveInformation(string nameOfClip, CurveInformation curveInformationToUpdate, AnimationClipCurveData animationCruveData)
  112.     {
  113.  
  114.         List<string> curveInformationNames = animationCruveData.path.Split(new string[] { "/" }, StringSplitOptions.RemoveEmptyEntries).ToList();
  115.  
  116.         curveInformationNames.Insert(0, nameOfClip);
  117.         curveInformationNames.Add(animationCruveData.type.ToString());
  118.         curveInformationNames.Add(animationCruveData.propertyName);
  119.  
  120.         curveInformationToUpdate.AddIfNonExistant(curveInformationNames, animationCruveData);
  121.     }
  122.     private class CurveInformation
  123.     {
  124.         public bool IsChecked { get; set; }
  125.         public AnimationClipCurveData AnimationClipCurveData { get; set; }
  126.  
  127.         public string Name{get; private set;}
  128.  
  129.  
  130.         public List<CurveInformation> Children { get; private set; }
  131.         public CurveInformation(string name)
  132.         {
  133.             Name = name;
  134.             Children = new List<CurveInformation>();
  135.         }
  136.  
  137.         public void DisplayCurveInformation()
  138.         {
  139.             IsChecked = EditorGUILayout.ToggleLeft(Name, IsChecked);
  140.          
  141.             EditorGUI.indentLevel++;
  142.             foreach (var child in Children)
  143.             {
  144.                 child.DisplayCurveInformation();
  145.             }
  146.             EditorGUI.indentLevel--;
  147.         }
  148.         public List<AnimationClipCurveData> GetSelectedAnimationCurves(List<AnimationClipCurveData> animationCurves = null, bool overwriteChecked = false)
  149.         {
  150.             if (animationCurves == null)
  151.             {
  152.                 animationCurves = new List<AnimationClipCurveData>();
  153.             }
  154.             if (this.IsChecked || overwriteChecked)
  155.             {
  156.                 animationCurves.Add(this.AnimationClipCurveData);
  157.                 foreach (var child in Children)
  158.                 {
  159.                     animationCurves =child.GetSelectedAnimationCurves(animationCurves, true);
  160.                 }
  161.             }
  162.             else
  163.             {
  164.                 foreach (var child in Children)
  165.                 {
  166.                     animationCurves = child.GetSelectedAnimationCurves(animationCurves, false);
  167.                 }
  168.             }
  169.             return animationCurves;
  170.         }
  171.  
  172.         public CurveInformation AddIfNonExistant(List<string> path, AnimationClipCurveData animationCLipCurveData)
  173.         {
  174.            
  175.             if(Name.Equals(path[0]))
  176.             {
  177.                 if (path.Count == 1)
  178.                 {
  179.                     AnimationClipCurveData = animationCLipCurveData;
  180.                     return this;
  181.                 }
  182.                 var pathReduced = path;
  183.                 pathReduced.RemoveAt(0);
  184.                 foreach (CurveInformation curveInformation in Children)
  185.                 {
  186.                     if (curveInformation.Name.Equals(pathReduced[0]))
  187.                     {
  188.                         CurveInformation childResult = curveInformation.AddIfNonExistant(pathReduced, animationCLipCurveData);
  189.                         if (childResult != null)
  190.                         {
  191.                             return childResult;
  192.                         }
  193.                     }
  194.                 }
  195.             }
  196.             CurveInformation newChild = new CurveInformation(path[0]);
  197.             Children.Add(newChild);
  198.             if (path.Count == 1)
  199.             {
  200.                 newChild.AnimationClipCurveData = animationCLipCurveData;
  201.                 return newChild;
  202.             }
  203.             else
  204.             {
  205.                 var pathReduced = path;
  206.                 pathReduced.RemoveAt(0);
  207.                 return newChild.AddIfNonExistant(pathReduced, animationCLipCurveData);
  208.             }
  209.         }
  210.     }
  211. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement