Complete Update NPC AI
This commit is contained in:
@@ -130,9 +130,11 @@ namespace Invector.vShooter
|
||||
}
|
||||
|
||||
var rigb = hitInfo.collider.gameObject.GetComponent<Rigidbody>();
|
||||
if (rigb)
|
||||
if (rigb && !rigb.isKinematic)
|
||||
{
|
||||
rigb.AddForce(transform.forward * damage.damageValue * forceMultiplier, ForceMode.Impulse);
|
||||
// GIẢM LỰC ĐẨY: Chỉ dùng 10% lực để NPC không bị bay quá xa
|
||||
float realisticForce = (damage.damageValue * forceMultiplier) * 0.1f;
|
||||
rigb.AddForce(transform.forward * realisticForce, ForceMode.Impulse);
|
||||
}
|
||||
|
||||
startPosition = transform.position;
|
||||
@@ -292,8 +294,20 @@ namespace Invector.vShooter
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
else
|
||||
{
|
||||
// DIAGNOSTIC X-RAY: Kiểm tra xem có trúng cái gì mà bị HitLayer cấm không?
|
||||
RaycastHit diagHit;
|
||||
if (Physics.Linecast(previousPosition, transform.position + transform.forward * 0.5f, out diagHit, ~0)) // ~0 là tất cả layer
|
||||
{
|
||||
if (diagHit.collider.CompareTag("Enemy") || diagHit.collider.name.Contains("Guard") || diagHit.collider.GetComponentInParent<EnemyAI>() != null)
|
||||
{
|
||||
Debug.LogError($"<color=red>LAYER BLOCK DETECTED!</color> Đạn vừa bay xuyên qua {diagHit.collider.name}. " +
|
||||
$"Đối tượng này ở Layer: {LayerMask.LayerToName(diagHit.collider.gameObject.layer)} ({diagHit.collider.gameObject.layer}). " +
|
||||
$"NHƯNG súng của bạn đang dùng HitLayer Mask: {hitLayer.value}, không bao gồm layer này!");
|
||||
}
|
||||
}
|
||||
|
||||
if (debugTrajetory)
|
||||
{
|
||||
Debug.DrawLine(transform.position, previousPosition, debugColor, 10f);
|
||||
@@ -301,7 +315,8 @@ namespace Invector.vShooter
|
||||
}
|
||||
|
||||
previousPosition = transform.position;
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -242,6 +242,21 @@ namespace Invector.vShooter
|
||||
#endregion
|
||||
|
||||
#region Protected Methods
|
||||
protected virtual void Start()
|
||||
{
|
||||
// TỰ ĐỘNG SỬA LỖI LAYER: Đảm bảo súng luôn có thể bắn trúng Enemy
|
||||
int enemyLayer = LayerMask.NameToLayer("Enemy");
|
||||
if (enemyLayer != -1)
|
||||
{
|
||||
// Cưỡng bức thêm Layer Enemy vào mask (Dùng toán tử bit OR)
|
||||
hitLayer.value |= (1 << enemyLayer);
|
||||
Debug.Log($"<color=green>[WEAPON AUTO-FIX]</color> {gameObject.name} hiện đã có thể bắn trúng Layer 'Enemy' (Mask mới: {hitLayer.value}).");
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogError("<color=red>[WEAPON ERROR]</color> Bạn chưa tạo Layer tên là 'Enemy' trong Project Settings > Tags and Layers!");
|
||||
}
|
||||
}
|
||||
|
||||
protected virtual void OnDestroy()
|
||||
{
|
||||
@@ -256,6 +271,14 @@ namespace Invector.vShooter
|
||||
{
|
||||
ShootBullet(startPoint, endPoint);
|
||||
ShotEffect();
|
||||
|
||||
// Gửi tín hiệu tiếng súng cho toàn bộ AI lân cận
|
||||
var hitColliders = Physics.OverlapSphere(muzzle.position, 50f);
|
||||
foreach (var hit in hitColliders)
|
||||
{
|
||||
var ai = hit.GetComponentInParent<EnemyAI>();
|
||||
if (ai != null) ai.TriggerCombatAlert(muzzle.position);
|
||||
}
|
||||
}
|
||||
public virtual Vector3 Dispersion(Vector3 aim, float dispersion)
|
||||
{
|
||||
@@ -297,6 +320,18 @@ namespace Invector.vShooter
|
||||
|
||||
protected virtual void ShootBullet(Vector3 startPoint, Vector3 endPoint)
|
||||
{
|
||||
// TỰ ĐỘNG SỬA LỖI LAYER (Cưỡng bức mỗi khi bắn):
|
||||
int enemyLayer = LayerMask.NameToLayer("Enemy");
|
||||
if (enemyLayer != -1)
|
||||
{
|
||||
// Ép thêm Layer Enemy vào mask nếu nó bị thiếu
|
||||
if ((hitLayer.value & (1 << enemyLayer)) == 0)
|
||||
{
|
||||
hitLayer.value |= (1 << enemyLayer);
|
||||
Debug.Log($"<color=orange>[WEAPON FORCE-FIX]</color> Đã cưỡng bức thêm Layer 'Enemy' vào {gameObject.name} khi bắn.");
|
||||
}
|
||||
}
|
||||
|
||||
var dir = endPoint - startPoint;
|
||||
//StartCoroutine(DebugDispersion(startPoint, endPoint));
|
||||
var rotation = Quaternion.LookRotation(dir);
|
||||
|
||||
Reference in New Issue
Block a user