GYALLERHORN / A07_RoguelikeProject

1 stars 1 forks source link

Enemy관련 클래스 설명 #21

Open kksoo0131 opened 11 months ago

kksoo0131 commented 11 months ago

EnemyManager

UIManager를 참고해서 만들었음 eMonsterName에 몬스터이름을 등록하면

EnemyManager의 생성자에서 리소스를 로드하고 Dictionary에 저장

여러가지 버젼의 SpawnMonster를 준비 하긴했는데 정확히 어떤게 필요할지? 잘모르겠습니다..

//몬스터를 해당위치에 생성
SpawnMonster(eMonsterName type, Vector2 spawnPoint) 
SpawnMonster(eMonsterName type, Vector2 spawnPoint, int spawnNum)

// 몬스터 종류 배열을 받아서, 위치 배열중 한곳에 생성
SpawnMonster(eMonsterName[] typeArray, Vector2[] spawnPoints)
SpawnMonster(eMonsterName[] typeArray, Vector2[] spawnPoints, int spawnNum)

EnemyBehaviourController

Enemy의 모든 동작들은 전략 패턴을 따라 하나의 전략으로 정의했고, EnemyBebaviour를 상속받고 IBehaviour 인터페이스를 구현한다.

EnemyBehaviourController는 전략들을 한번에 모아서 관리하는 클래스 Enemy들은 프리펩으로 준비되어 있음

오브젝트가 가진 모든 전략중 하나를 선택해서 실행함

using System.Collections.Generic;
using UnityEngine;
using static UnityEngine.InputSystem.OnScreen.OnScreenStick;

public class EnemyBehaviourController : MonoBehaviour
{
    [SerializeField] public IBehaviour CurrentBehaviour { get; set; }
    public Queue<IBehaviour> BehaviourQueue { get; private set; }

    private void Start()
    {
        BehaviourQueue = new Queue<IBehaviour>();

        foreach(IBehaviour behaviour in GetComponents<IBehaviour>())
        {
            BehaviourQueue.Enqueue(behaviour);
        }
    }
    private void Update()
    {
        BehaviourUpdate();
        CurrentBehaviour?.OnAction();
    }

    // Action
    private void BehaviourUpdate()
    {
        Queue<IBehaviour> tempQueue = new Queue<IBehaviour>();

        while(BehaviourQueue.Count > 0) 
        {
            IBehaviour behaviour = BehaviourQueue.Dequeue();

            switch (behaviour.State)
            {
                case StrategyState.Rest:
                    behaviour.OnRest();
                    break;
                case StrategyState.Ready:
                    break;
                case StrategyState.Action:
                    break;
                case StrategyState.CoolTime:
                    behaviour.OnCoolTime();
                    break;
                default:
                    break;
            }

            tempQueue.Enqueue(behaviour);
        }
        BehaviourQueue = tempQueue;
    }
}

Start()

현재 오브젝트에 붙어있는 IBehaviour를 모두 BehaviourQueue로 가져온다.

Update()

Queue를 순회하면서 Behaviour들의 상태에 따라서 메서드를 실행해서 Behaviour들의 상태가 변화되고, 최종적으로 선택되어있는 CurrentBehaviour의 OnAction() 메서드로 행동을 실행시킨다.

IBehaviour

public enum StrategyState // 전략들의 상태를 나타냄
{
    Rest, // 대기 상태 ( 행동에 대한 조건을 체크) 
    Ready,// 조건을 만족한 상태 현재 오브젝트의 상태를 확인하고 실행할 수 있는지 확인.
    Action,// 대기열에 들어간 상태
    CoolTime, // 쿨타임

}
public enum StratgeyType // 전략의 타입을 나타냄
{
    Move,
    Hurt,
    Attack,
    Skill,
    Dead,
    EndPoint,
}
public interface IBehaviour
{
    StrategyState State { get; set; } //전략의 상태
    StratgeyType Type { get;} // 전략의 타입
    void OnRest(); // Rest상태일때 실행되는 메서드, 전략의 조건부
    void OnAction(); // CurrentBehaviour로 선택됬다면 실행되는 메서드, 전략의 실행부
    void OffAction(); // 전략이 종료될떄 실행되는 메서드
    void OnCoolTime(); // 전략이 CoolTime 상태일때 실행되는 메서드, 쿨타임이 끝나면 Rest상태가된다.
}