Unity 스터디 3회차 - 씬 전환과 활용, 팀프로젝트의 시작

Lee Joon Woo·2021년 1월 13일
0

3회차 같은 경우에는 스터디원들의 사정이있어서 원래 진행하는 요일인 월요일이 아닌 1월 6일에 진행되었다. 새해가 시작되면서 더욱 더 열심히 해야하는데 오히려 반대로 놀아버려서 이제서야 게시물을 쓰는 제가 한심하네요...

이번 회차에서는 프로젝트에 앞서서 지금까지 배운 것들을 최대한 활용하여 아무거나 만들어서 빌드해보는 시간이었다. 저는 앞선 회차에서 말했듯이 씬전환과 해보고 싶던 기능들을 몇개 학습해서 시도하려고 노력해보았다.

연습해보고자 하는 기능들의 리스트

  1. 씬 전환법
  2. UI 및 버튼 사용법
  3. 카메라 가지고 놀기
  4. Anima2D 써보기
  5. 3D 간단하게 해보기.
  6. 디스코드 연동하여 프로필에 게임중 상태 보이기
  7. 사운드 붙이기
  8. 파일 데이터 읽어오기
  9. 이펙트 사용
  10. 소켓을 이용한 트위치 IRL과의 연동
  11. UNet 혹은 Photon을 이용한 네트워크 플레이 환경 구축

씬 전환을 이용해서 하나의 프로그램을 만들어야 하니, 구상한 씬들은 아래와 같다.

  1. 게임시작화면 - UGUI 활용
  2. Day2-2 재활용 + Anima2D 적용한 씬 + 사운드
  3. 리듬게임
  4. 마우스를 활용한 2D 디펜스 시뮬레이션
  5. 3D 1인칭 시점 + 상단에서 바라보는 미니맵 추가
  6. 3D 3인칭과 2D를 왔다갔다하는 복합적인 씬
  7. 게임종료

결과론적으로 적자면, 0,3,5는 공부를 더 해야한다는 귀차니즘에 빠져서 못만들었고, 필요가 없어 보여서 6번도 만들지 않았다.

첫 씬 - 탑다운 2D 스타일 화면

지난주에 만들었던 Day2에서 달라진것은 크게 없다.
박스를 미는 모션을 추가하였고, 타격음추가, 그리고 타격 이펙트를 추가해보았다.

미는 모션 추가

사용하던 에셋에 부위별로 스프라이트를 나누어놓은 파일들이 있었으므로, Anima2D를 시도해볼겸 Bone을 만들어서 아래와 같이 구성해보았다.

이를 가지고 열심히 끄적인 결과 미는 모션을 Inverse Kinematics를 이용해서 그럴싸하게 만들어놓았는데, 여기서 문제가 발생한다.
다른 모션들(아이들, 공격, 이동)은 단일 스프라이트 애니메이션을 이용하여 출력되는 반면에, 미는 모션만 유일하게 몸 부위들별로 스프라이트를 여러개 생성하여 보여준다는 것이었다. 이를 둘다 이어주기 위해서는 미는 모션이 시작될때 Player 자체의 Sprite Renderer를 Disable 시켜주고, 몸 부위들을 한번에 Disable 시켜준다. 반대로 다른 모션들이 시작될 때는 Player의 Sprite Renderer를 Enable시켜주고 몸 부위 스프라이트들을 Disable 시켜준다. 이것으로 해결을 하긴 했는데, 프로그래머의 입장에서는 매우 만족스럽지 못한 결과다. 다음부터는 한쪽으로 통일을 시키는 것이 애니메이터의 입장에서 편할것이라고 여겨진다.

타격음 및 타격 이펙트 추가

타격음 같은 경우에는 찾아보니 그렇게 복잡한게 아니였다. 단순히 AudioSource 컴포넌트를 만들어놓고 Play를 실행해주니 소리가 나오길래 단순한 함수를 만들어서 타격 충돌처리에서 사운드를 재생시켜주었다. 이펙트 같은 경우에도 파티클을 공부해보려 했으나, 애니메이션쪽에 지식이 너무 없어서 이해가 잘 되지 않았고, 결국에 그냥 에셋 스토어에서 가져온 이펙트 프리팹을 instantiate 하는것으로 해결해버렸다. 매우 아쉬운 결과고, 시간이 날 때 다시 한번 공부하고 싶다.

2번씬 - 리듬게임씬

리듬게임의 경우에는 아무래도, 제가 주력게임 장르가 리듬게임이다보니 어떻게 구현해야하나에 대한 생각은 머릿속에 많았지만, 막상 해보니 뜻대로 되던게 거의 없어서 매우 슬픈 결과물이 나왔습니다.
건반형 리듬게임을 심플하게 만들어보려고 하였고, 최대한 심플하게 만들려다보니 2가지 프리팹의 충돌처리를 이용해서 대부분의 처리를 하려고 시도하였다.

건반 프리팹

위의 보라색부분이 판정선라인인데, 판정선 안의 초록색 얇은 선이 실제 충돌을 담당하는 Edge Collider 2D이다. 이 Collider를 키에 맞는 버튼을 누르면 짧은 시간동안 활성화 되도록 하여 처리하였다. BoxCollider가 아닌 EdgeCollider를 사용하는 이유는 판정범위가 모호해지는 것을 막기위해서 y값을 고정시킨것이다.

노트 프리팹

한 개의 노트는 위와 같이 구성되어있다. 실제로 보이는 노트 부분은 Note 안의 Sprite Renderer로 들어가있고, 총 5개의 Box Collider 2D로 구성되어있다. 가장 안쪽은 Perfect, 점점 바깥으로 나갈수록 Great, Bad가 된다. 충돌처리의 위의 건반 판정선에서 Trigger로써 처리를 해주고, 5개의 Collider중 어디든 충돌되면 본인의 부모를 삭제하여 전체가 삭제되도록 만들었다. Collider들의 이름을 굳이 똑같게 만든 이유는 판정을 보다 편하게 화면에 출력하기 위함이다.

채보 파일 및 노트 출력

실제로 채보를 편하게 짜려면, 일일이 파일로 나누어서 형식대로 출력해야하니 간단하게 구성해서 만들어보았다. 모든 노트는 (레인번호) (y위치)로 나누어져서, 게임이 시작될때 해당 파일을 StreamReader로부터 읽어서 각각의 위치에 배치를 시켜준 다음에 노래를 재생한다. 노래는 싱크가 안맞을 수 있으니, PlayDelayed를 활용하여 시간을 조절시켜서 해결시켜준다.
아래는 리듬게임 씬의 간단한 실행 예시입니다.

추가적인 응용방법

최근에 나오는 Unity리듬게임들은 모바일 게임들이 많다보니, 공간을 좀더 활용하기 위해서 3D처럼보이게 해서 노트가 좀 더 많이 보일 수 있도록 구성되어있다. 간단하게 카메라 위치만 바꾼다면 해당 효과를 유사하게 맛볼수도 있다. 카메라를 Perspective로 바꾼뒤에 조금만 조절하니 그럴싸하게 결과가 나온다. 다만 애초부터 이렇게 할 생각은 없었으니, 스프라이트의 앞뒤 순서가 약간 뒤죽박죽이 되버렸다.

마지막 3D 씬

이 씬에서는 사실 3D학습을 많이하지 않아서 활용부분에서는 많이 떨어지지만, 카메라를 만지작거리다가 알게된 미니맵구현방식을 한번 적용시켜보고 싶어서 만들게 된 씬이다.
일반적인 3D의 카메라말고도, 위에서 내려다보는 직교투영의 카메라를 하나 더 추가하고, 이를 RenderTexture로 출력하여 그 텍스처를 RawImages로 UI에다가 띄우면 깔끔한 미니맵하나가 만들어진다.

다만 미니맵에서 캐릭터도 흰색이면 잘 보이지 않게되니까, 공부하면서 배운 Culling Mask의 기능을 활용해보았다. Culling Mask는 특정 레이어의 오브젝트들은 보이지 않게 하는 기능을 가지고있다. 그렇게 하기 위해서 캐릭터 오브젝트는 User Layer로, 미니맵에서 빨갛게 보이기위한 구는 Minimap이라는 Layer를 주고, 캐릭터를 보는 카메라에서는 User만 활성화, 미니맵카메라에서는 Minimap만 활성화를 시켜주면 우리가 원하는 결과가 나오게된다.

씬 전환법

씬 전환은 찾아보니, 단순하게 Build Settings에서 Scene 번호를 지정해준 뒤에 UnityEngine.SceneManagement에서 SceneManager.LoadScene(씬번호)를 실행시켜주면 바로 전환이 되는 것이었다.
UI의 버튼에다가 해당 함수를 만들어서 할당해준 뒤에 간단하게 화면전환이 일어나도록 구현하였다.

개인학습의 1차 종료

여기까지가 개인적으로 빠르게 유니티를 학습시켜본 최종 결과이다. 앞으로는 프로젝트 위주로 진행을 하게될 것이며, 해당 프로젝트를 진행하면서 필요한 자료들과 공부 또한 아마 포스팅이 될 것 같다.
적었지만 적용을 못한 디펜스류 게임, 디스코드 연동, 소켓프로그래밍 트위치 연동, 그리고 UNet은 시간이 되면 짬을 내서 만들어볼 생각이다. 트위치 IRL은 전에 Node.js로 반년 전에 만든것이 있는데 이것도 한번 포스팅을 해볼 생각이다.

깃허브 자료 : https://github.com/Linked-List/UnityStudy/tree/main/Day_3
빌드된 실행 자료 : https://github.com/Linked-List/UnityStudy/tree/main/Day_3_Build

프로젝트 회의

스터디 시간에 모여서 했던 마지막 작업은 새로운 게임의 구상이었다.
처음 정한것은 장르였다. 팀원들간에 나온의견은 퍼즐게임과 로그라이트 게임이였다.
퍼즐은 구현이 쉽고, 우리의 수준에서 무난하게 구현이 가능하다는 의견에서 나왔고,
로그라이트는 타 액션게임들에 비해서, 반복적인 요소가 많기 때문에 그래픽작업보다는 랜덤알고리즘의 구성, 그리고 다양한 시도가 가능하다는 점에서 나왔다.
결과적으로 팀원이 5명이기 때문에 5명이서 퍼즐게임을 만들기에는 상당히 식상하게 끝날것 같아서 로그라이트로 결정되었다.

게임진행방식은 스터디에 앞서서 로그라이트 게임을 안해본 사람들을 위해서 자료를 소개시켜주었는데, '데드셀'이라는 게임이 팀원들의 주목을 받아서 2D 플랫포머 스타일로 결정되었다.

다른 로그라이트 게임들과 같이 플레이 스타일의 차별성을 주기위해서 이번에 만드는 게임에서는 직업 클래스 개념을 도입하여 클래스에 따른 다른 플레이 스타일을 주기로 하였다. 이때 강조한 것은 클래스가 세분화되어서 더 좋아진다는 것보다는 플레이 스타일을 다르게 하는 것을 초점에 두었다. 시작클래스는 단순한 거쳐가는 휴게소가 아닌 선택에 의한 변화일뿐이라는 것을 보여주고싶었다.

profile
게임개발자가 꿈

0개의 댓글