using System.Collections; using UnityEngine; using UnityEngine.AI; // AI, 내비게이션 시스템 관련 코드 가져오기 // 좀비 AI 구현 public class Zombie : LivingEntity { public LayerMask whatIsTarget; // 추적 대상 레이어 private LivingEntity targetEntity; // 추적 대상 private NavMeshAgent navMeshAgent; // 경로 계산 AI 에이전트 public ParticleSystem hitEffect; // 피격 시 재생할 파티클 효과 public AudioClip deathSound; // 사망 시 재생할 소리 public AudioClip hitSound; // 피격 시 재생할 소리 private Animator zombieAnimator; // 애니메이터 컴포넌트 private AudioSource zombieAudioPlayer; // 오디오 소스 컴포넌트 private Renderer zombieRenderer; // 렌더러 컴포넌트 public float damage = 20f; // 공격력 public float timeBetAttack = 0.5f; // 공격 간격 private float lastAttackTime; // 마지막 공격 시점 // 추적할 대상이 존재하는지 알려주는 프로퍼티 private bool hasTarget { get { // 추적할 대상이 존재하고, 대상이 사망하지 않았다면 true if (targetEntity != null && !targetEntity.dead) { return true; } // 그렇지 않다면 false return false; } } private void Awake() { // 초기화 } // 좀비 AI의 초기 스펙을 결정하는 셋업 메서드 public void Setup(ZombieData zombieData) { } private void Start() { // 게임 오브젝트 활성화와 동시에 AI의 추적 루틴 시작 StartCoroutine(UpdatePath()); } private void Update() { // 추적 대상의 존재 여부에 따라 다른 애니메이션 재생 zombieAnimator.SetBool("HasTarget", hasTarget); } // 주기적으로 추적할 대상의 위치를 찾아 경로 갱신 private IEnumerator UpdatePath() { // 살아 있는 동안 무한 루프 while (!dead) { // 0.25초 주기로 처리 반복 yield return new WaitForSeconds(0.25f); } } // 데미지를 입었을 때 실행할 처리 public override void OnDamage(float damage, Vector3 hitPoint, Vector3 hitNormal) { // LivingEntity의 OnDamage()를 실행하여 데미지 적용 base.OnDamage(damage, hitPoint, hitNormal); } // 사망 처리 public override void Die() { // LivingEntity의 Die()를 실행하여 기본 사망 처리 실행 base.Die(); } private void OnTriggerStay(Collider other) { // 트리거 충돌한 상대방 게임 오브젝트가 추적 대상이라면 공격 실행 } }