Practice_Unity/Assets/Scripts/Controllers/EnemyController.cs
Seonkyu.kim ccc9d46df7 작업
1. 이동시 Rigdoby와 Nav 충돌나는거 수정
2. 데이터 매니저에서 데이터 받아오는것에 대한 방식을 대폭 수정
3. 스폰 컨트롤러 방식 조금 수정
4. 벽과 플레이어 캐릭터 충돌시 미끄러지는 기능 추가(다른 오브젝트와는 테스트 안해 봄)

- 캐릭터 컨트롤러에 스테이터스 하는거 손 봐야 함
2025-09-25 18:00:21 +09:00

80 lines
2.6 KiB
C#

using System;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.AI;
using EnemyType = Define.EnemyType;
//EnemyController는 몬스터의 '뇌' 역할을 하며, 상태 머신 패턴을 기반으로 동작하고, 외부에서 데이터를 주입받아 초기화되는 구조로 설계하기
public class EnemyController : MonoBehaviour
{
private Movement_Base _movement;
private Status _status;
[SerializeField] private EnemyType _type = EnemyType.Unknown;
public Movement_Base Movement => _movement;
public Status Status => _status;
public EnemyType Type => _type;
private AI_State _currentState;
public AI_State CurrentState
{
get { return _currentState; }
set
{
if (_currentState != null)
_currentState.Exit();
_currentState = value;
if (_currentState != null)
_currentState.Enter();
}
}
private void Awake()
{
_movement = gameObject.GetComponent<Movement_Base>();
_status = gameObject.GetComponent<Status_Enemy>();
}
void Start()
{
}
public void Init(EnemyData data)
{
_type = data.E_Type;
// if(_status is Status_Enemy statusEnemy && data.status != null)
// statusEnemy.Init(data.status);
}
void Update()
{
if (CurrentState != null)
CurrentState.Update();
}
}
/*
* 행동 패턴
* - 종류 : Idle(대기), Patrol(순찰), Chase(추적), Run(도망), Return(귀환), Hide(숨기), Fight(싸우기)
* 1. Idle : 제자리에서 대기
* 2. Patrol : 지정된 경로를 따라 순찰
* 3. Chase : 플레이어를 발견하면 추적
* 4. Run : (옵션) 체력이 너무 낮으면 도망
* 5. Return : 일정 시간 동안 플레이어를 찾지 못하면 원래 위치로 귀환
* 6. Hide : 플레이어의 시야에서 벗어나 숨기
* 7. Fight : 플레이어와 일정 거리 내에 들어오면 싸우기
* - 행동 전환
* 1. Idle -> Patrol : 일정 시간 후
* 2. Idle/Patrol -> Chase : 플레이어 발견 시
* 2.1. 플레이어 발견 조건 : 시야각, 거리, 장애물 유무 등
* 3. Idle/Patrol/Chase -> Run : (옵션) 체력이 일정 이하로 떨어지면
* 4. Idle/Patrol/Chase/Run -> Fight : 플레이어와 일정 거리 내에 들어오면
* 5. Patrol -> Idle : 일정 시간 동안 움직이지 않으면
* 6. Patrol/Chase/Run/Fight -> Return : 플레이어를 일정 시간 동안 찾지 못하면
* 7. Patrol/Chase/Run/Fight -> Hide : 플레이어의 시야에서 벗어나면
*/