This commit is contained in:
manhduyhoang90
2026-06-05 22:54:03 +07:00
32 changed files with 273 additions and 82 deletions

View File

@@ -14716,7 +14716,10 @@ AnimatorStateMachine:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Base Layer
m_ChildStates: []
m_ChildStates:
- serializedVersion: 1
m_State: {fileID: 4416801500611958025}
m_Position: {x: -358.64734, y: -43.860413, z: 0}
m_ChildStateMachines:
- serializedVersion: 1
m_StateMachine: {fileID: 1107191697213795204}
@@ -36256,6 +36259,32 @@ AnimatorStateTransition:
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1
--- !u!1102 &4416801500611958025
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: TestRun
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400012, guid: 37c6cfe59f56e8a4799011397a870a8b, type: 3}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1101 &4602781940129309487
AnimatorStateTransition:
m_ObjectHideFlags: 1

View File

@@ -609,7 +609,7 @@ MonoBehaviour:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7522161431095319480}
m_Enabled: 1
m_Enabled: 0
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 35bba55c2a743d042ab1fff35e29db50, type: 3}
m_Name:

View File

@@ -14,6 +14,7 @@ GameObject:
- component: {fileID: 411349647056113735}
- component: {fileID: 2417107839128453854}
- component: {fileID: 6433774282585127385}
- component: {fileID: -8021594009672363794}
m_Layer: 0
m_Name: "_LazerPr\u1ECDectile"
m_TagString: Untagged
@@ -31,8 +32,8 @@ Transform:
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0.69, z: 0.267}
m_LocalScale: {x: 0.1, y: 0.1, z: 0.1}
m_ConstrainProportionsScale: 0
m_LocalScale: {x: 0.05, y: 0.05, z: 0.05}
m_ConstrainProportionsScale: 1
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
@@ -108,7 +109,7 @@ SphereCollider:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 0
m_IsTrigger: 1
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 3
@@ -245,5 +246,34 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 4e4f602386d4d484ea7a2a3b0c19ac21, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::LaserProjectile
speed: 5
speed: 100
lifeTime: 5
damageAmount: 10
hitSound: Laser_Hit
--- !u!54 &-8021594009672363794
Rigidbody:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3965388737199864462}
serializedVersion: 5
m_Mass: 1
m_LinearDamping: 0
m_AngularDamping: 0.05
m_CenterOfMass: {x: 0, y: 0, z: 0}
m_InertiaTensor: {x: 1, y: 1, z: 1}
m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_ImplicitCom: 1
m_ImplicitTensor: 1
m_UseGravity: 1
m_IsKinematic: 1
m_Interpolate: 0
m_Constraints: 0
m_CollisionDetection: 0

View File

@@ -90874,6 +90874,22 @@ PrefabInstance:
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6469822191588635990, guid: 15df559ce497e104a81254e0adf3107e, type: 3}
propertyPath: useSimulation
value: 1
objectReference: {fileID: 0}
- target: {fileID: 6469822191588635990, guid: 15df559ce497e104a81254e0adf3107e, type: 3}
propertyPath: autoCycleSpeed
value: 1
objectReference: {fileID: 0}
- target: {fileID: 6469822191588635990, guid: 15df559ce497e104a81254e0adf3107e, type: 3}
propertyPath: forcePlayState
value: Free Movement
objectReference: {fileID: 0}
- target: {fileID: 6469822191588635990, guid: 15df559ce497e104a81254e0adf3107e, type: 3}
propertyPath: showLayerWeights
value: 1
objectReference: {fileID: 0}
- target: {fileID: 7522161431095319480, guid: 15df559ce497e104a81254e0adf3107e, type: 3}
propertyPath: m_Name
value: xNPC
@@ -136487,7 +136503,7 @@ MonoBehaviour:
m_EditorClassIdentifier: Assembly-CSharp::Hallucinate.AI.GeminiService
apiKeys:
- AIzaSyC4DRm2dffDuDogYkY0Ag86p-EYLu67bDo
- AIzaSyC4DRm2dffDuDogYkY0Ag86p-EYLu67bDo
- AQ.Ab8RN6JvwHD9tZXWlO7eb22ahV0rxUh5cAjB3-XfKW5H_KLiyQ
- AIzaSyC4DRm2dffDuDogYkY0Ag86p-EYLu67bDo
geminiURL: https://generativelanguage.googleapis.com/v1beta/models/gemini-flash-latest:generateContent
--- !u!1 &1143870345

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;
}
}

View File

@@ -1,36 +1,66 @@
using UnityEngine;
using Hallucinate.Audio;
using Invector;
public class LaserProjectile : MonoBehaviour
{
public float speed = 5f;
public float speed = 15f; // Tăng tốc độ đạn để cảm giác mượt hơn
public float lifeTime = 5f;
public int damageAmount = 10;
[Header("Audio")]
public string hitSound = "Laser_Hit";
private void Start()
{
// Tự hủy sau một khoảng thời gian nếu không trúng gì
Destroy(gameObject, lifeTime);
}
private void Update()
{
transform.position +=
transform.forward *
speed *
Time.deltaTime;
// Di chuyển đạn
transform.position += transform.forward * speed * Time.deltaTime;
}
private void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player"))
// Debug: Log tên và tag của bất cứ thứ gì đạn chạm vào
Debug.Log($"Laser collided with: {other.name} | Tag: {other.tag} | Layer: {LayerMask.LayerToName(other.gameObject.layer)}");
// Kiểm tra nếu trúng Player
if (other.CompareTag("Player") || other.GetComponentInParent<vIHealthController>() != null)
{
Debug.Log("Player Hit");
var healthController = other.GetComponentInParent<vIHealthController>();
if (healthController != null)
{
Debug.Log($"<color=red>HIT PLAYER!</color> Found health controller on {healthController.gameObject.name}. Applying {damageAmount} damage.");
var damage = new vDamage(damageAmount);
damage.sender = transform;
damage.hitPosition = transform.position;
healthController.TakeDamage(damage);
}
// Luôn phá hủy đạn khi trúng Player
Impact();
return;
}
AudioManager.Instance?.Play(hitSound, position: transform.position);
Destroy(gameObject);
// Phá hủy đạn nếu trúng tường, sàn nhà (mọi thứ không phải trigger khác)
if (!other.isTrigger)
{
Debug.Log("Laser hit an obstacle (Wall/Floor).");
Impact();
}
}
private void Impact()
{
// Chạy âm thanh
AudioManager.Instance?.Play(hitSound, position: transform.position);
// Phá hủy đạn ngay lập tức
Destroy(gameObject);
}
}

View File

@@ -318,6 +318,14 @@ namespace Invector.vCharacterController
currentStaminaRecoveryDelay = 2f;
}
public override void TakeDamage(vDamage damage)
{
Debug.Log($"Player TakeDamage called. Damage: {damage.damageValue}. Current Health before: {currentHealth}");
base.TakeDamage(damage);
Debug.Log($"Player Health after: {currentHealth}");
// Additional logic for player-specific damage handling can be added here
}
#region Check Action Triggers