#1 플레이어 기본조작 및 타일부수기 구현 [하우투던전메이크]

신지한·2023년 12월 26일
0

개발일지

목록 보기
5/8
post-thumbnail

📢 개발일지에 앞서서

본 게임개발일지는 본인이 게임개발에 참여한 게임에 대한 얘기이며
게임개발에 느낀점이나 시행착오 등을 기록하기위해 작성된 글입니다
공부해나가는 입장으로서 부족한점이 많아 이해해주시면 감사하겠습니다

🎮 새로운 게임에 대해서

이제 학부 졸업도 한 시점에서 앞으로에 있을 게임사 취업에 대비해
포트폴리오겸 자기계발 하기위해 1인개발 게임을 하나 기획하고 개발하게 되었습니다

게임출시는 팀으로는 해봤지만 기획부터 아트, 프로그래밍의 프로세스를 혼자 담당해보고
전체적인 업무의 프로세스를 혼자 깨닫는 과정이 의미있을거 같아 시작하게 되었습니다

1인개발로 처음 개발하는 게임이라 과정에서 많은 어려움이 있을거같은데
이겨내는 과정에서 제가 좀더 발전할 수 있는 계기가 되지 않을까싶네요

자세한 기획을 문서화한 파일은 아직 없지만 (진행중에 있습니다)
게임에 대해서 조금 말씀드리자면

과거에 플레이 해봤었던 플래시게임 "굴착소년 쿵"이 모티브가 되었습니다

사실 처음부터 모티브를 하려고 계획되었던건 아니였습니다
땅을 파나가는 행위 자체는 비슷했지만 여타 다른게임들과 비슷한 소재이고(테라리아, 마인크래프트 등등..)

게임 제목이 "하우투던전메이크"인데 던전을 플레이어가 되어 플레이하는 게임이 아닌
던전의 그 이면에 던전을 만들어나가는 사람의 시점이 되어 플레이하는 것으로
던전에 필요한 재료(?)들을 모아나가는 과정의 게임입니다

때문에 생각했던 게임의 프로세스는 땅을 파고 땅속에 존재하는 아이템 및 몬스터의 정수를 모아나가는 과정으로 생각했고 몬스터를 직접 타격하는게 아닌 다양한 방식으로 몬스터를 채집해나가는 방식을 생각했습니다

대충 생각했던 방법은 폭탄을 설치한다던가 함정을 설치한다는 등의 방식으로 이루어질거라 생각을 했는데
굴착소년 쿵도 같은 방식으로 (폭탄을 설치) 몬스터를 처치해 나가더라구요?!
굴착소년 쿵을 옛날에 플레이했을 당시에 끝까지 깨본적이 없어서 이걸 예상하지 못했습니다..

어쨌든 본의아니게 모티브가 굴착소년 쿵이 되었는데 기획단계에서 플레이에 좀더 다양성을 둬서 자유도를 높일까 생각중입니다

📜 하우투던전메이크 개발일지

1인개발이라 아트까지 담당한 만큼 컨셉아트 부터 오브젝트 하나하나 찍어내고 있는데 아트가 많이 힘들었습니다
도트로 찍어낼 때마다 저희 팀 아트담당인 친구에게 꽤나 귀찮게 물어보고있는데 물어볼때마다 기막힌 답변을 해줍니다

역시 아트는 신이다

위와 같이 캐릭터 및 타일들을 하나하나 직접 찍어내어 보았습니다

게임 캐릭터의 기본 움직임 애니메이션이랑 모션입니다

맵은 현재 테스트맵으로 제작되었고 아직은 좀 밋밋하지만 나중에 조명효과나
쉐이더를 통해서 좀더 있어보이게? 만들 예정입니다

마우스가 현재 gif 파일에서 보이진 않는데 마우스 오른쪽을 클릭할 시 해당 선택창이 나오고
대표적으로 4가지 기능을 사용가능하도록 만들 예정입니다(아직 임시입니다)

현재 땅파기, 인벤토리, 지도, 두더지(몹정보나 타일정보 알아내는 기능) 정도로 생각해뒀고
해당방식은 다른 게임에도 많이 쓰이곤 하는데
저는 데이즈곤을 플레이하면서 좋다고 생각이 들어서 비슷하게 아이디어를 차용해 봤습니다
데이즈곤 플레이 후기>> https://velog.io/@deliciousqoo/게임후기-Days-Gone

땅파기 기능을 활성화하면 tile에 타겟팅을 할 수 있는데
타겟팅 범위로는 한칸이고 대각선 범위에 있는 블럭은 막혀있지 않아야 타겟팅을 가능하게 해뒀습니다

타겟팅 되는 좌표는 worldToCell로 좌표를 받아와서 레이어 다른층에다가 표시되도록 하였습니다

관련코드입니다

public bool GetCheckTileDistance(Tilemap tilemap, Vector3Int tile1, Vector3Int tile2)
    {
        if(Vector3.Distance(tilemap.GetCellCenterWorld(tile1), tilemap.GetCellCenterWorld(tile2)) == 1f) { return true; }
        else if(Vector3.Distance(tilemap.GetCellCenterWorld(tile1), tilemap.GetCellCenterWorld(tile2)) < 1.5f)
        {
            if(!tilemap.HasTile(new Vector3Int(tile1.x, tile2.y, 0)) || !tilemap.HasTile(new Vector3Int(tile2.x, tile1.y, 0))) {
                return true;
            }
        }

        return false;
    }

tilemap은 현재 월드상에 기본이 되는 타일맵이고
tile1은 현재 상황에선 플레이어가 속해있는 타일로 생각하면 되고 tile2는 지정한 타일입니다

코드에서와 같이 둘사이의 거리가 1일경우(수평 혹은 수직에 위치할경우 worldToCell로 좌표를 받아오기 때문에 거리가 1이 되도록 설정되어있습니다) true(타겟팅 가능)을 반환하도록 하였고

대각선에 위치할 경우 값이 루트2값(대략 1.1414...정도로 나옴)인데 1.5이하일 경우로 지정하였고 tilemap.Hastile()로 타일이 존재하는지의 여부를 체크하는데 좌표를

  • tilemap.HasTile(new Vector3Int(플레이어 x좌표, 대상타일 y좌표, 0)
  • tilemap.HasTile(new Vector3Int(대상타일 x좌표, 플레이어 y좌표, 0)

로 값을 주었습니다
원리는 다음과 같습니다

위에서 설명한거처럼 땅파기 기능을 선택하고 타겟팅된 땅을 선택하면 땅이 파집니다
현재 땅파는 모션과 땅이 부숴질때 이펙트는 구현이 안되었습니다
아마 다음 개발일지때 업데이트 될 예정입니다

땅 타일을 구현하는데 조금 고민을 많이 했던거 같습니다
고려해야할 점이 다음과 같습니다

1. 블럭의 종류마다 체력을 다르게 했어야함
2. 타일 테두리를 어떻게 보이게 하는지

다음은 이를 어떻게 해결했는지에 대함입니다

📌 블럭의 종류마다 체력을 다르게 했어야함

아무래도 tilemap으로 찍어내다보니 타일 개별로 스크립트 컴포넌트를 추가할 수가 없었습니다
관련해서 찾아보다가 유니티에 gridInformation 이라는 기능이 있던데
해당 기능이 제가 원하는 기능인지는 자세히 몰랐고 레퍼런스가 없어서 다른방법을 찾아보다가

타겟팅될때 좌표 얻는거와 마찬가지로 worldToCell로 블럭마다 조ㅘ표를 얻어와서
2차원 배열에 좌표랑 인덱스를 대응시켜서 체력을 각각 설정하였습니다

각각 설정하는건 맵불러올 때 자동으로 설정됩니다

관련코드입니다

private void Start()
    {
        //Tile HP Setting
        for (int i=0;i<=-TM.GetInteractiveMap1().cellBounds.yMin;i++)
        {
            tileHP.Add(new List<int>());
            for (int j = 0; j<TM.GetInteractiveMap1().cellBounds.xMax; j++)
            {
                if(i==0) { tileHP[i].Add(0); }
                else
                {
                    switch (TM.GetInteractiveMap1().GetTile(new Vector3Int(j, -i, 0)).name.Split('_')[0])
                    {
                        case "Soil":
                            tileHP[i].Add(5);
                            break;
                        case "Stone":
                            tileHP[i].Add(8);
                            break;
                        default:
                            tileHP[i].Add(0);
                            break;
                    }
                }
            }
        }
    }

현재 구현된 코드는 Soil과 Stone에 대해서만 체력을 부여하고 있고 (tile이름에서 split한 string 값입니다)
Start할때 동적으로 배열을 생성하면서 체력을 각각 설정합니다

현재까지는 문제없이 동작하지만 추후에 개선의 여지가 있어보입니다

📌 블럭의 종류마다 체력을 다르게 했어야함

타일을 딱 맞게 했을시에 타일을 깼을 때 너무 딱 잘려서 부자연스러운 느낌이 들었습니다
이를 어떻게 해결할까 생각해보았고 타일맵을 2개를 생성한 뒤에 스프라이트를 다음과같이 만들어냈습니다

픽셀퍼를 타일크기에 맞추고 타일맵에 찍어내니까 검은 부분을 제외하고 찍어져서 위의 gif 느낌처럼 낼 수 있었습니다. 타일을 찍어낸다고해서 꼭 해당칸 안에만 찍어내지는게 아니란걸 알 수 있었습니다

무식한 방법일 수 있는데 좀더 좋은 방법이 있다면 댓글 부탁드립니다🙇‍♂️

현재 흙블럭은 체력이 5이고(5번 클릭하면 부서짐) 돌은 8인데 클릭하는게 잘 보이진 않습니다
부서지는 이펙트도 위에 덧씌워서 타일 체력을 5등분 후 지점마다 스프라이트를 변경하도록 하였습니다

타일체력은 후에 아이템이 나옴에 따라 밸런스를 조정할 계획입니다

🔥 개인후기 및 계획

이전에 만들었던 게임이 벡터를 사용하거나 디자인패턴 같은 부분에서 제가 크게 고려하지 않았기에
이번 1인개발 게임을 통해서 많이 공부되었고 또 공부해나갈 예정입니다

데모버전까지 완성하는데 처음엔 3개월정도로 예상했는데
처음에 기획했을때부터 시험기간도 포함되었고 과정에서 디자인패턴 공부의 중요성을 좀 깨달았기에
조금더 천천히 생각해서 4~5개월정도로 예상하고 있습니다

개발과정이 좀더 추가됨에 따라 꾸준히 개발일지를 남기도록 하겠습니다

profile
게임 개발자 지망생

1개의 댓글

comment-user-thumbnail
2024년 3월 15일

개발자가 귀엽고 캐릭터가 대단해요.

답글 달기