83 lines
2.2 KiB
C#
83 lines
2.2 KiB
C#
using UnityEngine;
|
|
using UnityEngine.AI;
|
|
|
|
/// <summary>
|
|
/// Attach to any door/window barrier the zombie should break through.
|
|
///
|
|
/// Setup:
|
|
/// - Add a NavMeshObstacle component (Carve = true) so the NavMesh treats it as blocked.
|
|
/// - Assign the barrier's layer to match AIBehaviour.barrierLayer.
|
|
/// - Optionally populate the 'boards' array with child visuals that get hidden as health drops.
|
|
/// </summary>
|
|
public class Barrier : MonoBehaviour
|
|
{
|
|
[Header("Health")]
|
|
public float maxHealth = 100f;
|
|
|
|
[Header("Board Visuals (optional)")]
|
|
[Tooltip("Child objects representing planks/boards. They are hidden progressively as health drops.")]
|
|
public GameObject[] boards;
|
|
|
|
public bool IsDestroyed { get; private set; }
|
|
|
|
private float _health;
|
|
private NavMeshObstacle _obstacle;
|
|
|
|
void Awake()
|
|
{
|
|
_health = maxHealth;
|
|
_obstacle = GetComponent<NavMeshObstacle>();
|
|
}
|
|
|
|
public void TakeDamage(float damage)
|
|
{
|
|
if (IsDestroyed) return;
|
|
|
|
_health -= damage;
|
|
UpdateBoards();
|
|
|
|
if (_health <= 0f)
|
|
Break();
|
|
}
|
|
|
|
void UpdateBoards()
|
|
{
|
|
if (boards == null || boards.Length == 0) return;
|
|
|
|
// Show boards proportional to remaining health
|
|
int boardsToShow = Mathf.CeilToInt((_health / maxHealth) * boards.Length);
|
|
for (int i = 0; i < boards.Length; i++)
|
|
{
|
|
if (boards[i] != null)
|
|
boards[i].SetActive(i < boardsToShow);
|
|
}
|
|
}
|
|
|
|
void Break()
|
|
{
|
|
IsDestroyed = true;
|
|
|
|
// Disable the NavMesh obstacle so pathfinding opens back up
|
|
if (_obstacle != null)
|
|
_obstacle.enabled = false;
|
|
|
|
// Disable colliders so zombies walk through
|
|
foreach (Collider col in GetComponentsInChildren<Collider>())
|
|
col.enabled = false;
|
|
|
|
// Hide visuals
|
|
foreach (GameObject board in boards)
|
|
if (board != null) board.SetActive(false);
|
|
|
|
Destroy(gameObject, 0.1f);
|
|
}
|
|
|
|
#if UNITY_EDITOR
|
|
void OnDrawGizmosSelected()
|
|
{
|
|
Gizmos.color = new Color(1f, 0.5f, 0f, 0.5f);
|
|
Gizmos.DrawWireCube(transform.position, transform.localScale);
|
|
}
|
|
#endif
|
|
}
|