Publicidad

Port polio게임 소개

8 de Sep de 2015
Publicidad

Más contenido relacionado

Presentaciones para ti(20)

Publicidad

Similar a Port polio게임 소개(20)

Publicidad

Port polio게임 소개

  1. 지원자 - 서영훈 개발 기간 – 2015/06/17 ~ 2015/08/17 (중간에 개인 사정으로 보름을 쉬어 총 개발 기간은 한달 반입니다.) DICE OF WAR 게임 소개
  2. • 만드는 이유 • 어떤 게임 • 지금까지 한 것 • 개발하면서 공부하게 된 부분 • 어려웠던 부분
  3. 만드는 이유
  4. • 게임 개발 프로젝트를 참여해서 프로젝트 목표는 달성 했으나 내가 목표로 한 부분에서는 제대로 완성 해 본 이력이 없어 시도함 • 유니티 실무 경험이 없어 대신 경험 삼아 직접 포트폴리오용으로 만듦 • 유니티 예제같은 것을 보고 배우는 것은 한계가 있어 직접 개발해 보며 작게 나마 경험을 쌓기 위해
  5. 어떤 게임을?
  6. 주사위 잔영 (개발사 : 소프트맥스[2001])을 그대로 한번 만들어 보자!! 에서 시작 포트폴리오로 어떤 게임을 만들어 볼까 고민 중…
  7. [가칭]DiceOfWar • 장르 : 2D 주사위 보드게임 • 개발환경 : Unity5.1.1f1, VisualStudio2010 • 사용에셋 : DicePackLight 1.3(이동주사위), NGUI Next-Gen UI 3.9.0b(UI), Colorable FantasyUI(UI Atlas) • 사용 스프라이트 : 주사위 잔영, 라그나로크 온라인
  8. • 게임 시스템 소개 : 캐릭터 – 이동(주사위갯수)만큼 주사위를 굴력 이동, 공격(주사위갯수)만큼 이동 중 적과 조우 시 전투 주사위를 생성, 방어(주사위갯수)만큼 이동하는 적과 조우 시 전투 주사위 를 생성, 지력(수치)만큼 전투시 도움을 준다. 그런 능력치들를 이용해 장애물을 넘어 골인지점까지 가야한다. 파티 – 같은 팀 캐릭터와 첫 발판을 제외한 같은 발판에 있게되면 파티를 할 수 있다. (오른쪽에서 2~3번째 캐릭터 가 전투시 지력으로 지원을 하고 마지막 캐릭터가 방어 시 방어 주사위 개수로 방어를 함)
  9. • 게임 시스템 소개 : 타일 – 3or4칸 이동, 감옥, 아이템 획득, 전투, 도착하면 임의의 타일로 교체 다음 턴 낮은 수 이동 주사위, 다음 턴 높은 수 이동 주사위, 시작, 골인, 도착시 현재 전역 속성이 타일의 각 속성으로 교체되는 타일 [Sword(공격+2,지력-2), Cup(지력+2,공격-2), Disk(이동+2, 방어-2), Wand(방어+2, 이동-2) ] ( * 현재 버전에서는 타일 이벤트가 아직 미구현입니다.)
  10. • 게임 시스템 소개 : 적 – 맵의 타일에 각각 배치되어 있고 직접 싸움을 걸지 않고 플레이어가 걸면 전투를 함, 플레이어가 전투에서 이기면 사라지고, 적이 이기면 플레이어 캐릭터는 이동 전의 타일 로 돌아감
  11. • 게임 UI 소개(1) : 팀 색, 유저 닉네임, 선택한 캐릭터의 코스트 맨 왼쪽의 X버튼 유저 슬롯 열 기/닫기 캐릭터 이름, 코스트가 표시되어 있고 선택할 수 있는 버튼 좌우 버튼으로 맵 선택 선택한 캐릭터 능력치 표시 게임 시작 버튼
  12. • 게임 UI 소개(2) : 현재 속성 (무속성 NONE부터 시작) 턴 수 미니 맵 파티 시 현재 캐릭터 위치 이동, 현재 캐릭터 파티 탈퇴 이동 주사위 굴 리는 버튼 이동할 캐릭터를 선택하는 버튼
  13. 지금까지 한 것
  14. Character Manager 대기방 요 클래스 구조 소개 MapLoader MapLoader MovingObjInfo UserInfo MapInfo … … 본인이 작성한 클래스 위주로 구조를 나타내었음
  15. Character Manager GameManagerMapManager BattleManager UIManager 인게임 주요 클래스 구조 소개 RaceManager Tile MapLoader Tile BasicManager MovingObjInfo … …… CharacterPiece MovingObject … Dice2D … UserCharInfo … CameraControl UI_ArrowButton UI_SlotButton본인이 작성한 클래스 위주로 구조를 나타내었음
  16. • CSVParser : FileInfo, TextReader클래스를 이용해 특정 위치에 있 는 csv파일 읽어오게 해 데이터를 읽어오는 클래스, 모든 Loader클래스들이 이 클래스를 상속받음 • CharacterLoader : 캐릭터 정보를 읽어오는Loader, 읽어온 정보를 MovingObjInfo타입으로 저장하고 특정 캐릭터 enum값을 넘겨받으면 그 캐릭터에 정보를 반환하는 기능 있음 • MapLoader : 맵에 배치될 Tile들의 속성, 위치를 읽어오는 Loader, 읽어온 정보를 TileInfo타입으로 저장하고 MapManager에게 넘겨 준다. • MapListLoader : 맵들의 정보(인덱스, 이름, 제한 캐릭터 Cost)를 읽어오는 Loader, MapInfo타입으로 저장하고 watingRoomManager에 넘겨준다.
  17. • BasicManager : 모든 Manager클래스의 부모 클래스, 이 클래스를 상속 받은 모든 Manager클래스에 싱글톤 패턴이 적용되 게 함 • GameManager : User의 InGame, 캐릭터 정보를 관리 • MapManager : Tile, Enemy, Character 오브젝트를 배치, Tile타입에 따라 Sprite교체 • RaceManager : 주사위 오브젝트를 생성, 주사위 눈 값 얻기, 캐릭터 이동관련 이벤트, 턴 이벤트 • BattleManager : 전투를 벌일 두 오브젝트 생성 및 애니메이션 제 어, 전투 관련 주사위 생성, 전투 관련 이벤트 • UIManager : NGUI오브젝트들을 제어, UI관련 정보 입출력 • CharacterManager : 이전 Scene에서 받아온 캐릭터, 적 오브젝트들을 생성 및 관리
  18. • MovingObjInfo : CharacterPiece, Enemy오브젝트의 공통으로 가지고 있을 정보(인덱스, 팀, 능력치)를 가짐 • MovingObject : CharacterPiece, Enemy오브젝트의 공통으로 가지고 있을 이동, 애니메이션관련 함수를 가짐 • CharacterPiece : Tile 이동, 충돌된 오브젝트(Tile, Enemy)에 따른 이 벤트(파티or전투) 로직 • Enemy : 현재 밟고 있는 타일 반환 • UserCharInfo : User가 플레이하는 캐릭터에 대한 정보와 InGame 에서 필요로 하는 User정보를 관리 • Tile : Tile의 속성(특수타일, 적 타일, 이전 타일, 이후 타일 등)을 가짐
  19. • CameraControl : 현재 차례에 선택된 캐릭터를 따라 다니게 하는 카메라 이동 로직 • Dice2D : 전투 페이즈 때 쓰는 스크립트, Sprite 이미지와 Animator를 이용해 주사위를 나타냄 • UI_ArrowButton : 현재 움직이는 캐릭터가 갈림길을 만났을 때 나오는 화살표 UI 오브젝트의 스크립트, 캐릭터 오브젝트 좌 표를 이용해 NGUI좌표로 변환 후 화살표 UI 오브젝트 좌표 수정, 클릭한 방향으로 이동하게 하는 로직 • UI_SlotButton : 좌측 하단의 캐릭터 슬롯의 스크립트, 슬롯에 대 한 캐릭터 인덱스를 반환 • UI_MiniMap : 우측 하단의 맵의 Tile, 캐릭터, 적의 현재 위치를 표시 하는 UI 스크립트
  20. • 중요 기능을 우선 개발 [구현] 이동 & 전투 시스템 : 플레이어가 굴려서 나온 주사위 눈만큼 이동, 전투를 하는 시스템 파티 시스템 : 2~3개의 캐릭터가 같은 Tile에 있을 경우 파티를 맺어 같이 이동/전투를 하는 시스템 턴 시스템 : 조작할 수 있는 플레이어 외에 플레이 AI를 추가하고 AI에게 턴을 넘기는 기능 구현 PvP 전투 : 맵에 배치된 적이 아닌 캐릭터들간의 전투 구현과 전투 애니메이션 완성 UI : 팀 표시, 미니 맵, 파티 안내 메시지, 턴 표시, 승리 표시, 인게임 외의 Scene UI 구성 Camera 제어 : 현재 이동하려는 캐릭터를 따라 이동하는 로직을 구현
  21. • 그 외 부가 기능 [미구현] Tile 속성 부여 : 감옥이나 주사위 확률 조정, 아이템 획득 같은 이벤트를 발생시키는 Tile 제작 스킬 & 아이템 : 사용 시 캐릭터 능력치나 이동, 전투 상황이 변화하는 기능 추가
  22. 개발하면서 공부하게 된 부분
  23. • 유니티 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; } }
  24. • 유니티 타이머 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를 취소
  25. • Coroutine() 특정한 일을 단계적으로 발생하게 하거나 시간에 흐름에 따라 발생하거나 다른 연산이 완료될 때까지 기다리는 루틴을 작성할때 사용 yield return null - Update구문의 완료될때까지 대기 yield return WaitForEndOfFrame - 현재 프레임의 렌더링 작업 이 끝날때 까지 대기 yield return WaitForFixedUpdate - FixedUpdate구문이 완료될때 까지 대기 Yield return www - 웹에서 데이터 전송이 완료될때 까지 대기
  26. • NGUI 버튼 이벤트 동적 할당 방법 - 1 SetUIButtonEvent함수로 버튼객체에 이벤트를 전달 게임플레이를 하면 동적으로 할당한 이벤트함수가 옆에 OnClick아래 Notify에 들어간걸 확인할 수 있다. UIManager.cs Battle Manager.cs
  27. • NGUI 버튼 이벤트 동적 할당 방법 - 2 연결한 이벤트 함수인 OnClickRollButtonInBattleZone함수, 전 슬라이드에서 나온 함수 SetUIButtonEvent에서 설정한 것과 같이 매개변수 개수와 타입이 같은 걸 볼 수 있음 Battle Manager.cs
  28. • 모든 데이터들을 외부 csv파일에서 읽어오기 - 1 맵에 배치하는 캐릭터, 적, Tile들을 하드코딩으로 배치하기 보다는 외부 csv파일에서 정해진 데이터를 가지고 배치하는 로직만 돌려주면 데이터를 컨트롤하는데 수월할 것 같아 적용해보기로 함
  29. • 모든 데이터들을 외부 csv파일에서 읽어오기 - 2 모바일 환경에서 게임을 구동하려면 FileInfo대신 Resources.Load();를 사용해야 한다.
  30. • Excel에서 데이터 작성 후 csv형식으로 저장 그리고 적용 결과
  31. • 월드좌표에서 NGUI좌표로 변환 UI_ArrowButton.cs 주의! NGUI Camera오브젝트의 CullingMask로 NGUI오브젝트들의 Layer만 보여지게
  32. • [NGUI] Panel과 Depth 개념 Panel : UI Layer라고 생각하면 된다. Depth : 깊이, 0에 가까울수록 먼저 그리고 값이 클수록 나중에 그린다. 다른 UI오브젝트의 Depth보다 Panel의 Depth가 최우선 시 됨
  33. • [NGUI] UI오브젝트 동적 생성 - 1 아래의 코드를 참고하여 프로젝트에 맞게 코드를 수정함
  34. • [NGUI] UI오브젝트 동적 생성 - 2 csv파일에 읽어 들인 캐릭터들의 개수 만큼 NGUI 버튼 오브젝트를 동적 생성하도록 함
  35. 어려웠던 부분
  36. • 이동 로직 처음에는 위 그림처럼 상하좌우 Raycast를 쏘아 Ray와 충돌하는 Tile를 검사 하지만 단점이 많음 주위 Tile이 몇 개 있는지… 이미 지나온 Tile에 대한 예외 처리 다음 Tile이 위치한 방향이 현재 Ray방향과 맞지 않다면? 그래서 해결책으로 현재 밟고 있는 Tile에 이전 Tile과 다음 Tile들 정보를 가
  37. • 전투 페이즈의 주사위 이벤트 GameObject SquareDice에 Aniamtor적용 후 StateMachine에 따라 애니메이션 동작을 시작하게 하고 Rolling상태가 되었다가 아무런 애니메이션도 없는 Ready상태로 바꾸게 했음 그때 SpriteRenderer에서 Sprite을 바꿔도 적용되지 않는 문제가 생김 해결방안으로 Animator를 Enable을 false한 후 Sprite교체
  38. • 스크립트 초기화 순서 문제 UIManager스크립트를 NGUI오브젝트인 UIRoot오브젝트에 붙여서 게임 실행했을 당시에는 잘되는데 유니티 재시작 후 다시 게임 실행해보면 다른 스크립트에서 UIManager의 instance를 사용하려 할때 UIManager의 instance가 생성되지 않았다고 에러 메세지가 나옴
  39. • 스크립트 초기화 순서 문제 스크립트 호출 순서가 문제가 있는지 의심이 되어 스크립트 선택 후 Inspector창에 있는 Execution Order버튼 클릭 UIManager스크립트 드래그 해서 나타난 리스트에 추가 실행 순서 설정 값이 작을 수록 먼저 실행됨
  40. • 참고 사이트 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/
Publicidad