#if UNITY_EDITOR using System.Collections.Generic; using System.IO; using GpuEcsAnimationBaker.Engine.Data; using UnityEditor; using UnityEngine; namespace GPUECSAnimationBaker.Engine.Baker { [CustomEditor(typeof(GpuEcsAnimationBakerBehaviour))] public class GpuEcsAnimationBakerEditor : UnityEditor.Editor { private SerializedProperty bakerDataProperty; private SerializedProperty gpuEcsAnimatorProperty; private bool showPrefabError = false; void OnEnable() { bakerDataProperty = serializedObject.FindProperty("bakerData"); gpuEcsAnimatorProperty = serializedObject.FindProperty("gpuEcsAnimator"); showPrefabError = false; } public override void OnInspectorGUI() { GameObject sourceModel = ((GpuEcsAnimationBakerBehaviour)target).gameObject; GUIStyle labelStyle = new GUIStyle(GUI.skin.label); labelStyle.normal.textColor = new Color(1f, 0.5f, 0f, 1f); labelStyle.wordWrap = true; labelStyle.alignment = TextAnchor.MiddleLeft; labelStyle.fontSize = 22; labelStyle.fontStyle = FontStyle.Bold; labelStyle.fixedHeight = 36; GUILayout.Label("GPU ECS Animation Baker", labelStyle); serializedObject.Update(); EditorGUILayout.PropertyField(bakerDataProperty); bool validated = GpuEcsAnimationBakerServices.ValidateAnimationBakerData( (GpuEcsAnimationBakerData)bakerDataProperty.boxedValue, sourceModel, out string errors); if (!validated) EditorGUILayout.HelpBox(errors, MessageType.Error); if (showPrefabError) EditorGUILayout.HelpBox("Generation can only happen on unloaded, selected prefabs", MessageType.Error); GUI.enabled = validated; GUIStyle buttonStyle = new GUIStyle(GUI.skin.button); buttonStyle.normal.textColor = new Color(1f, 0.5f, 0f, 1f); buttonStyle.alignment = TextAnchor.MiddleCenter; buttonStyle.fontSize = 22; buttonStyle.fontStyle = FontStyle.Bold; buttonStyle.fixedHeight = 36; if (GUILayout.Button("Generate GPU ECS Animator", buttonStyle)) { string path = AssetDatabase.GetAssetPath(sourceModel); if (string.IsNullOrEmpty(path) || !PrefabUtility.IsPartOfAnyPrefab(sourceModel)) showPrefabError = true; else { string folder = "Assets/Art/BakedAssets/"; string subFolder = $"BakedAssets_{sourceModel.name}"; string generatedAssetsFolder = Path.Combine(folder, subFolder); string dirPath = Application.dataPath.Replace("Assets", generatedAssetsFolder); if (!Directory.Exists(dirPath)) { Directory.CreateDirectory(dirPath); } // if (!AssetDatabase.IsValidFolder(generatedAssetsFolder)) // generatedAssetsFolder = AssetDatabase.CreateFolder("Assets/","Art/BakedAssets/"+subFolder); string animatorName = sourceModel.name; GpuEcsAnimationBakerData bakerData = (GpuEcsAnimationBakerData)bakerDataProperty.boxedValue; GpuEcsAnimationBakerBehaviour gpuEcsAnimationBakerBehaviour = serializedObject.targetObject as GpuEcsAnimationBakerBehaviour; IGPUSkeletonBake[] gpuSkeletonBakes = gpuEcsAnimationBakerBehaviour.gameObject.transform .GetComponentsInChildren(); if (gpuSkeletonBakes != null && gpuSkeletonBakes.Length > 0) { List attachmentAnchors = new List(); attachmentAnchors.AddRange(bakerData.attachmentAnchors); for (int i = 0; i < gpuSkeletonBakes.Length; i++) { IGPUSkeletonBake iGPUSkeletonBake = gpuSkeletonBakes[i]; Transform transform = iGPUSkeletonBake.GetTransform(); if (transform != null) { string skeletonName = iGPUSkeletonBake.GetSkeletonName(); if (!string.IsNullOrEmpty(skeletonName)) { bool isOk = true; for (int j = 0; j < attachmentAnchors.Count; j++) { if (attachmentAnchors[j].attachmentAnchorID.Equals(skeletonName)) { isOk = false; break; } } if (isOk) { AttachmentAnchor attachmentAnchor = new AttachmentAnchor(); attachmentAnchor.attachmentAnchorID = skeletonName; attachmentAnchor.attachmentAnchorTransform = transform; attachmentAnchors.Add(attachmentAnchor); } } } } bakerData.attachmentAnchors = attachmentAnchors.ToArray(); } GameObject newGpuEcsAnimator = GpuEcsAnimationBakerServices.GenerateAnimationObject(path, bakerData, animatorName, generatedAssetsFolder); gpuEcsAnimatorProperty.boxedValue = newGpuEcsAnimator; showPrefabError = false; } } GUI.enabled = true; EditorGUILayout.PropertyField(gpuEcsAnimatorProperty); serializedObject.ApplyModifiedProperties(); } } } #endif