1. 공격 스크립트를 만듬 - 플레이어 -> 적 공격 테스트 (성공) - 적 -> 플레이어 공격 테스트 (성공) Todo 1. 카메라 컨트롤러는 이거 방법 아예 따로 찾아야 할거 같음 2. 공격 스크립트 (시도) - 투사체 공격 (시작해야 함) - 공격 관련 무기 스테이터스 같은거 생각해야 함 - 몬스터 AI라던가 설정 또는 이동과 관련된것도 생각해야 함 - 공격 받았을 경우 처리는 어떻게 할건지 고민을 해야 함
101 lines
3.0 KiB
C#
101 lines
3.0 KiB
C#
using System;
|
|
using Unity.VisualScripting;
|
|
using UnityEngine;
|
|
using UnityEngine.AI;
|
|
using EnemyType = Define.EnemyType;
|
|
|
|
|
|
//EnemyController는 몬스터의 '뇌' 역할을 하며, 상태 머신 패턴을 기반으로 동작하고, 외부에서 데이터를 주입받아 초기화되는 구조로 설계하기
|
|
public class EnemyController : MonoBehaviour, IDamageable
|
|
{
|
|
private Damage _damage;
|
|
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>();
|
|
_damage = gameObject.AddComponent<Damage_Melee>();
|
|
_damage._targetlayer = LayerMask.GetMask("Player");
|
|
}
|
|
|
|
void Start()
|
|
{
|
|
}
|
|
|
|
public void Init(EnemyData data)
|
|
{
|
|
_type = data.E_Type;
|
|
|
|
if (_damage != null)
|
|
{
|
|
|
|
_damage.OnHit -= OnBodyHit;
|
|
_damage.OnHit += OnBodyHit;
|
|
}
|
|
}
|
|
|
|
void Update()
|
|
{
|
|
if (CurrentState != null)
|
|
CurrentState.Update();
|
|
_damage?.SetTriggerActive(true);
|
|
}
|
|
|
|
private void OnBodyHit(IDamageable target, Collider collider)
|
|
{
|
|
Debug.Log($"Player Hit! {collider.name}");
|
|
}
|
|
|
|
public void TakeDamage(float damage)
|
|
{
|
|
Debug.Log($"피격! 데미지: {damage}");
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
* 행동 패턴
|
|
* - 종류 : 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 : 플레이어의 시야에서 벗어나면
|
|
*/ |