Files
2026-06-26 22:41:39 +05:30

80 lines
2.1 KiB
C#

using System.Collections;
using UnityEngine;
public class Hitbox : MonoBehaviour
{
public float damage;
public GameObject bloodVFXPrefab;
private bool hasHit;
void OnEnable()
{
hasHit = false;
}
void OnTriggerEnter(Collider other)
{
if (hasHit) return;
Hurtbox hurtbox = other.GetComponent<Hurtbox>();
if (hurtbox == null) return;
TeamMember attacker = GetComponentInParent<TeamMember>();
TeamMember target = other.GetComponentInParent<TeamMember>();
if (attacker == null || target == null) return;
if (attacker.CurrentTeam == target.CurrentTeam) return;
Health health = other.GetComponentInParent<Health>();
if (health != null)
{
hasHit = true;
health.TakeDamage(damage, hurtbox.bodyPart);
// CAMERA SHAKE ONLY WHEN HUMAN-CONTROLLED PLAYER HITS ENEMY
if (attacker.CurrentControlType == TeamMember.ControlType.HumanControlled &&
CameraShakeNew.Instance != null)
{
CameraShakeNew.Instance.Shake(0.8f);
}
// Calculate direction
Vector3 dir = attacker.transform.forward;
dir.y = 0;
if (dir.sqrMagnitude > 0.001f)
dir.Normalize();
// Apply knockback
health.ApplyKnockback(dir);
// BLOOD EFFECT
Vector3 hitPoint = other.ClosestPoint(transform.position);
if (bloodVFXPrefab != null)
{
GameObject vfx = Instantiate(bloodVFXPrefab, hitPoint, Quaternion.identity);
Vector3 vfxDir = other.transform.position - transform.position;
if (vfxDir.sqrMagnitude > 0.001f)
vfx.transform.forward = vfxDir.normalized;
}
if (AudioManager.Instance != null)
{
AudioManager.Instance.PlaySFX("Hit");
}
}
IEnumerator HitStop(float duration)
{
Time.timeScale = 0f;
yield return new WaitForSecondsRealtime(duration);
Time.timeScale = 1f;
}
}
}