유니티 개발 현황 #2까지 쓰고 신경을 못 써버린 게임인 Danma가 완성되었습니다.

Danma를 개발하면서 많은 게임 알고리즘 기법들을 공부하고 발전할 수 있는 계기가 되었던 것 같아 좋았습니다.

Danma는 4월 15일에 열리는 한국애니메이션고등학교 2022 게임박람회에 출품할 예정이라 빌드 파일 역시 4월 15일에 올려보도록 하겠습니다.

메인화면

Danma는 기본적으로 리듬, 탄막 게임입니다.

'Just Shape and Beats'와 '로스트아크' 라는 게임에서 영감을 얻어 제작하게 되었으며 2스테이지 구성으로 되어있습니다. 게임의 흐름은 일반스테이지 - 보스스테이지로 구성이 되어있으며 일반스테이지에서는 조작법을 익히고 이 게임의 특징 중 하나인 기믹을 인지할 수 있도록 설계를 해보았으나 의도대로 잘 되었을진 모르겠습니다.

 

첫번째 스테이지

첫번째 스테이지는 소행성지대라는 컨셉을 갖고 만들어진 스테이지입니다.

소행성지대라는 컨셉에 걸맞게 운석이 떠다니며 여러분들은 그 운석을 피하셔야 합니다.

이때 분홍색으로 강조된 운석은 파괴하지 않으면 게임의 난이도를 상승시켜주는 커다란 운석이 나타나게 됩니다.

하지만 보통 플레이어는 특정한 오브젝트는 파괴할 수 있다는 사실을 모를 것이기 때문에 약간의 힌트를 주기 위하여

분홍색 운석을 파괴하지 않고 넘어갔을 때 빨간색 파티클이 뜨게 하였고, 튜토리얼에서도 특정한 오브젝트는 파괴할 수 있다고 언급을 하였습니다. 이를 통하여 플레이어는 다음스테이지에서도 이러한 '기믹'을 의식하도록 만들었습니다.

 

두번째 스테이지

두번째 스테이지는 본격적으로 보스와 싸우는 스테이지입니다. 2개의 스테이지로밖에 구성이 안되어있었기 때문에 난이도 부분을 통하여 플레이 타임을 늘리려 했습니다. 하지만 가능성이 안보일정도로 높을 경우에는 게임의 흥미를 잃을 수 있기에 난이도 조절에서 많은 시행착오가 있었습니다. 보스 스테이지에서는 1스테이지에서 경험했던 '기믹' 패턴과 탄막 패턴을 적절하게 섞었습니다. 이 방식으로 마치 로스트아크의 '선발대' 라는 개념처럼 플레이어가 여러번의 트라이를 통해 본인만의 공략법을 만들어 나가도록 게임을 설계했습니다. 파훼를 못하면 즉사하는 기믹도 있으나 여러 오브젝트로 힌트를 주어서 플레이어가 그 힌트들로 상황을 판단하여 기믹을 깰 수 있도록 만들었으나 다른 친구들에게 테스트해본 결과 생각보다 피하는데에만 집중을 하고 있어서 아쉬웠습니다.

 

아쉬웠던 점

기본적으로 모든 에셋들이 대부분 아트 1명이 디자인한 오브젝트와 디자인에 무지한 제가 제작한 몇몇개의 오브젝트로 이루어져있어 넣을 수 있는 애니메이션에 한계가 있었습니다. 그렇기에 게임이 약간 단조로워 보일 수 있다는 생각이 들었습니다. 또한 장기간에 걸쳐 제작된 프로젝트이기에 초반에 제작한 스테이지 선택 화면에서 개선해야 할 부분이 생겼을 때 더럽게 짠 코드로 수정하는데 힘들었던 경험이 있었습니다. 그리고 스테이지가 2개밖에 안된다는 점에서 난이도로 플레이타임을 억지로 늘릴 수 밖에 없었기에 자칫하면 난이도 문제로 흥미를 잃을 수 있겠다는 생각이 들었습니다.

 

느낀 점

유니티를 이용하여 처음으로 제작한 제대로 된 게임이라는 점에서 의의를 두고 싶습니다. 최대한 게임을 재미있게 만들기 위해서 여러 게임알고리즘과 기법들을 공부하면서 많은 지식을 얻어갈 수 있었습니다.

빌드파일은 4월 15일날 올리도록 하겠습니다. 긴 글 읽어주셔서 감사합니다.

구현한 것

플레이어에 대쉬 기능을 추가하였다. 밋밋해보이지 않기 위해 약간의 파티클도 넣어줬다.

베지어 곡선을 이용하여 운석 움직임을 구현하였고 약간의 기믹을 추가하여 만약 분홍색 운석을 파괴를 하지 못할 시 왼쪽에 빨간 이펙트와 함께 위에서 거대한 운석이 출현하도록 해보았다.

 

느낀점

베지어 곡선을 이해하는데 약간은 힘들었지만 만족스러운 결과물이 나온 것 같아서 기분이 좋았다.

파티클을 배우면서 다양한 방면에서 활용할 수 있었고 게임의 완성도도 높아진 것 같았다.

 

개선할 점

작은 운석의 무작위성과 속도가 너무 빠르다는 점에서 난이도가 너무 어려울 수 있겠다는 생각이 들었다. 운석의 속도를 적당한 난이도에 맞출 예정이다.

스테이지 길이가 1분 32초에 비해 패턴이 단순 반복 패턴이기에 지루할 수 있다. 패턴을 조금 더 추가할 예정이다.

플레이어의 움직임이 딱딱하기 때문에 약간의 애니메이션을 줘서 자연스럽게 만들 예정이다.

'유니티 개발' 카테고리의 다른 글

Danma 완성  (1) 2022.04.05
유니티 개발 현황 ( 탄막 패턴, 버그 )  (0) 2022.01.30
Object Pooling (오브젝트 풀링)  (0) 2022.01.24
2022년 01월 03일 Unity 개인 공부 1일차  (0) 2022.01.03

원이 화면 밖에서 안으로 들어온 뒤 탄막을 쏘고 사라진다.

이 역시 탄막에도 적용했던 오브젝트 풀링을 이용하여 더 효율적으로 만들었다.

하지만 Object Pooling 시스템에 하자가 있는 것 같다.

플레이어가 갑자기 총을 쏘던 도중에 총알은 안 나가고 체력을 닳길래 콜라이더를 꺼봤더니 갑자기 적 탄막을 쏘고 있었다. Object Pooler 파일에는 분명 tag로 분류하여 시스템을 만들고 있는데 충돌이 일어난 것 같다.

심지어 가끔 플레이어 총알이 랜덤으로 다시 나타날 때도 있다. 내일 다시 오류를 고쳐봐야 할 것 같다.

'유니티 개발' 카테고리의 다른 글

Danma 완성  (1) 2022.04.05
유니티 개발 현황 #2  (0) 2022.02.19
Object Pooling (오브젝트 풀링)  (0) 2022.01.24
2022년 01월 03일 Unity 개인 공부 1일차  (0) 2022.01.03

유니티에서 생성과 파괴는 생각보다 무거운 작업이다. 그래서 많은 오브젝트를 빠르게 생성할수록 프로그램은 부하가 걸릴 것이다. 그래서 사용하는 것이 Object Pooling이다.

Object Pooling은 미리 오브젝트를 게임 시작할 때에 만들어두고 필요할 때마다 미리 만들어 두었던 오브젝트를 가져와 사용하는 기법이다.

 

https://notminseodevelop.tistory.com/7?category=901556 

 

2022년 01월 03일 Unity 개인 공부 1일차

구현한 것 - GetAxisRow 함수를 이용하여 플레이어 이동 구현 - 탄젠트 성질을 이용하여 Bullet이 생성될 때 마우스 포인터의 위치를 바라보도록 각도 지정 - CameraShake 기능을 구현하여 총알을 발사할

notminseodevelop.tistory.com

저번 글에서 총알 발사를 구현할 때 나는 총알을 생성하고 1초뒤에 파괴하는 식으로 구현을 했었다.

이것을 Object Pooling 기법을 이용해 조금 더 효율적으로 프로그램을 짜 보도록 하겠다.

 

전체적인 프로그래밍은 https://youtu.be/tdSmKaJvCoA 이 영상을 참고하여 만들었다.

 

그렇게 해서 만들어진 오브젝트 풀링 시스템이다.

Pool이라는 클래스를 어떤 오브젝트인지 구분해주는 tag와 생성할 오브젝트를 저장하는 prefab 그리고 처음 생성할 때 총 몇 개를 생성할 것인지 저장하는 size 총 3개의 변수가 구성되도록 만들었다.

 

List를 public으로 생성하면 인스펙터 창에서 이런식으로 직접 생성을 할 수 있다.

Start()에서는 이런식으로 저장된 List들을 모두 불러와 tag별로 Queue를 만들어 저장하는 작업을 진행해준다.

SpawnFromPool()에서는 매개변수로 무슨 오브젝트인지 구별해주는 tag, 어느 위치에 어느 방향으로 생성할 것인지를 받는다. 처음에 예외처리로 tag가 존재하는지 확인하고 만약 내가 준비해둔 오브젝트들을 다 썼을 때 추가로 생성하는 코드를 짰다. 그 이후로 아까 Queue에 저장돼있던 오브젝트를 꺼내와서 매개변수로 받아온 위치와 방향으로 설정해 생성해준다.

InputToPool()은 총알처럼 특정 조건이 되면 사라져야하는 오브젝트를 구현할 때 사용하는 함수로 다시 Queue에 함수를 넣고 지워준다.

총알을 예시로 Object Pooler 시스템을 사용하는 예시 코드를 보여주겠다.

총알 생성 코드
총알 삭제 코드

16~21번째 줄 코드처럼 생성하면 어떤 파일에서든지 GetComponent<>()를 사용하지 않고도 한 줄로 쉽게 접근할 수 있다. 이와 관련된 내용을 싱글톤 패턴이라고 하는데 찾아보면 도움이 많이 된다.

그렇게 해서 조금더 효율적으로 수정된 게임의 결과물이다.

총알 10개가 게임 시작과 동시에 생성
준비된 오브젝트가 부족할 때 추가되는 총알들

느낀 점

이런 기법들을 배울 때마다 어떻게 사람들은 이렇게 창의적인 생각을 할 수 있는 거지라고 감탄을 금치 못한다.

이런 기법들을 배우고 실제로 내 게임에 활용할 때 꾸준히 개발을 할 수 있게 해주는 '재미'를 느끼게 된다.

앞으로도 조금 더 효율적이고 재미있는 게임을 만들기 위해 더 노력해야겠다.

'유니티 개발' 카테고리의 다른 글

Danma 완성  (1) 2022.04.05
유니티 개발 현황 #2  (0) 2022.02.19
유니티 개발 현황 ( 탄막 패턴, 버그 )  (0) 2022.01.30
2022년 01월 03일 Unity 개인 공부 1일차  (0) 2022.01.03

구현한 것
- GetAxisRow 함수를 이용하여 플레이어 이동 구현
- 탄젠트 성질을 이용하여 Bullet이 생성될 때 마우스 포인터의 위치를 바라보도록 각도 지정
- CameraShake 기능을 구현하여 총알을 발사할 때 타격감 조성
- AudioSource 기능을 이용하여 총알 발사 음 구현
- 마우스 클릭 지속 혹은 연타하더라도 일정한 간격으로 총알이 발사되도록 조정
- 메모리 누수를 막기 위해 총알이 생성된 기점으로 1초가 지나면 제거되도록 설정

'유니티 개발' 카테고리의 다른 글

Danma 완성  (1) 2022.04.05
유니티 개발 현황 #2  (0) 2022.02.19
유니티 개발 현황 ( 탄막 패턴, 버그 )  (0) 2022.01.30
Object Pooling (오브젝트 풀링)  (0) 2022.01.24

+ Recent posts