[NDC 14] '미쿠미쿠하게 해줄게' - MMD MV 제작 사례와 매력적인 캐릭터 애니메이션Nexon Korea
NDC14에서 발표한 내용입니다.
취미작업을 중심으로 매력적인 캐릭터 애니메이션은 어떻게 하면 좋을까 고민했던 내용이며,
설명이 미흡할만한 부분을 공개버전엔 조금 추가했습니다.
본 발표 내용은 소속된 조직과는 관련 없습니다.
* 포함된 영상에 소리가 있습니다. 볼륨 조심하세요.
[NDC 2014] 유저 수만큼 다양한 섬을 만들자
<야생의>의 절차적인 섬 생성 기법
발표장에서 시간이 없어서 답변드리지 못했던 Q&A 내용들을 뒷 부분에 추가하였습니다.
GIF 가 포함된 부분은 잘 나오지 않으므로 궁금하시면 직접 다운로드 받아서 보시기 바랍니다. - http://goo.gl/UUKmjL
[NDC14] 타임라인 던전 포스트모템 - 스마트폰 시대의 머드게임과 SNSYounger Jo
머드게임은 그래픽 기술의 발전과 함께 역사속으로 사라졌습니다. 시커먼 화면 속의 단 몇줄의 텍스트가 만들어내던 상상의 즐거움은 더 이상은 불가능한 것일까요? 본 세션은 트위터의 사용자 경험에서 착안하여 개발된 모바일 RPG "타임라인 던전"의 개발과정을 소개하고 이를 통해 머드게임이 어떤 방식으로 스마트폰에서 재창조될 수 있는지 살펴봅니다.
NDC14 - 엄마와 누나가 게임을 즐기는 법 : [에브리타운 for kakao] 서비스 포스트 모텀Young Keun Choe
Nexon Developers Conference 2014 에서 발표한 자료입니다. 약간의 오탈자 수정 후 공유합니다.
* 발표자 소개 *
現 [에브리타운 for kakao] PD. [에브리팜], [에브리타운 온라인] 등 에브리타운 시리즈를 기획해 온 경력 9년차 기획자.
* 세션소개 *
2013년 3월 5일 런칭하여 2013년 5월 5일까지, 약 1년 2개월 동안 구글플레이 매출 순위 기준, 4위~27위에서 한 번도 벗어나지 않으면서 SNG 분야 매출 기록을 현재진행형으로 경신해 나가고 있는 [에브리타운 for kakao] 의 서비스 포스트모텀 입니다. '게이머'임이 틀림없는 '게임 기획자'가 '논게이머'인 유저들, 즉 우리의 엄마, 이모, 누나들을 만나면서 겪었던 시행착오 및 그에 필요한 성공적인 운영전략 등을 공개할 예정입니다. 비슷한 컨셉의 유저층을 타겟으로 하는 게임을 기획/개발 중인 현업인과 사업 및 마케팅 담당자들에게 추천합니다.
NDC 2014 [48시간 만에 게임 만들기: '수줍은 메두사' 포스트모템과 게임 개발의 왕도]Imseong Kang
NDC 2014에서 발표한 슬라이드를 올립니다. 그외 정보들은 아래 링크를 참고해주세요.
* 게임 다운로드 페이지(윈도 전용)
http://globalgamejam.org/2014/games/peeping-medusa
* 게임 플레이 동영상
https://www.youtube.com/watch?v=gzESlDtHqhA
* 짧게 정리한 포스트모템 글
http://imseongkang.wordpress.com/2014/01/29/peepingmedusapostmortem/
* 정제되지 않은 44시간의 개발 기록
http://imseongkang.wordpress.com/2014/01/27/peepingmedusa/
게임 개발사에서 개발PM(팀장)의 역할과 책임
넥슨 개발자 컨퍼런스 2014
NDC 14 에서 강연하였던 내용입니다.
----------------------------------------------------------
1. 개발 PM이란? 스케줄 관리와 인재/자원 관리
- 마스터 플랜 공유
- 돌발이슈를 고려
2. 개발사 팀장(PM)으로 살아가기 - 리딩의 방법과 권한 이임
- 서포트형 리더십
- 권한 이임 - 잘 할 수 있는 건 잘 하게 만들자!
3. 팀장(PM)의 우선업무
- 팀장의 우선 업무는 개발일까? 관리다!
4. 헬키드, 마이리틀피쉬에서 청풍명월 for Kakao 까지
5. 개발 PM의 비전
User experience Design에 활용되는 각종 용어 정리Dong Chan Shin
User experience를 이해하는데 필요한 각종 용어 정리
게슈탈트 시지각 법칙
접근성
심미적-사용성 효과
행위유발(어포던스)
원형
면적정렬
의미덩이 만들기(chunking)
인지 부조화
일관성
항상성
제약(constraint)
컨트롤
정보처리리의 깊이
희망 노선
개발주기
시작점
오류
2013년 NHN NEXT 산출물
3. 2차원 배열 클래스를 제작하기 위해
내부에 1차원 배열 클래스를 두어
1차원 배열의 1차원 배열로 구현하는 2차원 배열
…
또 다른 객체를 대신하는 객체를 두는 방법을
프록시 객체라고 하고
객체를 생성하는 클래스를 프록시 클래스라 함
예제에서는
내부에 있는 1차원 배열 클래스를 프록시라고 할 수 있음
4. 프록시 클래스의 국가대표급 응용 사례
Operator[]의 읽기/쓰기 동작을 구분하는 것
여기서 잠깐!
Lvalue, Rvalue에 대해서 이해 하는 것 잊지마세요
http://kholdstare.github.io/technical/2013/11/23/moves-demystified.html
5. 프록시 클래스로 읽기 쓰기 구분이 단순하지 않습니다.
29장에서 봤던 방법으로는 해결이 안됩니다.
아래 코드에서 멤버 함수의 호출 상태를 고려하지 않는다는 문제!
그래서 지연평가를 활용해야 하는데
지연 시간을 벌어주는 일이 프록시 클래스 역할
operator[]호출 후 반환 프록시가 어떻게 사용되나 확인 후
읽기/쓰기를 구분 짓는 것
6.
7. 하지만 여전히 문제가 있어요
반환 값의 타입이 바뀌게 되면 또 컴파일 에러가 나옵니다
해결 방법은
해당 클래스의 주소 연산자 오버로딩
그런데 이런 상황은 대입 연산 대상으로는 괜찮은데
+=, ++ *=, <<= 등등에서는...
또 오류가 나오네요
필요한 연산자를 모두 정의해야 되는 문제가 있음
8. 또 다른 문제!
반환 값이 프록시 객체이기 때문에 생각한 동작이 안 나온다
원래 객체에 적용할 수 있는 함수를 모조리 오버로딩
그래도 또!
비상수 객체 참조자를 받는 함수의 매개변수로 프록시를 넘기면...
9. 그래서 설계 단에서 거부되는 경우도 있다고 하네요
하지만 잘 쓰면 유용하니 오류가 날 부분을 확인하고 쓰세요
10. 함수를 두 개 이상의 객체에 대해 가상 함수처럼 동작하도록 하기
= 이중 디스패치 만들기
SKYLAB스러운 예제와 함께 보겠습니다
우주의 서로 다른 객체가 충돌하는 함수 예제
원하는 내용을 다시 정리하면
동적으로 객체 간 충돌을 구현하고 싶은 것
단, 새로운 객체 타입이 생기는 경우
코드 변화가 최소여야 함
11. 가상 함수 테이블의 유사 구현을 활용
map 자료구조에서 이름과 함수 객체를 가짐
들어오는 이름에 따라서 해당 함수 객체를 실행함
자료의 생성주기는 정적 데이터로 선언하면
프로그램의 생성과 소멸이 자동으로 해결
12. map을 만들고 접근하는 건 알겠는데
초기화가 되어 있어야 하지 않나요?
어떻게 Handle할지 결정할 데이터로 채워야 합니다.
충돌 처리 함수가 클래스 멤버인 경우
새로운 파생 클래스가 게임에 추가되면
여전히 클래스 정의를 수정해야 하는 문제가 있음
=> 충돌 처리 함수를 밖으로 뺀다면?!
13. 이름 없는 네임스페이스가 포인트
컴파일 단위에서만 의미를 가지고 외부에서 확인 못 함
즉 함수 앞에 static을 붙여 정적 함수로 선언한 것과 같음
충돌처리 함수를 정적 영역에서 처리
14. 그런데... 객체에 또 상속 받는 자손들이 생기면?!
그래서 구조를 다시 바꿔 봤습니다
클래스의 객체가 전역메모리에 올라오는 동시에
필요한 함수가 자동으로 등록 되는 형태
15. 하지만 처음 의도처럼 완벽하지는 않습니다.
다중 디스패치를 완벽하게 구현하는 방법은 없습니다.
그나마 그존 코드를 거의 변경하지 않는 방법이 있죠
16. 미래 지향적인 개발자?!
미래 지향적인 프로그래머?!
정확할 건 정확하게 해주는 것
위험한 것을 경계하는 것에서 시작
• C++ 특징으로 못할 것은 막아 버림
절대 상속이 일어나지 않는 클래스는 막아버리고
힙에 인스턴스가 생성 되어야 하면 힙에만 만들어 지도록
복사, 대입이 불필요하면 private 선언으로 틀어 막는 등
• 멀쩡한 함수를 가상함수로 만들지 말 것
• 대입 복사 생성은 컴파일러가 기본으로 만들어 버림
필요 없으면 확실히 제거
• 코드 이식성 유지
• 캡슐화
기조: 황당함 최소화의 원칙
17. 이외에도...
• B*가 실제로 D를 가리키는 경우에만 B에 대한 가상 소멸자가 필요합니다
• 다중 상속이 이루어진 클래스 계통 구조에 소멸자가 한 곳에라도 끼여 있으면
모든 기본 클래스에는 가상 소멸자가 들어가야 함
• String클래스는 vtbl을 추가하고 싶지 않아 가상 소멸자가 아니다
등등...
완벽한 코드를 만들기 위한 일반적인이야기들
더 자세한 내용은 책을 통해
18. 어라?
우리는 C++ 게임 만들고 있었는데요...
C와 C++는 당연히 뗄수 없는 관계다
하지만 한 프로그램에서 사용할 때 주의할 점은
분명히 존재한다
19. • 네임 맹글링
• 정적 데이터 초기화
• 동적 메모리 할당
• 자료구조 호환성
C++로 업그레이드 되며 생기거나 변환된 녀석들이
문제를 일으킬 가능성이 있다!
해결책!
• 컴파일러가 생성하는 목적 코드 호환성 확인
• 두 언어에서 동시 사용되는 함수는 extern “c”선언
(네임 맹글링 방지)
• main은 C++로 작성
• new로 할당된 메모리는 delet로
malloc으로 할당된 메모리는 free로
• 전달 데이터 타입은 C로 컴파일 되는 것으로 만
20. C++ 언어의 최신 표준안과 표준라이브러리에 대해 익숙해지자.
여기서 이야기하는 최신은?!
아.. 네 10년전?!
21. 이미 VS2013에는 많은 것이 적용되었고
effective c++ 개정판에 포함된 내용도 많아요
현재 기술이라 생각하고 한 번 보시면 될 것 같습니다
(책 보세요)