미니 RPG 만들기(7)_몬스터 자동 생성

개발조하·2024년 1월 7일
0

Unity

목록 보기
29/30
post-thumbnail

구현 기능

  • 일정 범위 내에서 Monster의 개수가 유지되도록 Moster 사망 시 자동 생성
  • 일정 범위 내 Monster 생성 위치 랜덤 지정

1. SpawningPool.cs

public class SpawningPool : MonoBehaviour
{
    [SerializeField] int _monsterCount = 0; //실존 몬스터
    [SerializeField] int _reserveCount = 0; //예약한 스폰 몬스터

    [SerializeField] int _keepMonsterCount = 0;

    [SerializeField] Vector3 _spawnPos;
    [SerializeField] float _spawnRadius = 15.0f;
    [SerializeField] float _spawnTime = 5.0f;

    public void AddMonsterCount(int value) { _monsterCount += value; }
    public void SetKeepMonsterCount(int count) { _keepMonsterCount = count; }
    void Start()
    {
        Managers.Game.OnSpawnEvent -= AddMonsterCount;
        Managers.Game.OnSpawnEvent += AddMonsterCount;
    }

    void Update()
    {
        while (_reserveCount + _monsterCount < _keepMonsterCount)
        {
            StartCoroutine("ReserveSpawn");
        }
    }
     
    IEnumerator ReserveSpawn()
    {
        _reserveCount++;
        //스폰 시간 랜덤
        yield return new WaitForSeconds(Random.Range(0, _spawnTime));
        GameObject obj = Managers.Game.Spawn(Define.WorldObject.Monster, "Knight");
        NavMeshAgent nma = obj.GetOrAddComponent<NavMeshAgent>();    

        //스폰 위치 랜덤
        Vector3 randPos;
        while (true)
        {
            Vector3 randDir = Random.insideUnitSphere * Random.Range(0, _spawnRadius);
            randDir.y = 0;
            randPos = _spawnPos + randDir;

            //갈 수 있는 곳인지 확인
            NavMeshPath path = new NavMeshPath();
            if (nma.CalculatePath(randPos, path))
                break;
        }
        obj.transform.position = randPos;
        _reserveCount--;
    }
}

2. GameScene.cs 몬스터 생성 호출

오류 수정

  • PlayerController.cs 플레이어 이동 코드 수정
    monster가 몰려서 player를 공격할 때 클릭으로 player의 위치를 이동시키면 player가 살짝 위로 움직이고 있다.
    이동방향의 y를 0으로 고정하여 위로 움직이지 못하도록 수정.

📄참고자료
[인프런] c#과 유니티로 만드는 MMORPG 게임 개발 시리즈_3. 유니티 엔진

profile
Unity 개발자 취준생의 개발로그, Slow and steady wins the race !

0개의 댓글