GpuEcsAnimationBakerEditor.cs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. #if UNITY_EDITOR
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using GpuEcsAnimationBaker.Engine.Data;
  5. using UnityEditor;
  6. using UnityEngine;
  7. namespace GPUECSAnimationBaker.Engine.Baker
  8. {
  9. [CustomEditor(typeof(GpuEcsAnimationBakerBehaviour))]
  10. public class GpuEcsAnimationBakerEditor : UnityEditor.Editor
  11. {
  12. private SerializedProperty bakerDataProperty;
  13. private SerializedProperty gpuEcsAnimatorProperty;
  14. private bool showPrefabError = false;
  15. void OnEnable()
  16. {
  17. bakerDataProperty = serializedObject.FindProperty("bakerData");
  18. gpuEcsAnimatorProperty = serializedObject.FindProperty("gpuEcsAnimator");
  19. showPrefabError = false;
  20. }
  21. public override void OnInspectorGUI()
  22. {
  23. GameObject sourceModel = ((GpuEcsAnimationBakerBehaviour)target).gameObject;
  24. GUIStyle labelStyle = new GUIStyle(GUI.skin.label);
  25. labelStyle.normal.textColor = new Color(1f, 0.5f, 0f, 1f);
  26. labelStyle.wordWrap = true;
  27. labelStyle.alignment = TextAnchor.MiddleLeft;
  28. labelStyle.fontSize = 22;
  29. labelStyle.fontStyle = FontStyle.Bold;
  30. labelStyle.fixedHeight = 36;
  31. GUILayout.Label("GPU ECS Animation Baker", labelStyle);
  32. serializedObject.Update();
  33. EditorGUILayout.PropertyField(bakerDataProperty);
  34. bool validated = GpuEcsAnimationBakerServices.ValidateAnimationBakerData(
  35. (GpuEcsAnimationBakerData)bakerDataProperty.boxedValue, sourceModel, out string errors);
  36. if (!validated) EditorGUILayout.HelpBox(errors, MessageType.Error);
  37. if (showPrefabError)
  38. EditorGUILayout.HelpBox("Generation can only happen on unloaded, selected prefabs", MessageType.Error);
  39. GUI.enabled = validated;
  40. GUIStyle buttonStyle = new GUIStyle(GUI.skin.button);
  41. buttonStyle.normal.textColor = new Color(1f, 0.5f, 0f, 1f);
  42. buttonStyle.alignment = TextAnchor.MiddleCenter;
  43. buttonStyle.fontSize = 22;
  44. buttonStyle.fontStyle = FontStyle.Bold;
  45. buttonStyle.fixedHeight = 36;
  46. if (GUILayout.Button("Generate GPU ECS Animator", buttonStyle))
  47. {
  48. string path = AssetDatabase.GetAssetPath(sourceModel);
  49. if (string.IsNullOrEmpty(path) || !PrefabUtility.IsPartOfAnyPrefab(sourceModel))
  50. showPrefabError = true;
  51. else
  52. {
  53. string folder = "Assets/Art/BakedAssets/";
  54. string subFolder = $"BakedAssets_{sourceModel.name}";
  55. string generatedAssetsFolder = Path.Combine(folder, subFolder);
  56. string dirPath = Application.dataPath.Replace("Assets", generatedAssetsFolder);
  57. if (!Directory.Exists(dirPath))
  58. {
  59. Directory.CreateDirectory(dirPath);
  60. }
  61. // if (!AssetDatabase.IsValidFolder(generatedAssetsFolder))
  62. // generatedAssetsFolder = AssetDatabase.CreateFolder("Assets/","Art/BakedAssets/"+subFolder);
  63. string animatorName = sourceModel.name;
  64. GpuEcsAnimationBakerData bakerData = (GpuEcsAnimationBakerData)bakerDataProperty.boxedValue;
  65. GpuEcsAnimationBakerBehaviour gpuEcsAnimationBakerBehaviour =
  66. serializedObject.targetObject as GpuEcsAnimationBakerBehaviour;
  67. IGPUSkeletonBake[] gpuSkeletonBakes = gpuEcsAnimationBakerBehaviour.gameObject.transform
  68. .GetComponentsInChildren<IGPUSkeletonBake>();
  69. if (gpuSkeletonBakes != null && gpuSkeletonBakes.Length > 0)
  70. {
  71. List<AttachmentAnchor> attachmentAnchors = new List<AttachmentAnchor>();
  72. attachmentAnchors.AddRange(bakerData.attachmentAnchors);
  73. for (int i = 0; i < gpuSkeletonBakes.Length; i++)
  74. {
  75. IGPUSkeletonBake iGPUSkeletonBake = gpuSkeletonBakes[i];
  76. Transform transform = iGPUSkeletonBake.GetTransform();
  77. if (transform != null)
  78. {
  79. string skeletonName = iGPUSkeletonBake.GetSkeletonName();
  80. if (!string.IsNullOrEmpty(skeletonName))
  81. {
  82. bool isOk = true;
  83. for (int j = 0; j < attachmentAnchors.Count; j++)
  84. {
  85. if (attachmentAnchors[j].attachmentAnchorID.Equals(skeletonName))
  86. {
  87. isOk = false;
  88. break;
  89. }
  90. }
  91. if (isOk)
  92. {
  93. AttachmentAnchor attachmentAnchor = new AttachmentAnchor();
  94. attachmentAnchor.attachmentAnchorID = skeletonName;
  95. attachmentAnchor.attachmentAnchorTransform = transform;
  96. attachmentAnchors.Add(attachmentAnchor);
  97. }
  98. }
  99. }
  100. }
  101. bakerData.attachmentAnchors = attachmentAnchors.ToArray();
  102. }
  103. GameObject newGpuEcsAnimator = GpuEcsAnimationBakerServices.GenerateAnimationObject(path, bakerData,
  104. animatorName, generatedAssetsFolder);
  105. gpuEcsAnimatorProperty.boxedValue = newGpuEcsAnimator;
  106. showPrefabError = false;
  107. }
  108. }
  109. GUI.enabled = true;
  110. EditorGUILayout.PropertyField(gpuEcsAnimatorProperty);
  111. serializedObject.ApplyModifiedProperties();
  112. }
  113. }
  114. }
  115. #endif