• 게임 개발 프로젝트를 참여해서 프로젝트 목표는 달성
했으나 내가 목표로 한 부분에서는 제대로 완성 해
본 이력이 없어 시도함
• 유니티 실무 경험이 없어 대신 경험 삼아
직접 포트폴리오용으로 만듦
• 유니티 예제같은 것을 보고 배우는 것은 한계가 있어
직접 개발해 보며 작게 나마 경험을 쌓기 위해
• 게임 시스템 소개 :
캐릭터 – 이동(주사위갯수)만큼 주사위를 굴력 이동,
공격(주사위갯수)만큼 이동 중 적과 조우 시 전투 주사위를
생성,
방어(주사위갯수)만큼 이동하는 적과 조우 시 전투 주사위
를 생성,
지력(수치)만큼 전투시 도움을 준다.
그런 능력치들를 이용해 장애물을 넘어 골인지점까지
가야한다.
파티 – 같은 팀 캐릭터와 첫 발판을 제외한 같은 발판에
있게되면 파티를 할 수 있다. (오른쪽에서 2~3번째 캐릭터
가 전투시 지력으로 지원을 하고 마지막 캐릭터가 방어 시
방어 주사위 개수로 방어를 함)
• 게임 시스템 소개 :
타일 – 3or4칸 이동, 감옥, 아이템 획득, 전투,
도착하면 임의의 타일로 교체
다음 턴 낮은 수 이동 주사위, 다음 턴 높은 수 이동 주사위,
시작, 골인,
도착시 현재 전역 속성이 타일의 각 속성으로 교체되는 타일
[Sword(공격+2,지력-2), Cup(지력+2,공격-2),
Disk(이동+2, 방어-2), Wand(방어+2, 이동-2) ]
( * 현재 버전에서는 타일 이벤트가 아직 미구현입니다.)
• 게임 시스템 소개 :
적 – 맵의 타일에 각각 배치되어 있고 직접 싸움을 걸지 않고
플레이어가 걸면 전투를 함, 플레이어가 전투에서 이기면
사라지고, 적이 이기면 플레이어 캐릭터는
이동 전의 타일 로 돌아감
• 게임 UI 소개(1) :
팀 색, 유저 닉네임, 선택한
캐릭터의 코스트
맨 왼쪽의 X버튼 유저 슬롯 열
기/닫기
캐릭터 이름, 코스트가 표시되어 있고
선택할 수 있는 버튼
좌우 버튼으로 맵 선택
선택한 캐릭터 능력치 표시
게임 시작 버튼
• 게임 UI 소개(2) :
현재 속성 (무속성 NONE부터
시작) 턴 수
미니
맵
파티 시 현재 캐릭터 위치 이동, 현재
캐릭터 파티 탈퇴
이동 주사위 굴
리는 버튼
이동할 캐릭터를 선택하는 버튼
• CSVParser : FileInfo, TextReader클래스를 이용해 특정 위치에 있
는 csv파일 읽어오게 해 데이터를 읽어오는 클래스,
모든 Loader클래스들이 이 클래스를 상속받음
• CharacterLoader : 캐릭터 정보를 읽어오는Loader,
읽어온 정보를 MovingObjInfo타입으로 저장하고 특정 캐릭터
enum값을 넘겨받으면 그 캐릭터에 정보를 반환하는 기능 있음
• MapLoader : 맵에 배치될 Tile들의 속성, 위치를 읽어오는 Loader,
읽어온 정보를 TileInfo타입으로 저장하고 MapManager에게 넘겨
준다.
• MapListLoader : 맵들의 정보(인덱스, 이름, 제한 캐릭터 Cost)를
읽어오는 Loader, MapInfo타입으로 저장하고
watingRoomManager에 넘겨준다.
• BasicManager : 모든 Manager클래스의 부모 클래스,
이 클래스를 상속 받은 모든 Manager클래스에 싱글톤 패턴이 적용되
게 함
• GameManager : User의 InGame, 캐릭터 정보를 관리
• MapManager : Tile, Enemy, Character 오브젝트를 배치,
Tile타입에 따라 Sprite교체
• RaceManager : 주사위 오브젝트를 생성, 주사위 눈 값 얻기,
캐릭터 이동관련 이벤트, 턴 이벤트
• BattleManager : 전투를 벌일 두 오브젝트 생성 및 애니메이션 제
어, 전투 관련 주사위 생성, 전투 관련 이벤트
• UIManager : NGUI오브젝트들을 제어, UI관련 정보 입출력
• CharacterManager : 이전 Scene에서 받아온 캐릭터, 적 오브젝트들을
생성 및 관리
• MovingObjInfo : CharacterPiece, Enemy오브젝트의 공통으로
가지고 있을 정보(인덱스, 팀, 능력치)를 가짐
• MovingObject : CharacterPiece, Enemy오브젝트의 공통으로
가지고 있을 이동, 애니메이션관련 함수를 가짐
• CharacterPiece : Tile 이동, 충돌된 오브젝트(Tile, Enemy)에 따른 이
벤트(파티or전투) 로직
• Enemy : 현재 밟고 있는 타일 반환
• UserCharInfo : User가 플레이하는 캐릭터에 대한 정보와 InGame
에서 필요로 하는 User정보를 관리
• Tile : Tile의 속성(특수타일, 적 타일, 이전 타일, 이후 타일 등)을
가짐
• CameraControl : 현재 차례에 선택된 캐릭터를 따라 다니게
하는 카메라 이동 로직
• Dice2D : 전투 페이즈 때 쓰는 스크립트, Sprite 이미지와 Animator를
이용해 주사위를 나타냄
• UI_ArrowButton : 현재 움직이는 캐릭터가 갈림길을 만났을 때
나오는 화살표 UI 오브젝트의 스크립트, 캐릭터 오브젝트 좌
표를 이용해 NGUI좌표로 변환 후 화살표 UI 오브젝트
좌표 수정, 클릭한 방향으로 이동하게 하는 로직
• UI_SlotButton : 좌측 하단의 캐릭터 슬롯의 스크립트, 슬롯에 대 한
캐릭터 인덱스를 반환
• UI_MiniMap : 우측 하단의 맵의 Tile, 캐릭터, 적의 현재 위치를 표시
하는 UI 스크립트
• 중요 기능을 우선 개발 [구현]
이동 & 전투 시스템 : 플레이어가 굴려서 나온 주사위 눈만큼
이동, 전투를 하는 시스템
파티 시스템 : 2~3개의 캐릭터가 같은 Tile에 있을 경우
파티를 맺어 같이 이동/전투를 하는 시스템
턴 시스템 : 조작할 수 있는 플레이어 외에 플레이 AI를
추가하고 AI에게 턴을 넘기는 기능 구현
PvP 전투 : 맵에 배치된 적이 아닌 캐릭터들간의 전투 구현과
전투 애니메이션 완성
UI : 팀 표시, 미니 맵, 파티 안내 메시지, 턴 표시, 승리 표시,
인게임 외의 Scene UI 구성
Camera 제어 : 현재 이동하려는 캐릭터를 따라 이동하는
로직을 구현
• 그 외 부가 기능 [미구현]
Tile 속성 부여 : 감옥이나 주사위 확률 조정, 아이템 획득 같은
이벤트를 발생시키는 Tile 제작
스킬 & 아이템 : 사용 시 캐릭터 능력치나 이동, 전투 상황이
변화하는 기능 추가
• 유니티 C# 환경에서의 싱글톤
각 Manager클래스마다 유일한 인스턴스들을 가질 수 있고
어디서든지 그 인스턴스를 접근하기 위해서 쓰였음
Class BasicManager
{
private static BasicManager instance;
private static GameObject container;
public static BasicManager GetInstance(){
if( !instance )
{
container = new GameObject();
container.name = “BasicManager”;
instance = container.AddComponent(
typeof(BasicManager)) as BasicManager;
}
return instance;
}
}
• 유니티 타이머 Invoke()
일반적인 Timer()대신 MonoBehaviour가 지원하는
Invoke()함수가 있다.
Invoke( string methodName, float time )
- methodName 메소드를 time 초 후에 호출
InvokeRepeating( string methodName, float time,
float repeatRate )
- methodName 메소드를 time 초 후에 호출 후에 repeatRate 초
마다 반복 호출
CancelInvoke()
- 이 함수가 쓰여진 스크립트에 있는 모든 Invoke를 취소
CancelInvoke( string methodName )
- 이 함수가 쓰여진 스크립트에 있는 methodName를 호출하는
모든 Invoke를 취소
• Coroutine()
특정한 일을 단계적으로 발생하게 하거나 시간에 흐름에
따라 발생하거나 다른 연산이 완료될 때까지 기다리는
루틴을 작성할때 사용
yield return null
- Update구문의 완료될때까지
대기
yield return WaitForEndOfFrame
- 현재 프레임의 렌더링 작업
이 끝날때 까지 대기
yield return WaitForFixedUpdate
- FixedUpdate구문이 완료될때
까지 대기
Yield return www
- 웹에서 데이터 전송이 완료될때
까지 대기
• NGUI 버튼 이벤트 동적 할당 방법 - 1
SetUIButtonEvent함수로 버튼객체에 이벤트를 전달
게임플레이를 하면 동적으로 할당한 이벤트함수가
옆에 OnClick아래 Notify에 들어간걸 확인할 수 있다.
UIManager.cs
Battle
Manager.cs
• NGUI 버튼 이벤트 동적 할당 방법 - 2
연결한 이벤트 함수인 OnClickRollButtonInBattleZone함수,
전 슬라이드에서 나온 함수 SetUIButtonEvent에서 설정한 것과
같이 매개변수 개수와 타입이 같은 걸 볼 수 있음
Battle
Manager.cs
• 모든 데이터들을 외부 csv파일에서 읽어오기 - 1
맵에 배치하는 캐릭터, 적, Tile들을 하드코딩으로 배치하기
보다는 외부 csv파일에서 정해진 데이터를 가지고 배치하는
로직만 돌려주면 데이터를 컨트롤하는데 수월할 것 같아
적용해보기로 함
• 모든 데이터들을 외부 csv파일에서 읽어오기 - 2
모바일 환경에서 게임을 구동하려면
FileInfo대신 Resources.Load();를 사용해야 한다.
• 이동 로직
처음에는 위 그림처럼 상하좌우 Raycast를 쏘아 Ray와 충돌하는 Tile를 검사
하지만 단점이 많음
주위 Tile이 몇 개 있는지…
이미 지나온 Tile에 대한 예외 처리
다음 Tile이 위치한 방향이 현재 Ray방향과 맞지 않다면?
그래서 해결책으로 현재 밟고 있는 Tile에 이전 Tile과 다음 Tile들 정보를 가
• 전투 페이즈의 주사위 이벤트
GameObject SquareDice에 Aniamtor적용 후
StateMachine에 따라 애니메이션 동작을 시작하게 하고
Rolling상태가 되었다가 아무런 애니메이션도 없는 Ready상태로 바꾸게 했음
그때 SpriteRenderer에서 Sprite을 바꿔도 적용되지 않는 문제가 생김
해결방안으로 Animator를 Enable을 false한 후 Sprite교체
• 스크립트 초기화 순서 문제
UIManager스크립트를 NGUI오브젝트인 UIRoot오브젝트에
붙여서 게임 실행했을 당시에는 잘되는데 유니티 재시작 후
다시 게임 실행해보면 다른 스크립트에서 UIManager의
instance를 사용하려 할때 UIManager의 instance가
생성되지 않았다고 에러 메세지가 나옴
• 스크립트 초기화 순서 문제
스크립트 호출 순서가
문제가 있는지 의심이 되어
스크립트 선택 후 Inspector창에 있는
Execution Order버튼 클릭
UIManager스크립트 드래그 해서
나타난 리스트에 추가
실행 순서 설정
값이 작을 수록 먼저 실행됨
• 참고 사이트
NGUI Tutorials :
https://www.youtube.com/user/ArenMookR5/playlists
Unity 2D Tutorial :
https://www.youtube.com/watch?v=Fdcnt2-Jf
4w&list=PLX2vGYjWbI0SKsNH5Rkpxvxr1dPE0Lw8F
Unity 개발 팁 :
http://unityindepth.tistory.com/