[게임 개발] Tiny 2D RPG: 6 - 캐릭터 소환

이정석·2023년 10월 24일

Tiny 2D RPG

목록 보기
6/9

Tiny 2D RPG

📖 이전까지 진행한 내용에서 캐릭터는 빈 Scene에 고정되어 있어야 한다.

위의 사진은 게임을 실행하기 전 캐릭터가 빈 Scene에 존재하는 사진이고 아래 사진이 게임을 실행했을 때 Background와 Map이 생성된 모습이다.

이번에 구현할 내용은 캐릭터도 Background와 Map과 같이 Scene에 없는 상태에서 '캐릭터를 자동 소환' 하는 기능이다.

1. Object Manager

💻 [Map 템플릿 (3)]에서 Secene의 Map 관리를 위한 Manager를 구현한 적이 있었는데, 이번에는 Object Manager라는 Manager를 만들어 'Scene에 존재하는 모든 Object들을 관리'하는 Manager를 만들어 게임이 실행되면 캐릭터를 생성하도록 할 예정이다.

Object Manager의 기본 뼈대는 아래 코드와 같은데 기본적으로 Scene의 GameObject를 추적할 Dictionary와 편의를 위해 메인캐릭터를 위한 MyPlayer 내부변수를 두었다.

public class ObjectManager
{
    public MyPlayerController MyPlayer { get; set; }
    Dictionary<int, GameObject> _objects = new Dictionary<int, GameObject>();

    public void Add(bool isPlayer = true)
    {
        if (MyPlayer != null)
            return;

        if (isPlayer)
        {
            // 플레이어
            
        }
        else
        {
            // 몬스터
            
        }
    }
}

캐릭터를 소환하기 위한 함수로 Add 함수를 사용하는데 매개변수로는 일단 isPlayer라는 플레이어인지를 나타내는 변수를 받는다.

isPlayer변수를 둔 이유는 이후에 Object Manager를 몬스터 소환에도 이용할 예정이기 때문에 몬스터를 위한 설계를 간단하게 반영하였고 구현한 코드는 아래와 같다.

public class ObjectManager
{
    public MyPlayerController MyPlayer { get; set; }
    Dictionary<int, GameObject> _objects = new Dictionary<int, GameObject>();

    public void Add(bool isPlayer = true)
    {
        if (MyPlayer != null)
            return;

        if (isPlayer)
        {
            // 플레이어
            GameObject go = Managers.Resource.Instantiate("Creature/Player");
            go.name = "Player";
            _objects.Add(1, go);

            // TODO: ID 고정값 변경
            MyPlayer = go.GetComponent<MyPlayerController>();
            MyPlayer.ID = 1;
            // 캐릭터 정보 설정
            // TODO?: 플레이어 위치를 Manager에서 직접 설정?
            MyPlayer.transform.position = Vector3.zero;
        }
        else
        {
            // 몬스터
        }
    }
}

플레이어 부분을 구현하면서 고려한 부분은 총 두가지이다.

  1. 고정값
  2. 플레이어 위치 설정

'고정값'은 Object의 식별을 위한 ID나 Object Name과 같은 내용을 임시로 고정된 데이터로 설정해 두었는데 지금은 싱글 플레이를 기준으로 하기 때문에 1Player로 ID와 이름을 설정해 두었다.

이후에 간단한 서버를 붙이면서 패킷으로 받은 플레이어 데이터 중 하나로 ID와 Name을 설정하는 방식으로 변경해야할 사항 중 하나이다.

'플레이어 위치 설정'에 대한 내용도 잠깐 고민했었는데 'Object Manager가 플레이어의 transform에 직접 접근하는 것이 맞을까?' 에 대한 의문점이 들었다.

위의 코드는 직접 Object Manager가 Player의 position을 변경하는 구조이고 직접 변경하는 구조 대신 Player에게 위치정보를 전달하고 '전달한 위치 정보로 스스로 position을 변경'하는 구조도 사용가능할 것이다.


결과

캐릭터 소환 기능을 테스트하기 위해 기존에 Scene에 있던 Player prefab를 삭제해주었다.

게임 실행 직후 배경과 맵이 생성되었고 설정된 위치에 캐릭터가 소환되는 것을 확인할 수 있다.

이전에 구현한 중력과 이동 및 점프를 테스트해보았고 정상적으로 잘 작동한다!

이후에는 이번에 구현한 Object Manager를 이용해 몬스터를 구현할 예정이다. 몬스터에 사용할 에셋도 시간날 때마다 찾아보아야 할 것 같다.

profile
게임 개발자가 되고 싶은 한 소?년

0개의 댓글