using System; using System.Linq; using TMPro; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; namespace AIGame.Review { /// Controls scene-authored Animator instances and JSON-authored UI. public sealed class BotAnimationLab : MonoBehaviour { [Serializable] public sealed class Actor { public string label; public Animator animator; public Transform stage; public AnimationClip[] clips; public SkinnedMeshRenderer[] skins; public Material[] originalMaterials; } public Actor[] actors; public Transform ui; public Camera reviewCamera; public Camera[] comparisonCameras; public Material clayMaterial; public bool playing = true; public bool repeatAttacks; public bool gray; public float speed = 1; public int selectedMotion; public int focus = -1; public int detail; public float yaw; public float zoom = 1; public static readonly string[] StateNames = { "Idle", "Walk", "Attack01", "Attack02" }; TMP_Text stateText, timeText, playText, loopText, materialText, detailText; RectTransform progress; float progressWidth; Vector3 lastMouse; bool dragging; bool previousRunInBackground; Actor ReferenceActor => actors[focus >= 0 ? focus : 0]; public float Duration => ReferenceActor.clips[selectedMotion].length; public float TimePosition => Mathf.Clamp01(ReferenceActor.animator.GetCurrentAnimatorStateInfo(0).normalizedTime % 1f) * Duration; void OnEnable() { if (!Application.isPlaying) return; previousRunInBackground = Application.runInBackground; Application.runInBackground = true; } void OnDisable() { if (Application.isPlaying) Application.runInBackground = previousRunInBackground; } void Awake() { var buttons = ui.GetComponentsInChildren