This commit is contained in:
2026-06-05 22:34:41 +07:00
parent 91183760fb
commit 67e78d1413
4 changed files with 91 additions and 36 deletions

View File

@@ -68,6 +68,10 @@ public class AnimatorAI : MonoBehaviour
protected vAnimatorParameter powerCharger;
#endregion
[Header("Nuclear Diagnostic (Siêu chẩn đoán)")]
public string forcePlayState = ""; // Gõ tên State vào đây để ép nó chạy (vd: Idle)
public bool showLayerWeights = false;
protected virtual void Start()
{
animator = GetComponentInChildren<Animator>();
@@ -81,45 +85,57 @@ public class AnimatorAI : MonoBehaviour
return;
}
// CHẨN ĐOÁN SÂU:
if (debugMode) StartCoroutine(DeepDiagnosticRoutine());
// Chạy chẩn đoán hạt nhân
StartCoroutine(NuclearDiagnosticRoutine());
InitializeParameters();
}
private IEnumerator DeepDiagnosticRoutine()
private IEnumerator NuclearDiagnosticRoutine()
{
while (true)
{
yield return new WaitForSeconds(2f); // Kiểm tra mỗi 2 giây
yield return new WaitForSeconds(1f);
if (animator == null) yield break;
// 1. Kiểm tra Avatar
if (animator.avatar == null)
Debug.LogError($"<color=red>[T-POSE ALERT]</color> {animator.gameObject.name} KHÔNG CÓ AVATAR! Đây là lý do bị T-Pose. Hãy kéo Avatar vào component Animator.");
// 2. Kiểm tra Speed
if (animator.speed <= 0)
Debug.LogWarning($"<color=yellow>[T-POSE ALERT]</color> Tốc độ Animator đang bằng {animator.speed}. Nhân vật sẽ không cử động.");
// 1. Kiểm tra Enabled
if (!animator.enabled)
Debug.LogError($"<color=red>[NUCLEAR ALERT]</color> Component Animator đang bị TẮT (enabled = false)!");
// 3. Kiểm tra Animation Clips
var stateInfo = animator.GetCurrentAnimatorStateInfo(0);
var clipInfo = animator.GetCurrentAnimatorClipInfo(0);
if (clipInfo.Length == 0)
// 2. Kiểm tra Rig Type
if (animator.isHuman)
Debug.Log($"<color=white>[Rig Info]</color> Rig là Humanoid. Hãy chắc chắn các Animation cũng là Humanoid.");
else
Debug.LogWarning($"<color=yellow>[Rig Info]</color> Rig là Generic/Legacy. Nếu bạn dùng Animation Humanoid nó sẽ không chạy.");
// 3. Kiểm tra Layer Weight
if (showLayerWeights)
{
Debug.LogError($"<color=red>[T-POSE ALERT]</color> State hiện tại ({stateInfo.fullPathHash}) KHÔNG CÓ Clip animation nào! Hãy kéo file .anim vào ô Motion của State trong Animator Controller.");
}
// 4. Kiểm tra Culling
if (animator.cullingMode == AnimatorCullingMode.CullCompletely)
{
// Đôi khi Unity tự tắt animation nếu camera không nhìn thấy
Debug.Log($"<color=white>[Info]</color> Culling Mode đang là CullCompletely. Nếu nhân vật ở xa có thể sẽ dừng animation.");
for (int i = 0; i < animator.layerCount; i++)
{
Debug.Log($"Layer {i} ({animator.GetLayerName(i)}): Weight = {animator.GetLayerWeight(i)}");
}
}
if (!useSimulation) yield break; // Nếu không dùng simulation thì chỉ check 1 lần rồi thôi
// 4. Ép chạy State nếu có yêu cầu
if (!string.IsNullOrEmpty(forcePlayState))
{
Debug.Log($"<color=magenta>[Nuclear Force]</color> ÉP CHẠY STATE: {forcePlayState}");
animator.Play(forcePlayState);
forcePlayState = ""; // Reset sau khi chạy
}
// 5. Kiểm tra vị trí xương (Nếu T-pose thì thường xương không đổi vị trí)
Vector3 handPos = animator.GetBoneTransform(HumanBodyBones.RightHand) ? animator.GetBoneTransform(HumanBodyBones.RightHand).position : Vector3.zero;
yield return new WaitForSeconds(0.1f);
if (handPos != Vector3.zero && Vector3.Distance(handPos, animator.GetBoneTransform(HumanBodyBones.RightHand).position) < 0.001f && animator.speed > 0)
{
// Nếu xương không nhúc nhích dù tốc độ > 0
Debug.LogWarning($"<color=red>[NUCLEAR ALERT]</color> CẢNH BÁO: Xương nhân vật không nhúc nhích! Có thể do Rig lỗi hoặc bị script khác khóa xương.");
}
if (!useSimulation) yield break;
}
}