구글 에드센스 광고


신입 게임 C# 프로젝트 포트폴리오 ( 참고자료 ) └→포트폴리오


이 게시물은 제가 신입 프로그래머로 취업 준비에 사용되었던 포트폴리오 입니다.

게임 프로그래머를 준비하시는 분들에게 도움이 되면 좋겠습니다~

p.s. 지금도 계속 진행중인 프로젝트입니다. :)
p.s.2 첨부된 사진들이 깨진게 있습니다... 바빠서..ㅠㅠ 다시 올리지는 않습니다.


※ InGame 스크린샷


※ 실행 영상




게임 이름 : HELLO_MY_WORLD
게임 장르 : 마인크래프트 모작
게임 플랫폼 : Windows7,10(PC)/ Android(Mobile) --> 멀티플랫폼 프로젝트.
개발 엔진 : Unity3D
개발 언어 : C#
사용한 라이브러리 : NGUI 3.x, ITween, JSonObject, NewtonSoft.json, Sqlite3(64/32bit), FMOD
구조 설명 :

프로젝트의 전체적인 개요는 위 그림과 같습니다.


1. UI
:

(1)
사용자의 인벤토리 및 아이템 제작 이며, 이는 NGUI 3.x 라이브러리 에서 제공하는 Scroll 기능을 활용했습니다.
(2) 게임 내 존재하는 아이템의 정보는 모두 Json 파일로 저장되어 있으며 
    게임 최초 실행시에 아이템 정보를 모두 Load합니다.
(3) 게임 내 존재하는 모든 UI 화면은 개별적인 유니티 엔진에서 제공하는 Scene으로 작성되어 있습니다. 인게임 화면에서
    해당 UI 화면을 불러들여 add 하는 형태로 관리합니다.
   ( 제작 및 인벤토리 상세 코드는 아래 링크를 참고해주세요. )
source#1 : (인벤토리 시스템 클래스)
source#2 : ( 제작 아이템 클래스 )
source# 3 : ( UI 씬 관리 )
source#4 : ( 아이템 정보 관리)

2. DATABASE :

(1)
게임 내 사용자가 습득한 아이템 또는 캐릭터 정보를 저장하기 위해 sqlite3 라이브러리를 이용합니다.
(2) sqlite3 에서 제공하는 API를 이용할 때 DB에 connect 하고 Data를 읽는등의 작업은 .Net의 IDisposable을
    상속받아 이용하기에 명시적으로 메모리 해제를 위해 Using 키워드를 이용해 해당 기능을 쓰고 있습니다.
    그리고 DB에 접속해서 데이터를 읽거나 쓰는 기능은 람다식으로 사용하고 있습니다. 따로 메서드나 클래스의
    인스턴스로 구현 후 쓰지 않는건 간단한 기능만 필요하기 때문입니다.
source# 1 : (인벤토리 시스템 클래스에 DB커넥션 후 데이터를 읽는 람다식이 있습니다. )

3. 지형 렌더링 및 충돌 :

(1)
마인크래프트 장르의 게임에서 지형은 복셀 형식을 취합니다. 
(2) 지형 렌더링은 아래 그림과 같이 진행됩니다. ( 그림이 깨졌네요...)
                  
전체 게임맵인 world 배열이 있습니다. world[x, y, z] 이며, 이 배열의 각 원소는1개의 block을 의미합니다.
배열 원소 수만큼 block을 게임 오브젝트로 생성하면 메모리 낭비가 커집니다. 또한 프레임저하도 발생합니다. 
따라서, N개의 block을 1개의 Chunk라는덩어리로 묶습니다. Chunk는 게임에서 1개의게임오브젝트 입니다.
Chunk를 생성할 때 N개의 Block의 렌더링에 필요한 vertex 정보를 가지고 있으며 이를 이용해 렌더링합니다.

source #1: (Chunk 생성 부분)
source #2: (Block class)

이 방식으로 지형을 렌더링하면 매우 큰 지형을 생성할 수 없습니다. 
world 의 x,y,z 값이 각 4096 이라면 4096^3 만큼의 값의 배열 공간이 필요하고 이는 컴파일러에서 오류로 처리합니다. 따라서, 1개의 배열의 최대 공간이 한정적이기에 전체 월드를 N개의 작은 월드로 나누어서 생성합니다. 

(3) 초기에 프로젝트 진행시 1개의 Chunk에는 유니티 엔진에서 제공하는 Mesh Collider 컴포넌트를 이용해 충돌체크를 했습니다.
그러나, Mesh Collider는 엔진에서 제공하는 다른 Collider 보다 효율성이 낮습니다. 비용도 큰편에 속합니다. 따라서, 복셀 지형 렌더링 특성상, 매우 많은 수의 block이 런타임에 존재해야 하기에 충돌체크는 가능하면 최소한의 비용을 추구해야 합니다. 그래서 Octree라는 구조에 대해 찾아보게 되었고 이와 관련해서 충돌에 관한 기능들을 직접 구현해서 사용하면 프로그래밍 공부에 도움이 되겠다 생각했습니다.
( ※ 참고한 유니티 엔진내 Collider 퍼포먼스 관련 글 )


복셀 지형에 적합한 자료구조로는 공간분할 기법중 하나인 Octree가 있습니다. 이와 더불어 각 Octree 노드가 AABB(경계상자)를
충돌체크에 이용하며, 사용자가 입력한 위치로 block을 생성/삭제 하기위해 RayCasting도 제작했습니다.

source #1 : (CustomOctree)
source#2 : (CustomAABB)
source#3 : (CustomRayCas)
Octree 관련 시연 영상 :




4-0. Actor ( 전체 구조 )



게임내에 움직일 수 있는 모든 오브젝트들은 Actor라는 추상클래스로 부터 상속되어 구체화 됩니다. (ex : NPC, Monster.. )
Actor는 움직일 수 있는 오브젝트들이 공통적으로 가지고 있는 어떤 속성이나 메소드를 가지고 있습니다.
그리고 실제 각 Actor들의 행동을 제어하는 부분(회전, 이동, 애니메이션)은 ActorController 라는 interface를 구체화 함으로서 각 오브젝트에 맞추어 구현됩니다. 그리고 NPC를 예로 들어 INpc 라는 별도의 interface가 있는데 이는 NPC 고유의 특성을 제어하는 메소드를 따로 관리하기 위해 존재합니다.
-> +@ NPC는 "말을 걸어 대화를 한다" 등이 있으며 몬스터의 경우 "쫓아가서 공격한다" 등의 고유의 특징적인 행동이 존재합니다.


4-1. Actor

( NPC & Monster OBB 및 A* 알고리즘 )



(1)
게임내에 존재하는 Npc, Monster의 경우
지형으로 생성된 Block들과 다르게 회전 또는 이동이 발생하므로 충돌처리에 OBB를 사용.

(2)
OBB의 경우 회전 또는 이동후의 Axis를 가지고 최대 15번의 판정을 한다.


(1) 게임 내 존재하는 Actor들의 길 찾기 알고리즘은 A*를 사용.
(2)
3D공간에서 A*를 이용하기 위해 다음과 같이 생각해보았다.

--> 2D 평면을 N개만큼 쌓아올리면 3D공간으로 볼 수 있다.
    따라서, 각 계층(=Layer)이 있고 움직이는 Actor가 계층이 바뀌면
    그 때 마다 새로운 길찾기를 시도한다.
    이 방법을 쓰면 계층이 바뀌는 순간마다 길찾기를 시도하므로
    적지 않은 비용이 발생한다.
   ( p.s.  새로운 방법을 고민중에 있습니다. )


4-2. Actor ( AI )


(1)
FSM ( 유한 상태 머신 ) 의 경우 구현이 간단하다. 그러나 위 그림 처럼 State가 추가되고 행동의 복잡성이 증가 할 수록
    state간의 구분과 각 state간의 연결고리를 만들기가 어려워진다. ( = 하드코딩의 시작 )
(2)
Behavior Tree(이하 BT)의 경우 이러한 FSM의 문제점을 막고자 AI의 행동들을 일반화 시킨 것.
(3)
BT를 이용하게 되면 행동들을 모듈화 시킬 수 있어 재사용성이 증가.

(4)
위 그림처럼, BT를 이용하면전체적인 AI의 흐름을 상대적으로알아보기 쉽다. 이는 결국 유지보수
    측면에서 이점을 나타낸다.


5. Network

(1) web-server와의 통신을 테스트하기 위한 목적의 시스템입니다.
   - 서버는 Node.js를 이용해서 구현되어 있습니다. 현재 간단한 로그인 기능을 처리하는 수준입니다.
   - 로그인 서버 및 아파치로 웹서버를 같이 운영하고 있습니다.
  • 서버 정보 : Centos 7(64bit) / 구글 클라우드 플랫폼
  • 서버 성능 : f1-micro(vCPU 1개, 0.6GB 메모리) HDD:10GB
  • 서버 주소 : 35.196.31.206 ( 고정 IP가 아니므로, 언제든 변경됩니다.)
(2) P2P 멀티플레이 기능은 유니티 API 에서 제공하는 UNet 기능을 사용하여 개발중에 있습니다.
   
 
soruce link :
https://github.com/opk4406opk/HELLO_MY_WORLD/blob/master/Assets/MyAssets/Scripts/Network/GameNetworkManager.cs



6. 게임 사운드

(1) FMOD 라이브러를 이용해 게임 사운드를 관리하고 있습니다.


핑백