Unreal - Unity - Programer
-Computer Language-
C/C++
C#
WinApi
-GameEngine-
Unity
Unreal
Photon Server
-Etc-
html
PHP
Azure_PlayFab
스팀 판매중지에 따라 스토브 링크를 추가하였습니다.
UNStoppable 트레일러
언리얼 엔진5 위젯(UI)개발 - 메인메뉴및 인게임 UI개발
xbox/ps4패드를 이용하여 UI개발 키보드 사용중에도 패드 인식시 패드로도 UI를 사용할수 있게 개발
데이터 테이블을 활용하여 시네마틱 자막 작업및 7개국어 지원 개발
비디오 옵션 - 창모드및 해상도 설정 개발
오디오 옵션 - 사운드 클래스를 사용하여 게임 전체 사운드 조정가능하게 개발
포스트 프로세싱 머터리얼 개발
steam deck 포팅 진행 - 게임 실행 여부 확인스팀덱에 윈도우 빌드 파일을 올려 테스트
얼리액세스(스토브2023.06.23/스팀2023.07.03)및 정식 출시(스팀/스티브 2024.01.11)
Unstoppable의 신경가스에 대한 이야기를 설명하는 게임
하이퍼 캐주얼 장르이며 한손으로 플레이 가능하게 개발
언리얼 엔진 5 - 안드로이드 패키징 성공
2023 지스타 부스 시연을 위해 개발
퍼니록스 입사 3개월차 인터뷰입니다
코엑스 디지털 미래 혁신대전 2023 인디게임부스 참여
게임 소개 영상입니다.
WaVillage 팬 메이드 게임입니다. 2D횡스크롤 슈팅게임입니다
유니티에서 제공되는 Shader는 Texture를 2개만 사용할수 있어 따로 Shader를 구현하엿다.
구현해 놓은 Shader를 활용해 Material을 제작하고 Quad를 생성하여 배경을 제작하였다. 배경이 하나의 이미지로 같이 돌면 속도감이 나지 않아 3개의 이미지가 다르게 움직이도록 하였다.
캐릭터는 5명이지만 캐릭터별로 Scene을 따로 만들어 리소스만 다르게 적용하고 Script는 하나로 작성하였다. Player코드는 캐릭터를 컨트롤하는 방식과 충돌처리및 캐릭터 스탯을 관리한다.
Bullet에 경우 몬스터이든 플레이어이든 하나의 Script를 사용하고 Enum변수를 통해 총알을 호출할때 적군과 아군을 구분하여 다르게 작동하도록 구현하였다. 아이템에 따른 유도탄이 작동하도록 구현하였다.
소환수에 경우 주인공 주위를 돌면서 총알을 발사하도록 구현하엿고 소환수 발사하는 총알또한 Bullet소스코드를 사용하기에 아이템에 따른 유도탄 공격이 적용됩니다.
궁극기에 경우 몬스터의 타입에 따라 대미지를 다르게 주도록 구현하였고 타입판별은 몬스터 객체의 tag를 활용하여 구분하도록 구현하였다.
몬스터 스폰은 킬 카운트에 따라 난이도와 아이템 드랍율을 조정하도록 구현하였다.
몬스터에 경우 Script를 여러개 만들기 보다는 하나의 스크립트를 활용해 작동하도록 구현하였다. 그러다 보니 소스코드의 분량이 커지게 되었다. Enum변수를 통해 몬스터 타입을 나누었고 보스 몬스터들에 경우 공격타입별로 구현하였다.
아이템 타입별로 구분하고 자석 아이템의 효과와 튜토리얼과 게임에서 다르게 작동하도록 구현하였다.
GameMgr에 경우 카메라의 사이즈를 측정해 놓고 객체 들이 사이즈값을 비교하여 화면 밖으로 나가면 Destroy되도록 하였다. 아이템 또한 캐릭터별로 Scene이름을 달리하여 각 캐릭터별로 아이템을 다르게 로드 하도록 구현하였다. 인게임 UI를 관리한다.
Mono싱글톤은 싱글톤 패턴을 사용하여 Scnen을 넘어다니더라도 SoundMgr가 지워지지않게 하엿고 SoundMgr를 통해 사운드를 재생한다. ConfigBox를 통해 유저가 소리를 On/Off하거나 사운드 볼륨을 조절하도록 구현하였다.
게임 소개 영상입니다.
Need_Turrets_Here 실행파일
템프로젝트 실행파일 이용가능(개인서버로 서버를 교체함)
팀프로젝트 식물과 좀비를 모작하여 제작한 타워 디펜스장르의 게임입니다.
학원에서 배운 내용을 토대로 타워 디자인및 구현을 담당하였습니다.
모든 터렛이 상속 받을 Turret Ctrl JSON문서를 파싱해 SetType에서 JSON문서에 맞게 번호를 설정 하면 변수들에 데이터를 불러온다. 메모리 풀 적용을 위해 Turret Ctrl에 MemoryPoolingFlag, IDamageable를 상속 받는다
Update함수에서 JSON에 맞게SetType 설정 후 터렛에 상태값 체크 후 대기시간이 끝나면 Raycast를 쏴서 Monster가 범위내에 있을 경우 Bullet함수를 호출 한다. 공격주기만큼 MemoryPool에서 Turret에 맞는 Bullet을 호출한다. Turret Type에 맞게 Bullet의 속성 값을 설정해준다.
LittleBoy에 경우 Bullet을 호출하지 않고 공격 범위 안에 있는 모든 Monster에게 1000Damage를 주고 터렛은 바로 사라진다.
은행종류에 Turret에 경우 사거리 체크를
하지 않고 처음 설치인경우 5~10초중에 Dollor를 MemoryPool에서 호출하고
그 이후 부터는 20~30초 에 한번씩 Dollor를 호출한다.
P vs Z에서 호두인 경우 공격 하지 않고
오로지 Damage만 받기에 Damage만 적용되게 구현 하였고 요새에 경우 점프Enemy가 넘지 못하게 하기 위해 태그를 추가하였습니다.
Unity를 이용하여 기본적인 객체를 제어하는 방법과 UI와 게임의 기본적인 구조와
C#의 기초적인 내용을 습득하였습니다.
학생 Class입니다. 자료구조를 사용하기 위해 학생 클래스를 만들어 학생 정보를 저장합니다.
C# 문법을 익히고 자료구조중 리스트를 활용하여 학생성적을 관리하고 저장및 검색을 할수 있게 구현하였다.
기본적인 입력방법인 마우스를 통해서 객체를 회전시킨다.
객체의 회전각를 이용해 판정한다. 판정이 완료되면 숫자를 화면에 표시해준다. 다섯개의 숫자를 다 선택하고 나면 다시할수있게 초기화한다.
가위바위보게임에 경우 객체를 이용하지 않고 UI만 활용해 게임을 구현 하였으면 int형 변수들을 활용해 판정하였다.
자동을 선택할경우 컴퓨터의 가위바위보가 유저가 선택할때 나오는게 아니라 자동적으로 이미지가 바뀌면서 유저가 선택하면 이미지 변환이 멈추도록 구현하였다.
자동차를 움직이기 위해 마우스를 클릭하고 움직만큼만 계산해 자동차를 움직입니다.
깃발과 자동차 사이의 거리를 측정하여 플레이어별로 기록한다. 그 거리를 비교해 등수를 표기한다.
고양이를 움직이기 위해 키보드및 UI를 사용해 모바일 환경에서도 작동하도록 구현하였다. UI 버튼에 경우 EventTrigger를 사용하여 버튼 이벤트가 작동한다.
화살과 사과는 유니티에서 제공하는 콜리더를 쓰지 않고 코드상에서 원형충돌처리코드를 이용하여 고양이와 충돌처리를 하였다.
확률에 따라 화살과 사과가 스폰되도록 구현하였다.
이 게임에서는 Platform Effector를 사용하여 아래에서 위는 통과하지만 위에서 아래는 떨어지지 않게 구현하였다.
높이 올라갈수록 화살은 많이 생성하고 구름의 생성은 줄여서 레벨 디자인을 구현하였다.
마우스로 바구니를 옴길때 낙하물에 의해 클릭이 작동하지 않아 레이어를 사용하여 낙하물은 클릭이 안되게 하고 바닥만 클릭하게 구현하였다.
플레이어가 움직이지 않을때는 카메라의 위치를 얻어와 카메라가 바라 보는 방향에서 몬스터가 생성되도록 구현하였다.
3D객체와 카메라의 이동을 구현하였다.
쉐이더와 PostProcess를 연습하기위해 만든 프로그램입니다.
Win Api를 이용해서 간단한 게임을 제작하고 C/C++에 대한 기초적인 내용을 습득하엿습니다.
다른 이미지를 로딩하지 않고 winapi의 그리기 함수들을 사용하여 배경과 바둑돌을 표시한다.
오목 판정 함수를 따로 구현하여 돌을 놓을 때 마다 오목이 완성되는지 판단한다.
판정은 이중 포문을 사용하여 8분위로 좌표값을 체크하면서 연속적으로 같은 색깔의 돌이 5개인지 판정한다.
각 기능별로 소스코드를 따로 작성하기 위해 기본 메세지 루프를 후킹하여 다른 Mainclass에서 작동하도록 구현하였다.
각 기능별로 클래스를 구현하고 Main클래스에서 작동하도록 구현하였다.
GDI+ 방식으로 이미지를 로딩하여 경마게임에 맞게 애니메이션 나오도록 구현하였다. 애니메이션은 로딩해놓은 이미지를 순서대로 바꿔가면 나오도록 구현하였다.
이 프로젝트는 WinApi에서 제공하는 UI들을 사용하는 방식으로 구현하는 방법을 습득하였다.
탑다운 방식 2D 슈팅 디펜스 게임입니다.
유니티 3D에서 카메라의 레터박스를 적용하여 2D게임처럼 보이게 적용한다.
탑다운방식의 카메라를 맵을 벋어나지 않고 캐릭터를 따라다니게 구현한 소스코드 입니다.
이동방식에 대한 구현량이 많아 소스코드가 복잡하지만 3가지의 이동방식을 구현하였다. 마우스 피킹/ 조이스틱/ 키보드 이동을 구현하였습니다
몬스터 ctrl 소스코드로서 몬스터 패트롤을 구현하였고 캐릭터와 거리를 체크하여 거리안에 들어오명 캐릭터를 추적하고 공격거리 안으로 들어오면 공격하도록 구현하였습니다.
몬스터의 위치값들을 갇고 있는 리스트를 만들어서 몬스터 사망시에 빈 리스트를 찾아서 몬스터를 스폰 시키고 레벨에 따라서 몬스터의 이미지를 교체하도록 구현하였다.
상점을 구현하기 위해 유저데이터를 저장하기 위한 스크립트를 작성하였습니다.
유저데이테에 경우 씬을 넘어다니더라도 유니티에서 제공하는 로컬저장방식인 PlayerPrefs를 사용하여
Gold와 스킬등을 저장하게 구현하였습니다.
드레그앤 드롭기능 구현한 소스코드로서 3개의 이미지를 끄고 키기를 반복하여 구현하였습니다.
상점에 경우 유저데이터에 저장하지는 않지만 상점 기능을 구현하기 위해 작성한 코드로서 자료구조를 활용하여 간단한 상점 씬을 구현하엿습니다.
디자인 패턴 중에 하나인 싱글턴을 이용하는 소스코드로서 학원에서 강사님이 제공해준 오픈소스입니다. 이 소스코드를 활용하여 씬을 넘어다니더라도 사운드를 관리하는 환경설정창을 구현하는데 사용하였다.
위의 싱글턴 소스코드를 활용하여 게임에서 사용하는 사운드를 관리하고 유저가 편하게 볼륨과 소리를 끄고 킬수 있게 구현하였다. 또한 씬을 이동하더라고 싱글턴으로 구현하였기에 유저가 설정에 맞게 모든 씬에서 똑같이 소리가 작동되도록 구현하였습니다.
이 프로젝트에서는 와빌리지의 기본이 되는 프로젝트로서
이미 와빌리지 프로젝트에서 게임 기능을 설명하였기에
서버를 사용하여 유저를 관리하고 서버와에 통신을 중점적으로 설명하겠습니다.
Microsoft에서 제공하는 Azure_PlayFab을 사용하여 유저 데이터 정보를
로컬에 저장하지 않고 서버에 저장하여
유저들이 데이터를 변경하지 못하도록
구현하였고 PlayFab SDK를 사용하여 유니티 프로젝트에서 소스코드를 작성하였습니다.
Playfab SDK에 맞춰 서버와의 통신을 구현하였고 서버에 저장된 유저정보를
비교해 로그인및 회원가입을 구현하였습니다.
또한 이메일 형식에 맞춰 유저 아이디를 작성하도록 구현하였습니다.
Playfab에서 제공하는 순위표를 활용하여 유저들이 순위를 확인하도록 구현하였습니다.
접속한 유저가 10등안에 들어있을 경우에만 텍스트색을
다르게 표현하여 확인 할수 있도록 구현하였습니다.
로비화면에서 유저데이터 초기화 버튼을 클릭하면 유저의 중요정보(아이디/닉네임/비밀번호)를
제외한
정보를 초기화할 수 있게 구현하였습니다.
Playfab에서는 유저의 데이터를 저장할 수 있는 공간을 제공해 주고 있다.
이 저장공간을 활용하여 유저가 아이템을 구매할때 이공간에
유저의 아이템 정보를 저장하게 구현하였고
아이템을 유저가 정확히 구매할수 있게 구현하였습니다.
아이템을 구매할때 유저가 가진 골드 값을 확인하여 아이템 구매 가능 여부를
체크하고 구매가 가능하면
4단계에 걸쳐 아이템 구매가 이루어집니다.
서버에서 유저의 데이터를 확인하고 클라이언트에 동기화후에,
서버에 전달항 정보를 만들고 서버에 전달하여 구매 프로세스가 동작하도록 구현하였습니다.
Network_Mgr스크립트를 작성하여 게임 플레이중에 획득한 점수나 재화를
서버로 실시간으로 전송 하도록 하였고,
게임오버나 게임종료가 되더라도 우선 서버에 유저 데이터를 전송하고
씬 이동및 게임종료가 되도록 구현하였습니다.
로그인 할때 사용되는 Login_php소스코드입니다.
MySQl에 저장된 키값과 JSON문서를 활용하여
유저 데이터를 클라이언트에 보내도록 구현하엿습니다.
신규 유저가 회원가입을 진행하게되면 작동하는 소스코드로서
MySQl에 테이블 키값에 맞게 데이터를 생성하고 저장하도록 구현하였습니다.
클라이언트에 작동하는 소스코드로서 서버 url을 통해 서버에 저장된 PHP파일에 데이터를 보내게 되면 서버에서 PHP파일이 MySQl에 데이터를 저장하게 구현하였습니다.
MySQl에 저장된 유저 정보를 토대로 내림차순 정렬을 통해 1~10위까지의
유저 정보를 JSON데이터를 생성하여 클라이언트에 전송합니다.
클라이언트에서 JSON으로 받은 데이터파일을 파싱하여 로비화면에 유저 순위를 표시하고
만약 접속한 유저가 있을 경우 텍스트색을 바꿔 따로 표시해주도록 구현하였습니다.
클라이언트에서 유저 정보 초기화 요청이 들어오면 MySQl에 유저 데이터를 초기화 하도록 구현하였습니다.
유저정보 초기화 버튼 클릭시 서버에 유저정보 초기화를 요청하도록 구현하였습니다.
클라이언트에서 아이템 구매 요청이 오면 유저의 골드값과 아이템 정보를 업데이트 하도록 구현하였습니다.
Playfab에서 와 같이 4단계에 걸쳐 아이템 구매를 서버에 요청하도록 구현하였습니다.
인 게임에서 획득한 점수를 클라이언트에서 업데이트 요청을 하면 MySQl에 유저 정보에 맞게 업데이트 하도록 구현하였습니다.
인 게임에서 획득한 골드를 클라이언트에서 업데이트 요청을 하면 MySQl에 유저 정보에 맞게 업데이트 하도록 구현하였습니다.
환경설정창에서 닉네임 변경 요청이 오면 MySQl에 닉네임을 변경하여 저장하도록 구현하였습니다.
Playfab에서 작성한 바와 같이 재화나 점수를 획드하면 서버에 정보갱신을 실시간으로 요청하고
닉네임 또한 변경 요청이 있으면 MySQl에 변경된 닉네임을 저장하도록 구현하였습니다.
3D FPS 게임 / 3인칭
네비매쉬을 활용하여 Monster AI를 구현 설정한 추적거리안에
캐릭터가 들어오면 캐릭터를 향해 추적하고
공격거리안에 들어오면 추적을 정지하고 캐릭터를 공격하도록 구현하였습니다.
몬스터 사망시에 초록색으로 변하게 하기 위해 몬스터 기본 쉐이더에
Color변수를 만들어 몬스터의 색을 조정할수 있게 구현하였습니다.
경직 스킬 사용시에 몬스터의 색깔을 회색으로 바꾸기 위해 구현한 쉐이더 소스코드입니다.
Color쉐이더에 경우 Color변수를 추가해 구현하였다면
Gray 쉐이더에 경우 Gary Rgb값을 한번만 계산하도록 구현하였고 외부에서
색을 조정할수 없도록 구현하였습니다.
인 게임에서 작성한 쉐이더코드를 활용해 경직 스킬과
몬스터 사망시에 쉐이더를 적용하게 구현하엿습니다.
몬스터의 기본쉐이더가 적용되어 있는 SkinnedMeshRenderer를 찾아 배열에 저장해 놓았다가
상황에 맞게 다른 쉐이더를 적용하였습니다.
인 게임에서는 캐릭터 컨트롤러를 사용하여 구현하였습니다.
두 이동 방식에는 각각 장단점이 있지만 유지보수가 쉽고 중력값을 적용할수 있게
되어 캐릭터 컨트롤러를 사용하는 추세이다.
메인 카메라에 적용되는 소스코드로서 일정거리 뒤에서 카메라가
캐릭터를 뒤 따라 움직이게 구현하엿고
캐릭터를 기준으로 카메라가 회전할 수 있게 구현하였습니다.
PlayFab과 FaceBook SDK를 사용하여 페이스북 로그인을 구현하였다.
허나 빌드된 상태에서는 로그인이 불가능하다.
그 이유는 일반 모바일에서처럼 바로 접속가능 하도록 구현한게 아니라
유저의 토큰을 받아 로그인 하도록 구현하여
개발자버전에서만 동작한다.
유저 토큰을 페이스북 로그인 성공시 유저의 페이스북 정보중에
유저의 사진과 이름을 불러와 화면에 표시할수 있게
구현하였습니다.
3D 탱크 게임 / 3인칭 / PVP
게임규모가 작기 때문에 바로 로비로 입장하고
방을 만들거나 랜덤방을 입장하도록 구현하였습니다.
3가지 동기화 방식을 상황에 맞게 게임적용시켜 팀대전 탱크게임을 구현하였습니다.
방에 입장하면 게임이 바로 시작 되는게 아니라 게임 래디와 팀을 정하도록 구현하였습니다.
각 유저별로 팀 선택과 래디가 완료되면 게임이 시작되고
방을 나가거나 방정보가 변경되면 변경점이 적용되도록 구현하였습니다.
3가지 방식중 RPC방식을 사용하여 게임에서 채팅을 할수 있게 구현하였습니다.
포톤의 OnPhotonSerializeView를 사용하여
탱크의 몸통부분의 움직임을 동기화 하는 소스코드입니다.
동기화 오류로 존재할 수 있는 좀비 탱크와 같은 버그등을 발생하지 않게 하기 위해
HP와 탱크의 상태를 동기화에 버그를 수정하였습니다.
대미지와 HP동기화에 경우 및에서 설명하겠습니다.
포톤의 OnPhotonSerializeView를 사용하여
탱크의 포탑부분의 움직임을 동기화 하는 소스코드입니다.
포탑과 포신의 경우 하늘을 보게 되면 작동하지 않는 버그를 해결하기 위해
거대한 구 Collider를 추가하고 내부에서 레이어를 하나 쏘고
반대 방향으로도 계산하여 레이어를 쏴서 하늘을 보더라도 작동하게 수정하였습니다.
포톤의 OnPhotonSerializeView를 사용하여
탱크의 포신부분의 움직임을 동기화 하는 소스코드입니다.
포탄을 발사하는 소스코드입니다.
포탄을 발사할때 유저의 ID값을 포탄에 추가하여
대미지를 받을때 사용하도록 구현하였습니다.
대미지를 받으면 포탄의 저장된 유저 ID값을 확인해
자기 자신이나 아군이 쏜 포탄일 경우 대미지를 안 받게 구현하였습니다.
대미지를 입으면 HP도 동기화 해주어 좀비탱크가 생기지 않게 수정하였습니다.
Tank Attack 에서 배운 Photon서버를 활용한 간단한 3DRPG게임