update
This commit is contained in:
@@ -70,7 +70,6 @@ public class AnimatorAI : MonoBehaviour
|
||||
|
||||
protected virtual void Start()
|
||||
{
|
||||
// Sử dụng GetComponentInChildren để tìm Animator ở các đối tượng con (khung Mesh)
|
||||
animator = GetComponentInChildren<Animator>();
|
||||
enemyAI = GetComponent<EnemyAI>();
|
||||
agent = GetComponent<NavMeshAgent>();
|
||||
@@ -79,54 +78,103 @@ public class AnimatorAI : MonoBehaviour
|
||||
if (animator == null)
|
||||
{
|
||||
Debug.LogError($"<color=red>[AnimatorAI]</color> KHÔNG tìm thấy Animator trên {gameObject.name} hoặc các con của nó!");
|
||||
}
|
||||
else if (debugMode)
|
||||
{
|
||||
Debug.Log($"<color=green>[AnimatorAI]</color> Đã tìm thấy Animator trên đối tượng: {animator.gameObject.name}");
|
||||
return;
|
||||
}
|
||||
|
||||
// CHẨN ĐOÁN SÂU:
|
||||
if (debugMode) StartCoroutine(DeepDiagnosticRoutine());
|
||||
|
||||
InitializeParameters();
|
||||
}
|
||||
|
||||
private IEnumerator DeepDiagnosticRoutine()
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
yield return new WaitForSeconds(2f); // Kiểm tra mỗi 2 giây
|
||||
|
||||
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.");
|
||||
|
||||
// 3. Kiểm tra Animation Clips
|
||||
var stateInfo = animator.GetCurrentAnimatorStateInfo(0);
|
||||
var clipInfo = animator.GetCurrentAnimatorClipInfo(0);
|
||||
|
||||
if (clipInfo.Length == 0)
|
||||
{
|
||||
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.");
|
||||
}
|
||||
|
||||
if (!useSimulation) yield break; // Nếu không dùng simulation thì chỉ check 1 lần rồi thôi
|
||||
}
|
||||
}
|
||||
|
||||
protected virtual void InitializeParameters()
|
||||
{
|
||||
if (animator == null) return;
|
||||
|
||||
isDead = new vAnimatorParameter(animator, "isDead");
|
||||
isGrounded = new vAnimatorParameter(animator, "IsGrounded");
|
||||
isCrouching = new vAnimatorParameter(animator, "IsCrouching");
|
||||
isStrafing = new vAnimatorParameter(animator, "IsStrafing");
|
||||
isSliding = new vAnimatorParameter(animator, "IsSliding");
|
||||
isSprinting = new vAnimatorParameter(animator, "IsSprinting");
|
||||
isAiming = new vAnimatorParameter(animator, "IsAiming");
|
||||
canAim = new vAnimatorParameter(animator, "CanAim");
|
||||
flipAnimation = new vAnimatorParameter(animator, "FlipAnimation");
|
||||
flipEquip = new vAnimatorParameter(animator, "FlipEquip");
|
||||
groundDistance = new vAnimatorParameter(animator, "GroundDistance");
|
||||
groundAngle = new vAnimatorParameter(animator, "GroundAngle");
|
||||
verticalVelocity = new vAnimatorParameter(animator, "VerticalVelocity");
|
||||
moveSet_ID = new vAnimatorParameter(animator, "MoveSet_ID");
|
||||
upperBody_ID = new vAnimatorParameter(animator, "UpperBody_ID");
|
||||
idleRandom = new vAnimatorParameter(animator, "IdleRandom");
|
||||
idleRandomTrigger = new vAnimatorParameter(animator, "IdleRandomTrigger");
|
||||
randomAttack = new vAnimatorParameter(animator, "RandomAttack");
|
||||
weakAttack = new vAnimatorParameter(animator, "WeakAttack");
|
||||
strongAttack = new vAnimatorParameter(animator, "StrongAttack");
|
||||
isBlocking = new vAnimatorParameter(animator, "IsBlocking");
|
||||
attackID = new vAnimatorParameter(animator, "AttackID");
|
||||
defenseID = new vAnimatorParameter(animator, "DefenseID");
|
||||
recoilID = new vAnimatorParameter(animator, "RecoilID");
|
||||
reactionID = new vAnimatorParameter(animator, "ReactionID");
|
||||
triggerRecoil = new vAnimatorParameter(animator, "TriggerRecoil");
|
||||
triggerReaction = new vAnimatorParameter(animator, "TriggerReaction");
|
||||
hitDirection = new vAnimatorParameter(animator, "HitDirection");
|
||||
resetState = new vAnimatorParameter(animator, "ResetState");
|
||||
reload = new vAnimatorParameter(animator, "Reload");
|
||||
cancelReload = new vAnimatorParameter(animator, "CancelReload");
|
||||
reloadID = new vAnimatorParameter(animator, "ReloadID");
|
||||
shoot = new vAnimatorParameter(animator, "Shoot");
|
||||
shot_ID = new vAnimatorParameter(animator, "Shot_ID");
|
||||
powerCharger = new vAnimatorParameter(animator, "PowerCharger");
|
||||
// Khởi tạo và kiểm tra từng tham số quan trọng
|
||||
isDead = ValidateAndInit("isDead");
|
||||
isGrounded = ValidateAndInit("IsGrounded");
|
||||
isCrouching = ValidateAndInit("IsCrouching");
|
||||
isStrafing = ValidateAndInit("IsStrafing");
|
||||
isSliding = ValidateAndInit("IsSliding");
|
||||
isSprinting = ValidateAndInit("IsSprinting");
|
||||
isAiming = ValidateAndInit("IsAiming");
|
||||
canAim = ValidateAndInit("CanAim");
|
||||
flipAnimation = ValidateAndInit("FlipAnimation");
|
||||
flipEquip = ValidateAndInit("FlipEquip");
|
||||
groundDistance = ValidateAndInit("GroundDistance");
|
||||
groundAngle = ValidateAndInit("GroundAngle");
|
||||
verticalVelocity = ValidateAndInit("VerticalVelocity");
|
||||
moveSet_ID = ValidateAndInit("MoveSet_ID");
|
||||
upperBody_ID = ValidateAndInit("UpperBody_ID");
|
||||
idleRandom = ValidateAndInit("IdleRandom");
|
||||
idleRandomTrigger = ValidateAndInit("IdleRandomTrigger");
|
||||
randomAttack = ValidateAndInit("RandomAttack");
|
||||
weakAttack = ValidateAndInit("WeakAttack");
|
||||
strongAttack = ValidateAndInit("StrongAttack");
|
||||
isBlocking = ValidateAndInit("IsBlocking");
|
||||
attackID = ValidateAndInit("AttackID");
|
||||
defenseID = ValidateAndInit("DefenseID");
|
||||
recoilID = ValidateAndInit("RecoilID");
|
||||
reactionID = ValidateAndInit("ReactionID");
|
||||
triggerRecoil = ValidateAndInit("TriggerRecoil");
|
||||
triggerReaction = ValidateAndInit("TriggerReaction");
|
||||
hitDirection = ValidateAndInit("HitDirection");
|
||||
resetState = ValidateAndInit("ResetState");
|
||||
reload = ValidateAndInit("Reload");
|
||||
cancelReload = ValidateAndInit("CancelReload");
|
||||
reloadID = ValidateAndInit("ReloadID");
|
||||
shoot = ValidateAndInit("Shoot");
|
||||
shot_ID = ValidateAndInit("Shot_ID");
|
||||
powerCharger = ValidateAndInit("PowerCharger");
|
||||
}
|
||||
|
||||
private vAnimatorParameter ValidateAndInit(string paramName)
|
||||
{
|
||||
vAnimatorParameter p = new vAnimatorParameter(animator, paramName);
|
||||
if (!p.isValid && debugMode)
|
||||
{
|
||||
// Chỉ cảnh báo những biến cốt lõi nếu thiếu
|
||||
if (paramName == "VerticalVelocity" || paramName == "IsGrounded" || paramName == "IsAiming")
|
||||
Debug.LogWarning($"<color=yellow>[AnimatorAI]</color> Cảnh báo: Controller thiếu biến quan trọng: <b>{paramName}</b>");
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
protected virtual void Update()
|
||||
|
||||
Reference in New Issue
Block a user