마지막께 11/28 꺼내요. c++에서 c# 문법으로 넘어 갔을때... 전체 과정으로 봤을때 그 후의 일들을 되짚어보자면....
유니티 2D, 유니티 3D, 지금은 서버(PHP, 포톤) 하고 있네요.
일단 2D 부터 보자면(벌써 4달전 이야기 라니...) 제가 2,3일 플젝처럼 몇개 한거로는 ..
먼저 슈팅 게임이 있겠네요. 1945스타일을 많이 따라 하려고 했고. 유니티의 기본들을 익히는 시간이었습니다. 스크립트 붙이고 콜라이더 translate 등등
제가 플젝하면서 한거는 최대한 컴포넌트 기반을 염두해 두면서 스크립트 들을 짜고 적AI 들은 어떤 Movement 컴포넌트를 붙이는 거에 따라서 waypoint를 찍으며 이동하고 어떤 Weapon 컴퍼넌트를 붙이면 어떤 공격을 하고 이런식으로 했고 마지막 보스는 그걸 합쳐 논거 처럼 했네요. 대충 슈팅 게임이 어떻게 돌아가는지 감이 많이 잡히는 플젝이었습니다. 직접 제 코드도 짜보고요. 여러 공격패턴(탄막패턴), 이동패턴 등등요.
그리고 2번째로 한게 본 애니메이션 사용하라는 플젝이었는데 저는 던파 같은 형식같은걸 만들었습니다. 거기서 전사, 법사, 궁수 3개의 클래스가 있고 직업을 바꾸면 다른 스킬이 나가고 스킬때 파티클 좀 써봤고요. 다양한 스킬을 어떻게 쓸지에 대해 생각하게 됬습니다. 전사는 돌진 스킬은 어떻게 구현할지 점프해서 땅에 칼 밖는 스킬 기모으기 같은 스킬 법사는 여러 방향으로 나가는 파이어볼. 메테오. 파이어 브레스. 궁수는 기본 활쏘기, 백 점프하면서 여러발 쏘기 등등요. 1인 스킬, 범위 스킬, 관통 스킬, 등등요.
3번쨰는 나루토를 베이스로한 던파 같은거 만들었네요. 그라나도 에스파다 아시는분은 아시겠지만 캐릭터 3개를 같이 컨틑롤 하는 게임인데 제가 고른 캐릭(UI의 버튼, 키보드) 은 제가 컨트롤 하고 다른 캐릭은 자동으로 AI모드로 돌아가게 했고. 요번 프로젝트를 통해 해보고 싶었던거는 상태와 이벤트 였습니다. 코루틴을 사용한 FSM(유한 상태 머신) 과 그걸 계층화(?)한 HFSM( Hierchical FSM ), 상속/ 인터페이스를 통한 여러캐릭 관리(나루토, 사스케, 사쿠라), UI 같은거 관리할때 이벤트로 하기와 애니메이션 상태머신은 anystate로 하기 등등이 있었습니다. 코루틴 베이스의 상태머신을 하면서 코루틴에 대해서 많이 알게 된거 같네요. 이건 게임쪽이나 유명한 이론이니 어떻게 구현하는지 해봤습니다. Redux같은거와 어떤 장단점이 있는지.(뭐 이전 글에도 썼지만 거의 같습니다... 몇가지 빼고) 기본적으로 상위 FSM으로는 AI 모드인지 플레이어 컨트롤 모드인지로 나눠서 enum에 맞게 코루틴으로 맞는 상태가 계속 돌고 그 하위 FSM으로는 각 캐릭 특화 상태들이 여러게 있어서(Idle, Run, Attack1, Attack2, Skill1, Skill2, 등등등) enum에 맞는 상태들이 돌아가고요. 상태 전이(?) transition은 setState("Attack1"){} 같은걸로 해서 최대한 declarative(선언적?) 하려고 노력은 했으나... 뭐 사실 대충 잘 돌아갑니다. 하튼 도대체 이렇게 구구절절 아무도 도움이 안될것 같은거롤 쓰는게 의미가 있겠습니다만 걍 추억 정리로 봐주세요. 이벤트도 Redux생각하면 하나에서 관리하려고 노력은 했습니다... 예를 들면 제가 캐릭을 바꾸는 동시에( UI에서든 키보드로든) 왼쪽위에 3개의 캐릭터 액자? portrait? 에서 선택한 애가 커지고 불나고 하면서 선택됬다는걸 보여주고 실제 게임 캐릭터도 선택된 캐릭터로 카메라 이동하고 선택됬다 하는 타겟팅 같은것과 스킬창들이 다 그 캐릭의 스킬로 바뀌고 쿨타임 등등 하나의 상태가 있고(캐릭이 나루토 인지 사스케인지 사쿠라 인지) 그에 맞게 모든 UI 등을 바꾸는 작업을 setActive나 enabled 를 하나하나 바꾸는게 아니라 모든 UI들 + 게임 오브젝트들이 하나의 Store같은 스크립트에 델리게이트, 이벤트(저는 Action 썼읍니다) 로 subscribe 하고 있다가 누군가가 상태를 바꾸면(Redux dispatch 같이요) 그 상태에 맞게 모든걸 바꾸는 거죠. 사실 이 이야기들 다 걍 만든거 보여드리면 되는데... 좀 쪽팔려서 그렇네요. 하튼 이거 하면서 델리게이트 이벤트던 콜백이던 비동기던 그런류를 한번 써봤습니다. 그외에 스프라이트등 가공하고 여러 스킬들 또 만들어보면서(나선환, 다중 그림자 분신술, 나루토 연탄 치도리, 호화구의술, 봉선화술, 사쿠라 스킬들) 더욱 좀 적응 된거 같습니다. 시간 멈추기도 써보고. 잡기 스킬(나루토 연탄)외 몇가지 시도해봤네요. 아 캐릭터 마다 위에 데미지바 도 있고 스킬쓸때 뒤에 컷씬 지나가기 카메라 이동 등등 지금 생각해보니 많을걸 한거 같네요 ㅎㅎㅎ 많은걸 해본 플젝이었습니다 이건 꽤 오래했네요 몇주정도.
4번째는 최근에 한건데 하다본 오버워치 같은 FPS를 만드는 거였습니다. 사실 만든다 보다는 네트워크와 데이터를 한번 해보고 싶었습니다. 네트워크라 함은..... 일단 리눅스를 오랜만에 다시 했습니다. Virtual box와 Vagrant를 깔아서 유니티 클라, 유니티 서버, 노드 서버 등등 서로서로 통신이 잘 되는지요. 맨처음 시도한건 노드랑 할려고 했으니 websoket류를 찾았습니다. 일단 Socket.io로는 되기는 합니다만 제대로는 안해봤습니다. 노드는 최신버전인데 유니티용으로 만들어놓은건 좀 옛날거여서요.. 근데 일단 서로 통신 되긴 합니다. 그리고 uWebSocket도 좀 써봤습니다. 완전 되있는게 없어서 모든걸 다 관리해야합니다... connect되있는 user들 들어올때마나 id주고 배열에다가 넣고 등등... websocket 좀 해봐서 좋았습니다 나중에도 당근 websocket 쓸꺼 같네요. 로그인이나 https(wss) 는 어떤지 궁금하네요.jwt나 뭐나 연결 어떻게 될지요 또 Nginx랑 어떻게 될지 유니티는 websocket sharp를 썼읍니다 일단 가장 많이 쓰고 있어서... 요것도 괜찮았습니다만 한가지 좀 귀찮은(?) 문제로는 유니티는 싱글 쓰레드 인데 이 websocket sharp가 멀티 쓰레드로 돌아가서.... 가령 서버든 클라던 통신이 오면 유니티 함수를 못 부릅니다. 쓰레드가 달라서요. 방법으로는 큐 같은거 놓고 통신해서 오는 내용들 다 큐에다가 넣고 유니티에서 update 돌면서 계속 큐 체크 하면서 dequeue하고 하는건데 이론상으로 알겠는데 이걸 또 하자니 뭔가 이렇게 복잡할일이 있나? 라는 생각이 들어서 하다가 UNET의 Transport layer라는.... 거에 손에 대길 시작했습니다. 일단 websocket sharp 하면서 쓰레드에 대한 생각을 많이 하게 됬네요. 직접 겪어보니 좀 좋았네요. 그래서 한게 Transport Layer 인데.... 이걸로 만들어서 대충은 나왔습니다. 유니티로 서버/클라 만들고 이동하는거 동기화 하고 총쏘고 죽이는거 까지요... 이야기가 당근 길어질수 밖에 없는게 엄청난양(?)의 글들을 읽으면서 네트워크 게임의 개념에 대해서 이론적으론 많이 알게 된거 같습니다. 일단 몇가지 아키텍쳐( 크게 Deterministic lockstep과 Dedicated Server)가 있었고 저는 FPS이므로 Source 엔젠 아키텍쳐인 Dedicated Server 로 했습니다. 짧게 요약하면 모든건 서버에서 관리되고( 이동거리, 데미지 판정, 모든 정보들 ) 각 유저는 모든 요청에 대해서 확인(correction)을 받습니다. 그리고 어쩔수 없는 Lag를 줄이고 사용자 경험을 높이기 위해서 클라단에서는 Client Side Prediction을 하고 클라단에서 시간 돌리기로 보정/Correction을 합니다. ( 웹쪽의 Optimistic UI의 최강판이라고 할까요) 적들은 Entity Interpolation 보간/보외법등을 사용하고 데미지 판정은 서버에서 (Server Reconiliation)시간돌리기로 판정합니다. 나는 현재시간으로 움직이고(Client Side Prediction) 나 이외의 다른것들은 과거의 시간(Entity Interpolation)으로 움직이고 모든 판정은 Server Reconciliation으로 합니다. 굉장히 흥미로운 주제가 아닐수 없는 그런 생각들이었습니다. 분산 시스템 이기도 하며 실시간이고 핵에 대해서도 많은 생각을 하게 되었고 직접 웹소켓류의 TCP, UNET의 LLAPI ( Low Level Api)인 Transport Layer를 통해서 UDP로 해보고 네트워크 개발의 어려움(테스트의 어려움. 패킷 손실, 순서 레이턴시 같은 통계, 새로운 기술의 그지같음ㅋㅋㅋ ) 완성을 좀 제대로 못해서 좀 짜증나긴 한데 이론적으로나 구현적으로 재밌는 부분이긴 했습니다.(사실 구현을 한게 뭐가 있나.... ㄷㄷㄷ)
이렇게 4개의 프로젝트를 하면서 유니티에 대해선 대충(?) 많이(?) 어느정도(?) 알게 된거 같습니다. 제가 문제인 코딩량이 적은건데 어느정도 코딩을 한거 같아서 실력은 좀 올랐길.... (바램)입니다. 정말 도움 안되는 글이네요. 걍 추억 되짚어 보기 입니다ㄷㄷㄷ 그냥 오늘은 주저리주저리 쓰고 싶네요.(원래도 그랬지만 ㅎㅎㅎ) 흠... 이거 다음은 뭘 쓸까요??
'~ 공부 ~ > Computer' 카테고리의 다른 글
일몰제161128 - C#, 푸념 (0) | 2016.11.29 |
---|---|
일몰제161128 - C++(feat. 언리얼) (0) | 2016.11.28 |
일몰제161128 - 코드랩(D3), 유니티 로드쇼 (0) | 2016.11.28 |
일몰제3편 - 언리얼(최적화 기법들, 수학) (0) | 2016.10.28 |
일몰제2편 - 언리얼(전반적, VR) (0) | 2016.10.28 |