미리보기
기본 정보
기술 스택
C#, Unity, Git, JavaScript, SQL, Jenkins, JIRA
프로젝트
3D 방치형 게임
개인
2024.06. ~ 2024.07.
방치형 게임들을 참고로 만든 프로젝트로, Unity, Node js, MariaDB, redis로 구성하고 Jenkins로 배포하는 프로젝트입니다. 제가 구현은 기능은 DB, js, Unity로 나누어 볼 수 있습니다.
DB에선 redis와 node js를 통해 송수신하며 MariaDB에 저장된 일부 데이터는 redis에 캐싱 하여 플레이어의 순위 검색 및 데이터 송수신 속도를 높이고 DB에서 순위에 대한 이벤트 스케줄러를 등록해서 자동으로 순위를 추가로 업데이트하도록 했습니다. 그리고 인덱스를 추가해 색인 속도를 개선했습니다.
NodeJs에서는 데이터를 송수신할 때 jwt를 적용해서 외부에서 허가되지 않은 접근을 할 경우 정보 조회를 차단하고, 또한 Unity 클라이언트 측은 최대한 요청만 하도록 하고, Node js에서 대부분의 연산을 처리하여 데이터의 위변조 방지 및 보안을 생각해서 작성했습니다.
Unity에서는 플레이어와 몬스터의 움직임은 BehaviorTree로 작성했고 데이터는 ObservableCollection과 이벤트를 통해 실시간으로 반영될 수 있게 구현했습니다. UI의 Prefab은 게임 시작 시 Dictionary로 등록해서 Unity에서 Prefab이 누락되지 않고 추가될 수 있게 작성했습니다. Singleton에 대해 지연 초기화로 구현해서, 모든 데이터가 불러올 때까지 기다리고 플레이어에겐 로딩 창울 띄워서 데이터의 안정성을 높였습니다. UI는 stack을 활용해서 최근에 불러온 UI을 닫히게 하고 닫힌 UI는 일정 시간 뒤에 사라지게 하여 메모리 최적화를 진행했습니다.
Jenkins로 Node Js 서버와 DB를 Aws Ec2 인스턴스에서 빌드 및 배포하고 서버의 수정사항이 있을 경우 작업 편의성을 위해 Github의 저장소에서 Git Webhook을 설정해 서버 Branch에서 push 할 경우 자동으로 서버의 빌드가 동작하도록 파이프라인을 구성했습니다.
3D 캐주얼 RPG
팀
2024.05. ~ 2024.05.
Unity, UGS의 Lobby, Relay, Mirror Network, NodeJs, MsSQL, Azure를 활용한 3D 캐주얼 RPG 프로젝트입니다. 프로젝트는 회원가입, 로그인, 튜토리얼, 로비, 게임씬으로 나누어져 진행되고, 제가 담당한 기능은 Lobby를 이용해 로비를 만들어 실시간으로 파티에 가입 및 방 만들기, NodeJS 및 MsSQL, Azure DB에 연결하는 기능을 구현했습니다. 플레이어와 몬스터의 데이터는 DB에 저장했고, Unity에서 회원가입 및 로그인을 요청, 게임 플레이 중 재화를 획득하면 NodeJs를 통해 DB에 데이터를 송수신하도록 했습니다. 프로젝트에서 Azure DB를 사용한 이유는 종량제로 사용한 만큼 요금을 낼 수 있어 채택했고, Azure가 ms이기 때문에 자연스럽게 호환성이 좋을 것이라 생각하여 MSSQL을 사용하게 되었습니다. 로비는 이벤트로 플레이어의 변화가 있을 때마다 불러오지만, 데이터의 안정성을 고려하여 일정 시간마다 새로고침 되도록 구현했습니다. IP 주소는 외부 환경 변수 파일로 빌드 스크립트에서 제외하여 최소한의 보안을 고려했습니다.
2D 샌드박스 게임
개인
2024.04. ~ 2024.04.
테라리아를 기반으로 Unity로 제작한 2D 샌드박스 프로젝트로 주요 기능은 지형, 인벤토리, 시간에 따른 낮과 밤을 구현한 프로젝트입니다. 지형은 Array로 되어있으며 게임을 시작할 때 PerlinNoise 함수를 이용해서 절차적으로 지형을 생성해 매번 다른 지형을 생성하지만, 높이를 구간으로 나누어 획득 가능한 광석 구간을 나누고, 지상의 중앙 지역은 고정된 좌표를 가져 베이스캠프로 활용할 수 있게 만들었습니다. 또한 플레이어 기준으로 청크 단위로 지형을 나누어 근접한 지형만 활성화해서 최적화를 진행했습니다. 지형은 파괴할 경우 블록을 드롭하고 드로우 콜을 줄이기 위해 처음부터 외벽을 함께 생성하지 않고 지하 구간에서 파괴된 곳에 배치하는 방식으로 구현했습니다. 지형은 연결된 블록에 이어서 설치할 수 있으며 허공에는 설치할 수 없습니다. 인벤토리는 Unity에서 제공하는 드래그 드롭 인터페이스와 Dictionary로 구현해서 인벤토리에서 원하는 위치로 이동 및 인벤토리 밖으로 아이템을 드롭하면 해당 아이템이 드롭되도록 구현했습니다. 낮과 밤은 빛에 대한 값을 ScriptableObject로 설정해 이벤트로 해당하는 시간에 따라 낮과 밤이 지나도록 했습니다. 추가적으로 지형을 포함한 모든 아이템 또한 ScriptableObject와 Dictionary로 Prefab을 매핑해서 도감화했습니다.
콘솔 랜덤타워디펜스
개인
2024.03. ~ 2024.03.
스타크래프트의 유즈맵인 랜덤 타워디펜스를 모방하여 제작한 프로젝트로, Array로 좌표를 만들고 enum과 Dictionary로 맵의 정보를 저장하여 콘솔에서 해당 좌표를 볼 수 있게 그렸으며, 프로젝트의 주요 기능은 C#의 타이머와 이벤트로 동작하도록 해서 적이 순차적으로 등장하고 포탑의 공격 대기시간 및 다음 스테이지로 대기 시간을 구현했습니다. 매 스테이지마다 돈을 얻을 수 있고, 타워를 구매, 판매, 조합할 수 있습니다. 구매는 돈을 사용해서 타워를 설치하고, 판매는 해당 위치의 타워를 철거하고 돈을 일부 돌려받습니다. 조합은 맵에서 해당 위치의 타워와 동일한 타워가 본인을 포함해 2개 이상 있을 경우 해당 위치에 높은 단계의 타워를 생성합니다. 타워는 또한 골드를 소모해서 공격력을 업그레이드할 수 있습니다. 게임 진행 중 플레이어가 원할 때 미션을 진행하여 미션 보스를 처치하면 많은 돈을 얻을 수 있게 제작했습니다.
포트폴리오
교육
한국교통대학교
대학교(학사) | 컴퓨터공학과
2021.03. ~ 2023.08. | 졸업
충북도립대학교
대학교(전문학사) | 반도체전자과
2014.03. ~ 2019.02. | 졸업