본문 바로가기

Starters 부트캠프/B - log

유데미 스타터스 유니티 개발자 취업 부트캠프 1기 - 23주차 학습 일지

이번 주는 스타터스 강의보다도 따로 팀을 맞춰서 하고 있는 '롱 빈터' 팀 프로젝트를 진행하고, 합치는 데에 더 많은 시간을 쏟았다.

특히나 금요일, 토요일에 각자 진행한 기능들을 하나의 씬에 합치는 작업은 예상보다도 더 쉽지 않았던 것 같다.

 

오늘은 그런 의미에서 지금까지 작업하고 있는 팀 프로젝트 현황을 소개하는 시간을 가져보려고 한다.

 


 

'Long-Vinter' 팀 프로젝트 현황 

2주 ~ 3주 남짓한 기간 동안에 나와 팀원들이 구현한 기능들을 목차에 맞게 정리하였다.

11월 25일의 경우는 기능 추가보다는 각 기능을 한 씬에 묶는 작업에 초점을 맞추었다.

 

서버, 방 접속, 채팅

11/10

- 타이틀 씬, 로비 씬, 게임 씬 생성 및 연결
- 포톤을 통한 서버 접속
- 포톤 방 개설 및 참여하기

기본적으로 서버 접속, 방 접속 등을 강의 시간에 배운 포톤으로 구현하였다.

타이틀과 로비, 게임 씬을 만들어 연결시켰다.

 

기본적으로 게임은 타이틀 화면에서 바로 포톤 로비에 접속하고, 게임 시작 버튼을 통해 방을 생성 / 서버에 연결하기 버튼을 통해서 로비 씬으로 이동한 뒤에 원하는 방을 눌러 방에 참여하는 식으로 개발하였다.

당시에는 아직 비밀번호, PVP, Max Player 등의 설정을 추가하지는 않은 상태였다.

 

11/11

- 타이틀 씬, 로비 씬 UI 
- 방 개설 시에 발생하는 오류 해결
- 방 리스트 동기화 

타이틀과 로비 씬에서 버튼을 누를 때에 Dotween이라는 패키지를 통해서 자연스러운 효과를 추가하였다.

또한, 꼭 입력을 해야하는 닉네임 입력창에 아무것도 입력이 되어 있지 않다면, 게임 시작 버튼이 빨갛게 되어 좌우로 왔다 갔다 하면서 제대로 입력이 안 되었음을 알리도록 하였다.

 

한편, 방 개설 시에 로비에 있을 때에만 개설을 할 수 있다는 오류가 호출되는 문제를 해결했다.

버튼에 방을 개설하는 함수가 두 번 들어가 있어서 발생했던 오류였다.

방 리스트가 갱신되는 것은 포톤 Pun2에서 제공하는 UpdateRoomList 함수를 통해서 구현하였다.

 

11/15

- 방 설정 추가 및 변경 기능
- 플레이어 리스트, 방 정보 출력
- 플레이어 추방 기능
- 방 비밀번호 

PVP, 최대 인원 수, 방 비밀번호 등 여러 가지 방 설정을 추가했다.

그리고, 게임 시작을 눌러 들어갔을 때에 싱글 플레이를 하다가 원할 때에 방을 생성할 수 있도록 버튼을 추가했고, 방의 설정을 변경할 수 있도록 하였다.

그리고, 비밀번호는 방 리스트에서 방에 접속할 때에 표시되는 비밀번호 입력 창에 알맞게 입력해야 들어갈 수 있도록 하였다.

 

방에 입장한 플레이어들은 포톤을 통해 캐릭터가 생성 및 동기화 되고, 방에 접속한 플레이어 리스트를 볼 수 있게끔 하였다.

방장은 거기에 추가로 원하는 플레이어를 리스트에서 눌러서 추방할 수 있도록 하였다.

 

11/17

- 플레이어 리스트 오류 해결 
- 채팅 기능 추가

플레이어 리스트가 창을 열 때마다 중복되어 생성되는 버그를 수정했다.

플레이어 리스트를 다시 생성하기 전에 리스트를 초기화 시키는 방식으로 해결하였다.

 

원본 게임에서 채팅이 따로 기록이 남지 않고, 플레이어 위에 잠깐 표시되다가 없어지는 식이라서 포톤 Chat을 따로 사용하지 않고 구현했다.

애니메이션을 통해서 채팅이 스르륵 올라오면서 나타나고, 다시 아래로 가라앉으면서 사라지도록 하였다.

 

11/18

- 채팅이 플레이어 상단에 표시
- 플레이어 캐릭터 오브젝트 딕셔너리

채팅이 world position을 통해서 플레이어 위에 두도록 하니, 플레이어와 함께 각도가 돌아가거나 각 플레이어의 카메라에서 멀어지거나 할 때에 채팅이 너무 작아지는 등의 문제가 생겼다.

이에 따로 UI Camera를 추가해서 플레이어 위치를 해당 카메라의 스크린 포지션으로 가져온 뒤에 다시 월드 좌표로 변경한 값을 채팅 위치로 지정하였다.

이렇게 하였을 때에 글씨 크기가 작아지거나 회전하거나 하지 않았고, 항상 카메라 방향을 바라보게 되었다.

 

싱글톤으로 PlayerList 스크립트를 만들어서 원할 때마다 actor number로 원하는 플레이어의 캐릭터 오브젝트에 접근할 수 있게끔 딕셔너리를 만들었다.

 

11/22

- 닷트윈 패키지 최적화

Dotween이 중첩하여 실행되어서 게임 속도에 문제가 되던 현상을 수정했다.

 

11/24

- 채팅 박스 크기가 유동적으로 변하도록 수정
- 채팅을 치는 플레이어 위에 "..." 표시가 나타남
- c키를 눌러 감정표현 시에 닉네임이 표시되도록 함
- 이전 채팅이 최근 채팅보다 위로 올라가고, 닉네임이 가장 아래에 나타나도록 함

Text, TextMeshPro의 preferred width, height를 이용해서 부모 오브젝트(채팅 박스)의 크기가 채팅의 길이만큼 유동적으로 줄어들고, 늘어나도록 하였다.

또한, vertical layout을 통해서 채팅이 오래된 순서대로 위에 있게끔 하였으며, 닉네임은 c키를 입력할 때마다 채팅 캔버스 가장 마지막 자식 오브젝트로 붙어 활성화되도록 해서 무조건 채팅 아래에 표시되도록 하였다.

 

기능 구현 영상

방 생성, 참여, 비밀번호, 강퇴, 채팅

 

캐릭터 조작

11/10

- 방향키 및 wasd로 플레이어 캐릭터 이동
- 마우스 우클릭으로 조준
- 이동 및 조준 애니메이션

방향키, wasd 입력을 받아서 horizontal, vertical 값으로 변환하고, 이를 통해서 캐릭터가 이동할 수 있도록 구현하였다.

마우스 우클릭 시에는 조준 애니메이션을 하도록 하였다.

원본 게임에서 공격 시에는 항상 조준을 하므로 공격 전에 조준 기능을 구현하였다.

 

11/11

- 조준 애니메이션 보강
- 조준 시에 마우스 포인터를 따라서 캐릭터 방향이 회전

조준 시에 캐릭터를 기준으로 마우스 포인터가 있는 방향으로 캐릭터의 전방이 회전하도록 하였다.

 

11/17

- 조준 시에 카메라가 해당 위치로 이동

마우스 우클릭한 지점으로 카메라가 이동하도록 CameraController 스크립트를 만들어 구현하였다.

스크린 포인트를 월드 좌표로 가져온 뒤에 offset 값을 더해서 카메라를 이동시켰다.

 

11/18

- 공격에 필요한 무기 스크립트 작성
- 근접(Melee), 원거리(Range) 타입을 구분해서 Attack, Aim 함수 구현
- 근접 공격, 원거리 공격 애니메이션 구현

무기의 타입을 근거리, 원거리로 나누고, 각 아이템마다 후에 적용하도록 히였다.

각 타입의 애니메이션을 따로 만들고, 장착한 무기의 타입에 따라 조준 후에 좌클릭 시에 공격을 하고, 해당하는 애니메이션이 작동하게끔 하였다.

 

11/22

- 원거리 공격 총알, 맞은 자리 연기 등 구현

원거리 공격 시에 총알을 생성하고, 쐈을 때에 플레이어의 전방 방향으로 일정 속도로 발사되도록 하였다.

맞은 자리에는 연기와 자국이 남도록 하였고, 일정 시간이 지난 뒤에 자동으로 사라지도록 만들었다.

 

 

인벤토리

11/15

- 탭 키, 클릭을 통해 인벤토리 창 열기 및 닫기

탭 키로 인벤토리를 열고, 각 탭을 클릭해서 인벤토리, 장비, 도감, 퀘스트 창을 스왑 할 수 있도록 하였다.

또한, 창이 열려있을 때에 탭 키 혹은 UI 바깥 화면을 클릭해서 닫을 수 있도록 하였다.

 

11/17

- 드래그 앤 드롭으로 인벤토리 아이템의 칸을 옮기기
- 드래그 앤 드롭으로 아이템 버리기 (구현 중)
- 무기, 도구 아이템 좌클릭으로 장착

드래그 앤 드롭으로 아이템 오브젝트를 원하는 칸으로 이동할 수 있도록 하였다.

장비할 수 있는 오브젝트는 좌클릭을 통해서 장비 칸으로 이동하도록 하였다.

 

11/18

- 아이템 오브젝트에서 스페이스바, 클릭을 통해 아이템 획득
- 획득한 아이템이 인벤토리에 들어가도록 함
- 새로운 아이템 획득 시에 알림 표시
- 도감에 아이템이 추가
- 도감에 아이템이 추가 시에 알림 표시

월드 상의 아이템 오브젝트에 접촉해서 스페이스바나 마우스 클릭을 하면, 아이템을 획득할 수 있도록 하였다.

획득한 아이템은 인벤토리 칸으로 이동해서 보유한 아이템 가장 마지막 칸에 등록되도록 하였다.

 

알림 팝업은 처음 획득한 이이템이나 도감에 처음 등록되는 아이템을 획득할 시에 활성화되고, 해당 아이템을 얻었다는 내용을 표시하게끔 하였다.

 

11/22

- 인벤토리 마우스 호버 시에 툴팁 표시
- 낚시에 성공한 물고기도 인벤토리, 도감에 들어가고, 알림이 뜨도록 함

마우스 호버 시에 아이템 이름이 툴팁으로 표시되도록 하였다.

이 툴팁 역시 채팅 창과 마찬가지로 텍스트 길이만큼 크기가 유동적으로 변하도록 하였다.

 

11/25

- 플레이어 각자의 인벤토리만 열리고 닫히도록 함

photonNetwork.IsMine을 통해서 자기만 자기의 인벤토리를 열고 닫을 수 있도록 키 입력을 제한하였다.

 

기능 구현 영상

캐릭터 이동, 에임, 카메라, 인벤토리, 장비, 도감, UI 알림

 

낚시, 동물 AI

11/15

- 동물 AI가 내비게이션 기능을 통해 랜덤한 좌표로 이동하도록 설정
- 이동 애니메이션 적용
- 닭은 플레이어와 조우 시에 반대 방향으로 도주하도록 함

유니티의 네비게이션 패키지를 통해서 동물 AI를 구현했다.

미리 동물 기준 일정 거리에 이동 포인트들을 몇 개 지정한 뒤에 시간마다 랜덤한 순서의 포인터로 이동하도록 구현하였다.

 

플레이어가 만약 닭과 일정 거리 이하로 거리가 좁혀지면, 즉각 플레이어와 반대 방향으로 도주하고, 안전거리만큼 떨어진 뒤에 다시 랜덤한 좌표로 이동하게끔 하였다.

 

11/17

- 닭 AI 속도 조절
- 낚시 포인터 클릭 시에 낚시 시작

닭이 도주할 때에는 더 빠른 속도로 이동하게끔 하였다.

 

새롭게 낚시 포인터를 추가하고, 해당 포인터를 클릭 시에 낚시에 돌입하도록 하였다.

이는 그냥 onClick의 addListener로 구현했다.

 

11/18

- 낚시 시에 플레이어가 이동하지 못하게 함
- 물고기가 미끼를 물 때에 E버튼을 클릭하라는 표시가 뜨도록 함
- 물고기 획득 시에 이름과 사진 표시
- 낚시 애니메이션 

낚시 시에는 플레이어가 이동하지 않도록 변수를 하나 두어서 해당 값이 true일 때에 플레이어 이동 입력을 받지 않도록 하였다.

 

물고기가 미끼를 물었을 때에는 우측 중단에 E키를 연타하라는 UI가 표시되도록 하였다.

표시되는 동안 E키를 일정 이상 누를 경우 낚시에 성공하고, 랜덤한 물고기의 이름과 사진이 UI로 표시되도록 하였다.

(22일에는 인벤토리 구현 시에 만들어 놓은 아이템 획득 UI와 통합했다.)

 

11/22

- 곰 AI 구현
- 플레이어가 일정 거리 이내에 접근 시에 플레이어에게 접근하도록 함
- 플레이어와 접촉하면 공격
- 피격 효과
- 이동, 공격 애니메이션

닭 외에 곰 AI를 하나 더 만들었다.

플레이어가 일정 거리 이내로 다가왔을 때에 오히려 선제공격하는 AI로 플레이어에게 먼저 접근하고, 접촉 시에 공격 모션을 취하도록 하였다.

대미지 계산은 아직 구현하지 않았고, 애니메이션과 피격 효과만 넣었다.

 

기능 구현 영상 - 낚시

낚시 기능

(동물 AI는 기능을 합치는 중에 오류가 발생해서 영상으로 남기지 못했습니다.)

 

포탑 설치 및 작동

11/17

- 포탑 영역 설정
- 가장 가까운 플레이어의 위치 저장
- 해당 플레이어로의 각도를 계산해서 터렛 머리를 회전
- 플레이어를 인식하지 않으면, 서서히 터렛의 머리가 360도로 회전

콜라이더를 통해 포탑의 영역을 설정하고, 플레이어가 트리거 엔터 시에 리스트로 추가되도록 하였다.

그리고, 리스트에 한 명 이상의 플레이어가 있을 시에는 계속 리스트 안에 플레이어들과 포탑의 거리를 계산해서 가장 가까운 플레이어를 타겟으로 저장하게 하였다. (위치 정보를 저장해야 하므로 Transform 변수로 저장하였다.)

 

플레이어가 트리거에서 빠져나오면 해당 플레이어를 리스트에서 제거하고, 아무런 플레이어가 리스트에 없을 시에는 포탑의 머리가 360도로 서서히 회전하며, (Lerp를 사용해서 서서히 이동하도록 함) 타겟을 잡았을 경우에는 해당 타겟 위치의 각도로 머리를 즉각 회전시키도록 하였다.

 

11/18

- 본인이 만든 터렛이면, 무시
- 플레이어 인식 시에 공용 터렛이면, 즉각 타격하고 개인 터렛은 총을 발사
- 플레이어의 hp를 타격 시에 깎고, 0이 되면, 죽었다고 로그를 출력

포톤으로 생성하므로 포톤 뷰의 주인의 경우에 플레이어 리스트에 담지 않도록 수정하였다.

 

포탑은 안전지대에 원래부터 설치되어 있는 공용 터렛과 개인이 설치하는 개인 터렛으로 구분하였다.

공용 터렛은 범위 내에 있을 때에 따로 총알을 발사하지 않고 즉각 플레이어를 타격하도록 하였고, 개인 터렛은 총알을 발사해서 맞으면 플레이어를 타격하도록 하였다.

타격 시에는 플레이어의 HP가 깎인다는 로그를 출력하고, 가상으로 설정한 HP가 0이 되면, 죽었다는 로그를 출력하도록 하였다.

 

11/22

- 버튼을 눌러서 오브젝트를 설치하는 UI를 표시
- 설치 가능한 영역 표시
- 해당 영역에서 좌클릭 시에 포탑이 설치되도록 함

포탑 버튼을 만들고, 눌렀을 때에 반투명한 포탑 UI가 마우스를 따라다니도록 구현하였다.

그리고, 설치 가능한 영역이 같이 표시되어 가능한 지역에서 좌클릭 시에 포탑이 해당 위치에 설치되게끔 하였다.

메인 카메라에서 마우스 포지션으로 Ray를 발사해서 부딪힌 오브젝트의 태그를 통해 가능한 영역인지 확인하게끔 하였다.

 

11/24

- 터렛 총알을 원거리 무기 공격 총알 이펙트와 동일하게 변경
- 오브젝트 설치 기능으로 포탑을 설치할 수 있도록 적용

원거리 무기 공격 시에 나가는 총알 이펙트와 효과를 가져와 포탑에도 적용했다.

또한, 오브젝트 설치 기능과 포탑을 연결해서 해당 기능으로 포탑을 설치할 수 있도록 하였다.

 

기능 구현 영상

공용 터렛, 개인 터렛, 터렛 설치

 

(아직 기능을 합치지 못해서 멀티 플레이 환경에서 보여드리지 못하는 점 양해 바랍니다 ㅠ)

 

기타

11/24

- 시간이 지남에 따라서 빛의 각도, 세기를 변경해서 낮, 밤을 구현

시작 시간과 게임 세상에서의 한 시간을 몇 초로 설정할 것인지를 설정하면 자동으로 시간이 흐르고, directional light의 각도와 세기가 조절되도록 설정하였다.

또한, 현재 시간 값이 모두에게 똑같이 적용되도록 포톤 동기화를 하였다.

 

 

게임 플레이 영상

 

전체 게임 플레이 영상

 

 

 

유데미 코리아 바로가기 : 

 

Udemy Korea - 실용적인 온라인 강의, 글로벌 전문가에게 배워보세요. | Udemy Korea

유데미코리아 AI, 파이썬, 리엑트, 자바, 노션, 디자인, UI, UIX, 기획 등 전문가의 온라인 강의를 제공하고 있습니다.

www.udemykorea.com

 

💡 본 포스팅은 유데미-웅진씽크빅 취업 부트캠프 유니티 1기 과정 후기로 작성되었습니다.