ai and player nd health scripts
This commit is contained in:
82
Assets/Scripts/Barrier.cs
Normal file
82
Assets/Scripts/Barrier.cs
Normal file
@@ -0,0 +1,82 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user