SlideShare ist ein Scribd-Unternehmen logo
1 von 84
김대원
james.kim@devsisters.com
유니티 모바일 테스트 기법들
<솔리테어: 덱다웃>
1
강연자 소개
• 솔리테어: 덱다웃 _ 2016.04~2016.10
• 컨텐츠 업데이트 _ 2016.10~2017.01
• 쿠키런 for Kakao _ 2015.06~2016.04
• 마왕을 물리쳤다! for Kakao _ 2013.06~2015.06
김대원
james.kim@devsisters.com
2
그래서… 솔리테어가 뭔가요?
윈도우즈 카드놀이! 바로 이 추억의 게임!
3
때는 작년 3월, 이렇게 시작되었습니다
• 새로운 게임을 뭘 만들까, 고민하던 와중에…
iPhone 2016.03 Android 2016.03 iPhone 현재
언제나 영미권의 차트를 차지하고 있다
4
그런데, 기존 솔리테어들은 퀄리티가 낮다
광고 떡칠 구린 아트 낮은 깊이
Solitaire by Harpan
얼마 전 Zynga에 430억에 인수되었다
5
더 잘 만들 수 있겠다! 되지 않을까?
광고 떼고 이쁜 아트 깊게 파자
6
그렇게 나온 것이,
7
솔리테어: 덱다웃
8
솔리테어: 덱다웃
9
10
다시 작년 3월,
프로젝트를 시작할 즈음…
11
하지만 너무너무 많은 솔리테어가 이미 있었다…
경쟁력이 필요하다…
12
경쟁력을 갖기 위해 잘 해야만 했던 것
많은 컨텐츠
적은 버그
좋은 반응성
리텐션 요소
바이럴
직관적인 UI
적은 용량
신적화
스트레스 없는 플레이
스트레스 없는 플레이
매력적인 아트
좋은 피드백
높은 생산성
빠져드는 스토리텔링
레벨디자인
도전과 보상
모네타이제이션
그라인딩(노가다)
13
짧은 개발 기간, 적은 개발 인원
많은 컨텐츠
적은 버그
좋은 반응성
리텐션 요소
바이럴
직관적인 UI
적은 용량
신적화
스트레스 없는 플레이
스트레스 없는 플레이
매력적인 아트
좋은 피드백
높은 생산성
빠져드는 스토리텔링
레벨디자인
도전과 보상
모네타이제이션
그라인딩(노가다)
14
일하는 방식을 최적화 해야한다
많은 컨텐츠
적은 버그
좋은 반응성
리텐션 요소
바이럴
직관적인 UI
적은 용량
신적화
스트레스 없는 플레이
스트레스 없는 플레이
매력적인 아트
좋은 피드백
높은 생산성
빠져드는 스토리텔링
레벨디자인
도전과 보상
모네타이제이션
그라인딩(노가다)
15
높은 생산성? HOW?
• 혁신적인 워크플로우
• 잘 정의된 기획
• 빠른 컴파일 시간
• 올바른 라이브러리 선택
• 좋은 업무환경
• ……………
• 좋은 테스팅 기법
16
• 통계를 초기화해야하는데, 방법이 오직 재설치뿐이라면…?
• 업적을 구현하였는데, 테스트를 위해서 업적을 직접 깨야한다면…?
• 카드이미지를 새로 만들었는데, 풀빌드를 해야 볼 수 있다면…?
• 승리시 보상을 높였는데, 빌드를 다시 넣어줘야 한다면…?
• 아이템이 가챠에서 나오나, 직접 가챠를 돌려야 한다면…?
• 원하는 카드팩을 얻기 위해서, 플레이를 해야한다면…?
• “리뷰주세요” 팝업을 보기 위해서, 1시간을 플레이 해야한다면…?
• 친구초대 보상을 받기 위해서, 직접 초대를 다 해봐야 한다면…?
좋은 테스팅 기법은 높은 생산성의 열쇠다!
이런 식으로는 안 된다테스트를 잘 해보자
17
다양한 테스팅 기법들
랜덤 터치
테스트
자동화 테스트
CI
빌드후 테스트
인테그레이션
테스트
End-to-End
테스트
스트레스
테스트
서버쪽에서는…
데이터 검증
유닛 테스트
리그레션
테스트
빌드전 테스트
유니티가
Global state에 의존
디버거
로깅
디버깅 버튼
런타임 테스트
우리가
항상 하는 것! 모바일에서 더 잘해보자!
18
런타임 테스트를 더 잘해보자!
디버거
로깅
디버깅 버튼
런타임 테스트
우리가
항상 하는 것!
이를 위해 우리가 만든 것들,
유니티 정보
뷰어/편집기
기능 조작
기능 조작
(에디터 내)
동적
스크립트 실행
UnitySettings
CLI 바인딩
EditorWindow
LuaREPL
19
UnitySettings
유니티 내부 정보를 보여준다/설정한다
20
버그 배달왔습니다!
업적창에서 업적이 보이지 않는 상황!
테이블 초기화 중에 예외가 난 것 같은데…
21
확인을 위해 주섬주섬 로그를 남겨야 한다…
adb가 디바이스를 못 잡는다
원인은 Dictionary에
중복된 키값을 넣었던 것!
22
로그 하나 확인하는게, 왜 이렇게 힘든걸까?
FACT 1: 로그가 개발자에게 드러나지 않았다 (접근성이 낮음)
FACT 2: 로그는 유니티 내부의 정보이다
유니티 내부의 정보가
개발자에게 드러나지 않았다
23
로그 외에 다른 “내부 정보”들을 살펴보면,
• 시스템정보
• 빌드정보
• Hierarchy 정보
• 씬정보
• PlayerPrefs 정보
이런 유니티 내부의 정보를,
어떠한 프로젝트에서도,
개발자에게 잘 드러날 수 있도록,
GUI로 보여준다면?
24
UnitySettings: 그래서 우리가 만든 것
• 어떤 프로젝트에서라도 필요한,
• 유니티의 “범용적인 정보”를 표시한다!
• https://github.com/devsisters/UnitySettings
25
암이 치유되었습니다
26
DLL을 추가하고 코드한줄이면 준비완료!
동그라미
제스쳐
27
그외에도 이런 걸 볼 수 있어요!
• Lua REPL
• 계정정보
• Hierarchy 뷰어
• 터치정보
• PlayerPrefs 에디터
• 디바이스 정보
• 빌드 정보
• 로그 뷰어
• 씬 강제 전환
• CLI 실행기
근시일 내에 추가 예정
28
런타임 테스트를 더 잘해보자!
유니티 정보
뷰어/편집기
기능 조작
기능 조작
(에디터 내)
동적
스크립트 실행
UnitySettings
CLI 바인딩
EditorWindow
LuaREPL
29
좋네요! 그런데 이런거는 어떻게 테스트하죠?
30
가챠 연출이 너무 깁니다!
이 연출 언제 다 보면서 테스트 하나요?
20배속으로 플레이하게 해주세요!
31
디버깅용 서버말고
실제 프로덕션 서버로 연결해주세요!
아… 빌드 또 다시 뽑아야 하나요?
32
공유하기를 20번하면 깨지는 업적을 보고 싶어요.
통계를 조작해서 19번 이미 공유한 것으로 세팅해주세요!
근데 직접 다 해야된다구요?!
33
갤러리에서 퍼즐조각을 맞출 때 나오는 연출,
이 연출의 유저 경험을 튜닝하고 싶어요.
이쁘게요! 돈을 무한대로 넣어주세요!
34
UnitySettings는 범용적인 테스팅 메뉴다.
우리는, 우리 게임만을 위한
테스팅 기능이 필요하다!
이런 식으로 쓰기에는 적합하지 않다.
35
CLI 바인딩
빠르게 만드는 기능 확인/조작 도구
36
그래서 이런게 있으면 좋겠다는 건데…
• n배속 플레이
• 서버 설정
• 통계조작
• 돈 강제 세팅
37
• 그 외에도…
• 업적 달성
• 게임 강제 승리
• 게임 승리시 랜덤 연출 고정
• 인벤토리 초기화
• 일일보상 초기화
• 퍼즐갤러리 초기화
GUI 디버깅 메뉴는 어떨까요?
네, 안 보입니다.기능 많아지면, 더 안 보입니다.
38
GUI 디버깅 메뉴는 어떨까요?
또한, 인자가 필요한 테스팅 기능을 표현하기 어렵다.
예를 들어 “특정 업적을 강제 달성하고 싶어요!”
강제 달성을 위해서 해당 업적 키값이 필요한데,
이걸 GUI로 어떻게 표현할 수 있을까요…?
GUI로 복잡한 것을 표현하기 어렵습니다.모바일에서는 더더욱이요!
39
그래서 GUI를 대체하였습니다, CLI로요!
네? CLI요?
40
CLI? 대체 뭔가요?
Command Line Interface 의 약어로,
버튼이나 이미지 등 GUI 없이,
원하는 명령어를 직접 입력해서 실행하는 환경을 이야기합니다.
41
어떻게 했는지, 한번 같이 보시죠!
IP: 172.24.12.14
우선 IP 주소를 준비합니다
42
영상: https://youtu.be/ifH3lKKndWQ
43
가챠 연출이 너무 깁니다!
이 연출 언제 다 보면서 테스트 하나요?
20배속으로 플레이하게 해주세요!
> app timescale 20
44
디버깅용 서버말고
실제 프로덕션 서버로 연결해주세요!
아… 빌드 또 다시 뽑아야 하나요?
> server set https://real.server.devsisters.com
45
공유하기를 20번하면 깨지는 업적을 보고 싶어요.
통계를 조작해서 19번 이미 공유한 것으로 세팅해주세요!
근데 직접 다 해야된다구요?!
> stat set SHARE_COUNT 19
46
퍼즐갤러리에서 퍼즐조각을 맞춰가면서
연출의 유저 경험을 튜닝하고 싶어요.
돈을 무한대로 많이 넣어주세요!
> wallet set 999999999
47
플러그인화
• TCP/IP 통신
• CLI 파싱
• 명령어 바인딩
• https://github.com/devsisters/UnityCLI
48
이렇게 사용합니다
TCP 통신 시작
클래스 바인딩
바인딩된 클래스
49
이렇게 사용합니다
바인딩된 클래스
> wallet add 9999
50
런타임 테스트를 더 잘해보자!
유니티 정보
뷰어/편집기
기능 조작
기능 조작
(에디터 내)
동적
스크립트 실행
UnitySettings
CLI 바인딩
EditorWindow
LuaREPL
51
그런데 가면 갈수록 명령어 수가 늘어난다
만들다보니 명령어 수가 84개가 되었다…
52
CLI 명령어를 엄청 많이 만들어 주셨네요
• 그런데 저는 쓰는 것만 많이 써요.
• 예를 들어, n배속 플레이, 돈 넣기, 인벤토리 초기화, 업적 초기화요.
• CLI를 연결하고 명령어를 그때그때 치는건 솔직히 괴롭네요.
• 기억하기도 힘들구요!
자주 쓰는 명령어는 정해져 있다
53
적어도 Editor에서는 GUI가 낫겠다
EditorWindow
유니티 Editor에서 사용하는 “접근성 좋은” 기능 확인/조작 도구
54
이런 겁니다
55
GameWindow
현재 카드 상태를 보여준다
56
LocalizationWindow
현재 언어를 보여준다 / 언어를 강제로 바꾸어준다.
57
AchievementWindow
현재 업적 상태를 보여준다 / 강제로 업적을 달성시킨다.
58
이외에도…
CLI 입력기
작은 기능들
• Timescale 조절
• 네트워크 끄기
• 인앱구매 통과
• 랜덤보너스
• 가챠 확률 보기
• 리뷰 팝업 보기
• URL 열기
• 버전 정보
게임 상태
• FSM 강제 전환
• 새로운 게임
• 게임 승리
• 세레모니 고정
계정
• 로그인/로그아웃
• 회원탈퇴
• 랜덤 로그인
• 원하는 계정으로
로그인
현재
카드 배치
언어 전환
통계 업적
59
또 이외에도…
60
이렇게 만듭니다
참고: https://docs.unity3d.com/ScriptReference/EditorWindow.html
유니티 메뉴 아이템에 등록
버튼을 하나하나 추가
61
런타임 테스트를 더 잘해보자!
유니티 정보
뷰어/편집기
기능 조작
기능 조작
(에디터 내)
동적
스크립트 실행
UnitySettings
CLI 바인딩
EditorWindow
LuaREPL
62
좋네요!
이제 범용적인 정보들을 UnitySettings에서 확인하고,
우리 프로젝트만을 위한 기능조작을 UnityCLI로 하고,
자주 사용하는 기능들을 EditorWindow에서 조작할 수 있어요!
이제 우린 충분한 생산성이 나오나요?정말로, 이제 우린 행복한 건가요?
63
음… 그런데 말입니다,
• 이 모든 테스트 도구들은,
• 유저가, 그러니까 개발팀이,
• 어떤 식으로 테스팅을 할 지 알 때만 쓸 수 있네요?
64
음… 그런데 말입니다,
• 다시 말해서, 게임의 기능 별로,
• 테스팅용 기능을 각각 준비해야 하는거 잖아요?
• 예를 들어, Wallet (코인을 관리)하는 클래스가 있을 때,
• Wallet을 위한 CLI 명령어,
• Wallet을 위한 Window 스크립트
• 를 만들어 줘야 테스팅이 가능하군요?
65
음… 그런데 말입니다,
• 그러니까 정리하면, 어려운 말로,
• 유즈케이스가 있을 때의 테스팅 기법이군요?
• 전혀 알 수 없는 버그가 나왔을 때는
• 사용할 수 없는 거구요…
66
유즈 케이스가 없는 경우의
테스팅 기능이 부족하다.
그래서 우리가 만든 것,
Lua REPL
67
Lua REPL
복잡한 문제 확인을 위한 유니티엔진 바인딩
68
Lua REPL? 리플? 댓글을 말하는 건가요?
•아닙니다
69
Lua REPL? 대체 뭔가요?
Lua
javascript나 python과 같은 컴파일이 필요없는 동적 언어.
REPL (read-eval-print-loop)
라인 단위로 원하는 명령어를 실행하고 출력(print)해주는 기능.
네? 뭐라구요?
70
Lua REPL
• 그러니까 한마디로,
• 원하는 코드를
• 디바이스에서
• 라인 단위로 실행하고
• 결과를 볼 수 있는
• 플러그인!
맞아요, 맞는데,
그냥 한번 보시죠!
71
영상: https://youtu.be/X6TPbyVUmwo72
플러그인화
• 원하는 스크립트를 타겟디바이스에서 실행한다
• https://github.com/devsisters/UnityLuaREPL
73
예를 들어, 언제 어떻게 쓸 수 있을까요?
• 문제가 파악을 위해, GameObject 하나하나 정밀하게 보고 싶다.
• 기능을 확인할 수 있는 조건이 까다로울 때, 강제로 실행하고 싶다.
• 리소스 수정 없이 수치를 실시간으로 튜닝해보고 싶다.
• ThirdParty SDK의 API 파악을 위해, 다양하게 실험을 하고 싶다.
• UI를 폰에서 실시간으로 잡아보고 싶다.
• 문제가 있을 것 같은 특정 리소스의 내용을 보고 싶다.
74
LuaREPL 스크립트만 추가하면 끝!
라인 단위로 스크립트 전달
파일 단위로 스크립트 전달
파일을 받아올 서버
75
그런데 어떻게 만들었죠?
nc $IP $PORTCLI
LuaREPL
xLua
TCP/IP
76
UnityEngine
Windows의 경우에는 telnet을 사용합니다.
런타임 테스트를 더 잘해보자!
유니티 정보
뷰어/편집기
기능 조작
기능 조작
(에디터 내)
동적
스크립트 실행
UnitySettings
CLI 바인딩
EditorWindow
LuaREPL
77
4개의 테스팅 기법은
여기서 마무리입니다!
78
끝으로 덧붙이면:
79
좋은 테스팅 기법의 적용은
생산성을 높이는데 그치지 않습니다.
더 좋은 유저경험을 가져오고,
80
높은 리텐션도 일으켜주며,
81
워크플로우 역시 매끄러워지죠!
82
83
더 좋은 게임을 만드시는데
도움이 되셨으면 좋겠습니다.
감사합니다.
그리고…
함께 좋은 게임을 만드실
여러분을 기다립니다.
https://github.com/devsisters/UnityCLI
https://github.com/devsisters/UnitySettings
https://github.com/devsisters/UnityLuaREPL
https://youtu.be/X6TPbyVUmwo
https://youtu.be/ifH3lKKndWQ
http://www.devsisters.com/jobs/
84

Weitere ähnliche Inhalte

Was ist angesagt?

리플렉션과 가비지 컬렉션
리플렉션과 가비지 컬렉션리플렉션과 가비지 컬렉션
리플렉션과 가비지 컬렉션
QooJuice
 
임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013
devCAT Studio, NEXON
 
NDC16 - 화성에서 온 사업팀 금성에서 온 개발팀 : 성공적인 라이브 서비스를 위해 필요한 것들
NDC16 - 화성에서 온 사업팀 금성에서 온 개발팀 : 성공적인 라이브 서비스를 위해 필요한 것들NDC16 - 화성에서 온 사업팀 금성에서 온 개발팀 : 성공적인 라이브 서비스를 위해 필요한 것들
NDC16 - 화성에서 온 사업팀 금성에서 온 개발팀 : 성공적인 라이브 서비스를 위해 필요한 것들
Young Keun Choe
 
【GCC18】PUBGライクなゲームをUnityだけで早く確実に作る方法 〜ひとつのUnity上でダミークライアントを100個同時に動かす〜
【GCC18】PUBGライクなゲームをUnityだけで早く確実に作る方法 〜ひとつのUnity上でダミークライアントを100個同時に動かす〜【GCC18】PUBGライクなゲームをUnityだけで早く確実に作る方法 〜ひとつのUnity上でダミークライアントを100個同時に動かす〜
【GCC18】PUBGライクなゲームをUnityだけで早く確実に作る方法 〜ひとつのUnity上でダミークライアントを100個同時に動かす〜
モノビット エンジン
 
NDC2013 - 인디게임 프로젝트 중도에 포기하지 않는 방법
NDC2013 - 인디게임 프로젝트 중도에 포기하지 않는 방법NDC2013 - 인디게임 프로젝트 중도에 포기하지 않는 방법
NDC2013 - 인디게임 프로젝트 중도에 포기하지 않는 방법
ChangHyun Won
 
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
영욱 오
 

Was ist angesagt? (20)

Azure로 MMO게임 서비스하기
Azure로 MMO게임 서비스하기Azure로 MMO게임 서비스하기
Azure로 MMO게임 서비스하기
 
게임 프로그래밍 기초 공부법
게임 프로그래밍 기초 공부법게임 프로그래밍 기초 공부법
게임 프로그래밍 기초 공부법
 
Ndc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABCNdc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABC
 
리플렉션과 가비지 컬렉션
리플렉션과 가비지 컬렉션리플렉션과 가비지 컬렉션
리플렉션과 가비지 컬렉션
 
KGC 2013 - 5일만에 레벨 디자인하기
KGC 2013 - 5일만에 레벨 디자인하기KGC 2013 - 5일만에 레벨 디자인하기
KGC 2013 - 5일만에 레벨 디자인하기
 
UI아트 작업자를 위한 언리얼엔진4 UMG #1
UI아트 작업자를 위한 언리얼엔진4 UMG #1UI아트 작업자를 위한 언리얼엔진4 UMG #1
UI아트 작업자를 위한 언리얼엔진4 UMG #1
 
임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013
 
Spring cloud on kubernetes
Spring cloud on kubernetesSpring cloud on kubernetes
Spring cloud on kubernetes
 
NDC 2011 영웅전 런칭팀 박영준
NDC 2011 영웅전 런칭팀 박영준NDC 2011 영웅전 런칭팀 박영준
NDC 2011 영웅전 런칭팀 박영준
 
NDC16 - 화성에서 온 사업팀 금성에서 온 개발팀 : 성공적인 라이브 서비스를 위해 필요한 것들
NDC16 - 화성에서 온 사업팀 금성에서 온 개발팀 : 성공적인 라이브 서비스를 위해 필요한 것들NDC16 - 화성에서 온 사업팀 금성에서 온 개발팀 : 성공적인 라이브 서비스를 위해 필요한 것들
NDC16 - 화성에서 온 사업팀 금성에서 온 개발팀 : 성공적인 라이브 서비스를 위해 필요한 것들
 
【GCC18】PUBGライクなゲームをUnityだけで早く確実に作る方法 〜ひとつのUnity上でダミークライアントを100個同時に動かす〜
【GCC18】PUBGライクなゲームをUnityだけで早く確実に作る方法 〜ひとつのUnity上でダミークライアントを100個同時に動かす〜【GCC18】PUBGライクなゲームをUnityだけで早く確実に作る方法 〜ひとつのUnity上でダミークライアントを100個同時に動かす〜
【GCC18】PUBGライクなゲームをUnityだけで早く確実に作る方法 〜ひとつのUnity上でダミークライアントを100個同時に動かす〜
 
MVC, MVVM, ReactorKit, VIPER를 거쳐 RIB 정착기
MVC, MVVM, ReactorKit, VIPER를 거쳐 RIB 정착기MVC, MVVM, ReactorKit, VIPER를 거쳐 RIB 정착기
MVC, MVVM, ReactorKit, VIPER를 거쳐 RIB 정착기
 
C#을 사용한 빠른 툴 개발
C#을 사용한 빠른 툴 개발C#을 사용한 빠른 툴 개발
C#을 사용한 빠른 툴 개발
 
라이브 서비스를 위한 게임 서버 구성
라이브 서비스를 위한 게임 서버 구성라이브 서비스를 위한 게임 서버 구성
라이브 서비스를 위한 게임 서버 구성
 
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
 
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
 
MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~
MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~
MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~
 
NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현
 
NDC2013 - 인디게임 프로젝트 중도에 포기하지 않는 방법
NDC2013 - 인디게임 프로젝트 중도에 포기하지 않는 방법NDC2013 - 인디게임 프로젝트 중도에 포기하지 않는 방법
NDC2013 - 인디게임 프로젝트 중도에 포기하지 않는 방법
 
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
 

Ähnlich wie NDC17. "솔리테어: 덱다웃" 유니티 모바일 테스팅 기법들

NDC 2014 Beyond Code: <야생의 땅:듀랑고>의 좌충우돌 개발 과정 - 프로그래머가 챙겨주는 또 다른 개발자 사용 설명서
NDC 2014 Beyond Code: <야생의 땅:듀랑고>의 좌충우돌 개발 과정 - 프로그래머가 챙겨주는 또 다른 개발자 사용 설명서NDC 2014 Beyond Code: <야생의 땅:듀랑고>의 좌충우돌 개발 과정 - 프로그래머가 챙겨주는 또 다른 개발자 사용 설명서
NDC 2014 Beyond Code: <야생의 땅:듀랑고>의 좌충우돌 개발 과정 - 프로그래머가 챙겨주는 또 다른 개발자 사용 설명서
영준 박
 
온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기
Seungjae Lee
 
131 deview 2013 yobi-채수원
131 deview 2013 yobi-채수원131 deview 2013 yobi-채수원
131 deview 2013 yobi-채수원
NAVER D2
 
탐사분석을통한작업장탐지
탐사분석을통한작업장탐지탐사분석을통한작업장탐지
탐사분석을통한작업장탐지
Eun-Jo Lee
 
임태현, 서버점검 제로에의 도전, NDC2011
임태현, 서버점검 제로에의 도전, NDC2011임태현, 서버점검 제로에의 도전, NDC2011
임태현, 서버점검 제로에의 도전, NDC2011
devCAT Studio, NEXON
 
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013
devCAT Studio, NEXON
 

Ähnlich wie NDC17. "솔리테어: 덱다웃" 유니티 모바일 테스팅 기법들 (20)

NDC 2013 Monkeyrunner를 이용한 모바일 테스트 자동화
NDC 2013 Monkeyrunner를 이용한 모바일 테스트 자동화NDC 2013 Monkeyrunner를 이용한 모바일 테스트 자동화
NDC 2013 Monkeyrunner를 이용한 모바일 테스트 자동화
 
NDC 2014 Beyond Code: <야생의 땅:듀랑고>의 좌충우돌 개발 과정 - 프로그래머가 챙겨주는 또 다른 개발자 사용 설명서
NDC 2014 Beyond Code: <야생의 땅:듀랑고>의 좌충우돌 개발 과정 - 프로그래머가 챙겨주는 또 다른 개발자 사용 설명서NDC 2014 Beyond Code: <야생의 땅:듀랑고>의 좌충우돌 개발 과정 - 프로그래머가 챙겨주는 또 다른 개발자 사용 설명서
NDC 2014 Beyond Code: <야생의 땅:듀랑고>의 좌충우돌 개발 과정 - 프로그래머가 챙겨주는 또 다른 개발자 사용 설명서
 
에어헌터 for kakao 포스트모템(공개용)
에어헌터 for kakao 포스트모템(공개용)에어헌터 for kakao 포스트모템(공개용)
에어헌터 for kakao 포스트모템(공개용)
 
온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기
 
[NDC 2010] 그럴듯한 랜덤 생성 컨텐츠 만들기
[NDC 2010] 그럴듯한 랜덤 생성 컨텐츠 만들기[NDC 2010] 그럴듯한 랜덤 생성 컨텐츠 만들기
[NDC 2010] 그럴듯한 랜덤 생성 컨텐츠 만들기
 
[PandoraCube] '게임메이커'에 대해 알아보자
[PandoraCube] '게임메이커'에 대해 알아보자[PandoraCube] '게임메이커'에 대해 알아보자
[PandoraCube] '게임메이커'에 대해 알아보자
 
C++ 코드 품질 관리 비법
C++ 코드 품질 관리 비법C++ 코드 품질 관리 비법
C++ 코드 품질 관리 비법
 
131 deview 2013 yobi-채수원
131 deview 2013 yobi-채수원131 deview 2013 yobi-채수원
131 deview 2013 yobi-채수원
 
NDC17 장창완(최종)
NDC17 장창완(최종)NDC17 장창완(최종)
NDC17 장창완(최종)
 
[스마트벤처 창업학교] 스타트업 프로젝트를 위한 유니티 게임 개발
[스마트벤처 창업학교] 스타트업 프로젝트를 위한 유니티 게임 개발[스마트벤처 창업학교] 스타트업 프로젝트를 위한 유니티 게임 개발
[스마트벤처 창업학교] 스타트업 프로젝트를 위한 유니티 게임 개발
 
[IGC 2016] 컴투스 김동준 - 기획 지망생은 무엇을 준비하나요?
[IGC 2016] 컴투스 김동준 - 기획 지망생은 무엇을 준비하나요?[IGC 2016] 컴투스 김동준 - 기획 지망생은 무엇을 준비하나요?
[IGC 2016] 컴투스 김동준 - 기획 지망생은 무엇을 준비하나요?
 
Unite 2015 Seoul : 인디에게 어디가 한계인지는 해봐야 알잖아?
Unite 2015 Seoul : 인디에게 어디가 한계인지는 해봐야 알잖아?Unite 2015 Seoul : 인디에게 어디가 한계인지는 해봐야 알잖아?
Unite 2015 Seoul : 인디에게 어디가 한계인지는 해봐야 알잖아?
 
탐사분석을통한작업장탐지
탐사분석을통한작업장탐지탐사분석을통한작업장탐지
탐사분석을통한작업장탐지
 
그럴듯한 랜덤 생성 컨텐츠 만들기
그럴듯한 랜덤 생성 컨텐츠 만들기그럴듯한 랜덤 생성 컨텐츠 만들기
그럴듯한 랜덤 생성 컨텐츠 만들기
 
하루에 10번 배포하기 - flickr
하루에 10번 배포하기 - flickr하루에 10번 배포하기 - flickr
하루에 10번 배포하기 - flickr
 
Agile의 의미와 Agile 계획 수립(Gdc2007)
Agile의 의미와 Agile 계획 수립(Gdc2007)Agile의 의미와 Agile 계획 수립(Gdc2007)
Agile의 의미와 Agile 계획 수립(Gdc2007)
 
임태현, 서버점검 제로에의 도전, NDC2011
임태현, 서버점검 제로에의 도전, NDC2011임태현, 서버점검 제로에의 도전, NDC2011
임태현, 서버점검 제로에의 도전, NDC2011
 
Refactoring web audio_player
Refactoring web audio_playerRefactoring web audio_player
Refactoring web audio_player
 
사랑의 '유효성 검사' 재개발
사랑의 '유효성 검사' 재개발사랑의 '유효성 검사' 재개발
사랑의 '유효성 검사' 재개발
 
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013
 

NDC17. "솔리테어: 덱다웃" 유니티 모바일 테스팅 기법들

  • 2. 강연자 소개 • 솔리테어: 덱다웃 _ 2016.04~2016.10 • 컨텐츠 업데이트 _ 2016.10~2017.01 • 쿠키런 for Kakao _ 2015.06~2016.04 • 마왕을 물리쳤다! for Kakao _ 2013.06~2015.06 김대원 james.kim@devsisters.com 2
  • 3. 그래서… 솔리테어가 뭔가요? 윈도우즈 카드놀이! 바로 이 추억의 게임! 3
  • 4. 때는 작년 3월, 이렇게 시작되었습니다 • 새로운 게임을 뭘 만들까, 고민하던 와중에… iPhone 2016.03 Android 2016.03 iPhone 현재 언제나 영미권의 차트를 차지하고 있다 4
  • 5. 그런데, 기존 솔리테어들은 퀄리티가 낮다 광고 떡칠 구린 아트 낮은 깊이 Solitaire by Harpan 얼마 전 Zynga에 430억에 인수되었다 5
  • 6. 더 잘 만들 수 있겠다! 되지 않을까? 광고 떼고 이쁜 아트 깊게 파자 6
  • 10. 10
  • 11. 다시 작년 3월, 프로젝트를 시작할 즈음… 11
  • 12. 하지만 너무너무 많은 솔리테어가 이미 있었다… 경쟁력이 필요하다… 12
  • 13. 경쟁력을 갖기 위해 잘 해야만 했던 것 많은 컨텐츠 적은 버그 좋은 반응성 리텐션 요소 바이럴 직관적인 UI 적은 용량 신적화 스트레스 없는 플레이 스트레스 없는 플레이 매력적인 아트 좋은 피드백 높은 생산성 빠져드는 스토리텔링 레벨디자인 도전과 보상 모네타이제이션 그라인딩(노가다) 13
  • 14. 짧은 개발 기간, 적은 개발 인원 많은 컨텐츠 적은 버그 좋은 반응성 리텐션 요소 바이럴 직관적인 UI 적은 용량 신적화 스트레스 없는 플레이 스트레스 없는 플레이 매력적인 아트 좋은 피드백 높은 생산성 빠져드는 스토리텔링 레벨디자인 도전과 보상 모네타이제이션 그라인딩(노가다) 14
  • 15. 일하는 방식을 최적화 해야한다 많은 컨텐츠 적은 버그 좋은 반응성 리텐션 요소 바이럴 직관적인 UI 적은 용량 신적화 스트레스 없는 플레이 스트레스 없는 플레이 매력적인 아트 좋은 피드백 높은 생산성 빠져드는 스토리텔링 레벨디자인 도전과 보상 모네타이제이션 그라인딩(노가다) 15
  • 16. 높은 생산성? HOW? • 혁신적인 워크플로우 • 잘 정의된 기획 • 빠른 컴파일 시간 • 올바른 라이브러리 선택 • 좋은 업무환경 • …………… • 좋은 테스팅 기법 16
  • 17. • 통계를 초기화해야하는데, 방법이 오직 재설치뿐이라면…? • 업적을 구현하였는데, 테스트를 위해서 업적을 직접 깨야한다면…? • 카드이미지를 새로 만들었는데, 풀빌드를 해야 볼 수 있다면…? • 승리시 보상을 높였는데, 빌드를 다시 넣어줘야 한다면…? • 아이템이 가챠에서 나오나, 직접 가챠를 돌려야 한다면…? • 원하는 카드팩을 얻기 위해서, 플레이를 해야한다면…? • “리뷰주세요” 팝업을 보기 위해서, 1시간을 플레이 해야한다면…? • 친구초대 보상을 받기 위해서, 직접 초대를 다 해봐야 한다면…? 좋은 테스팅 기법은 높은 생산성의 열쇠다! 이런 식으로는 안 된다테스트를 잘 해보자 17
  • 18. 다양한 테스팅 기법들 랜덤 터치 테스트 자동화 테스트 CI 빌드후 테스트 인테그레이션 테스트 End-to-End 테스트 스트레스 테스트 서버쪽에서는… 데이터 검증 유닛 테스트 리그레션 테스트 빌드전 테스트 유니티가 Global state에 의존 디버거 로깅 디버깅 버튼 런타임 테스트 우리가 항상 하는 것! 모바일에서 더 잘해보자! 18
  • 19. 런타임 테스트를 더 잘해보자! 디버거 로깅 디버깅 버튼 런타임 테스트 우리가 항상 하는 것! 이를 위해 우리가 만든 것들, 유니티 정보 뷰어/편집기 기능 조작 기능 조작 (에디터 내) 동적 스크립트 실행 UnitySettings CLI 바인딩 EditorWindow LuaREPL 19
  • 20. UnitySettings 유니티 내부 정보를 보여준다/설정한다 20
  • 21. 버그 배달왔습니다! 업적창에서 업적이 보이지 않는 상황! 테이블 초기화 중에 예외가 난 것 같은데… 21
  • 22. 확인을 위해 주섬주섬 로그를 남겨야 한다… adb가 디바이스를 못 잡는다 원인은 Dictionary에 중복된 키값을 넣었던 것! 22
  • 23. 로그 하나 확인하는게, 왜 이렇게 힘든걸까? FACT 1: 로그가 개발자에게 드러나지 않았다 (접근성이 낮음) FACT 2: 로그는 유니티 내부의 정보이다 유니티 내부의 정보가 개발자에게 드러나지 않았다 23
  • 24. 로그 외에 다른 “내부 정보”들을 살펴보면, • 시스템정보 • 빌드정보 • Hierarchy 정보 • 씬정보 • PlayerPrefs 정보 이런 유니티 내부의 정보를, 어떠한 프로젝트에서도, 개발자에게 잘 드러날 수 있도록, GUI로 보여준다면? 24
  • 25. UnitySettings: 그래서 우리가 만든 것 • 어떤 프로젝트에서라도 필요한, • 유니티의 “범용적인 정보”를 표시한다! • https://github.com/devsisters/UnitySettings 25
  • 27. DLL을 추가하고 코드한줄이면 준비완료! 동그라미 제스쳐 27
  • 28. 그외에도 이런 걸 볼 수 있어요! • Lua REPL • 계정정보 • Hierarchy 뷰어 • 터치정보 • PlayerPrefs 에디터 • 디바이스 정보 • 빌드 정보 • 로그 뷰어 • 씬 강제 전환 • CLI 실행기 근시일 내에 추가 예정 28
  • 29. 런타임 테스트를 더 잘해보자! 유니티 정보 뷰어/편집기 기능 조작 기능 조작 (에디터 내) 동적 스크립트 실행 UnitySettings CLI 바인딩 EditorWindow LuaREPL 29
  • 30. 좋네요! 그런데 이런거는 어떻게 테스트하죠? 30
  • 31. 가챠 연출이 너무 깁니다! 이 연출 언제 다 보면서 테스트 하나요? 20배속으로 플레이하게 해주세요! 31
  • 32. 디버깅용 서버말고 실제 프로덕션 서버로 연결해주세요! 아… 빌드 또 다시 뽑아야 하나요? 32
  • 33. 공유하기를 20번하면 깨지는 업적을 보고 싶어요. 통계를 조작해서 19번 이미 공유한 것으로 세팅해주세요! 근데 직접 다 해야된다구요?! 33
  • 34. 갤러리에서 퍼즐조각을 맞출 때 나오는 연출, 이 연출의 유저 경험을 튜닝하고 싶어요. 이쁘게요! 돈을 무한대로 넣어주세요! 34
  • 35. UnitySettings는 범용적인 테스팅 메뉴다. 우리는, 우리 게임만을 위한 테스팅 기능이 필요하다! 이런 식으로 쓰기에는 적합하지 않다. 35
  • 36. CLI 바인딩 빠르게 만드는 기능 확인/조작 도구 36
  • 37. 그래서 이런게 있으면 좋겠다는 건데… • n배속 플레이 • 서버 설정 • 통계조작 • 돈 강제 세팅 37 • 그 외에도… • 업적 달성 • 게임 강제 승리 • 게임 승리시 랜덤 연출 고정 • 인벤토리 초기화 • 일일보상 초기화 • 퍼즐갤러리 초기화
  • 38. GUI 디버깅 메뉴는 어떨까요? 네, 안 보입니다.기능 많아지면, 더 안 보입니다. 38
  • 39. GUI 디버깅 메뉴는 어떨까요? 또한, 인자가 필요한 테스팅 기능을 표현하기 어렵다. 예를 들어 “특정 업적을 강제 달성하고 싶어요!” 강제 달성을 위해서 해당 업적 키값이 필요한데, 이걸 GUI로 어떻게 표현할 수 있을까요…? GUI로 복잡한 것을 표현하기 어렵습니다.모바일에서는 더더욱이요! 39
  • 40. 그래서 GUI를 대체하였습니다, CLI로요! 네? CLI요? 40
  • 41. CLI? 대체 뭔가요? Command Line Interface 의 약어로, 버튼이나 이미지 등 GUI 없이, 원하는 명령어를 직접 입력해서 실행하는 환경을 이야기합니다. 41
  • 42. 어떻게 했는지, 한번 같이 보시죠! IP: 172.24.12.14 우선 IP 주소를 준비합니다 42
  • 44. 가챠 연출이 너무 깁니다! 이 연출 언제 다 보면서 테스트 하나요? 20배속으로 플레이하게 해주세요! > app timescale 20 44
  • 45. 디버깅용 서버말고 실제 프로덕션 서버로 연결해주세요! 아… 빌드 또 다시 뽑아야 하나요? > server set https://real.server.devsisters.com 45
  • 46. 공유하기를 20번하면 깨지는 업적을 보고 싶어요. 통계를 조작해서 19번 이미 공유한 것으로 세팅해주세요! 근데 직접 다 해야된다구요?! > stat set SHARE_COUNT 19 46
  • 47. 퍼즐갤러리에서 퍼즐조각을 맞춰가면서 연출의 유저 경험을 튜닝하고 싶어요. 돈을 무한대로 많이 넣어주세요! > wallet set 999999999 47
  • 48. 플러그인화 • TCP/IP 통신 • CLI 파싱 • 명령어 바인딩 • https://github.com/devsisters/UnityCLI 48
  • 49. 이렇게 사용합니다 TCP 통신 시작 클래스 바인딩 바인딩된 클래스 49
  • 51. 런타임 테스트를 더 잘해보자! 유니티 정보 뷰어/편집기 기능 조작 기능 조작 (에디터 내) 동적 스크립트 실행 UnitySettings CLI 바인딩 EditorWindow LuaREPL 51
  • 52. 그런데 가면 갈수록 명령어 수가 늘어난다 만들다보니 명령어 수가 84개가 되었다… 52
  • 53. CLI 명령어를 엄청 많이 만들어 주셨네요 • 그런데 저는 쓰는 것만 많이 써요. • 예를 들어, n배속 플레이, 돈 넣기, 인벤토리 초기화, 업적 초기화요. • CLI를 연결하고 명령어를 그때그때 치는건 솔직히 괴롭네요. • 기억하기도 힘들구요! 자주 쓰는 명령어는 정해져 있다 53 적어도 Editor에서는 GUI가 낫겠다
  • 54. EditorWindow 유니티 Editor에서 사용하는 “접근성 좋은” 기능 확인/조작 도구 54
  • 57. LocalizationWindow 현재 언어를 보여준다 / 언어를 강제로 바꾸어준다. 57
  • 58. AchievementWindow 현재 업적 상태를 보여준다 / 강제로 업적을 달성시킨다. 58
  • 59. 이외에도… CLI 입력기 작은 기능들 • Timescale 조절 • 네트워크 끄기 • 인앱구매 통과 • 랜덤보너스 • 가챠 확률 보기 • 리뷰 팝업 보기 • URL 열기 • 버전 정보 게임 상태 • FSM 강제 전환 • 새로운 게임 • 게임 승리 • 세레모니 고정 계정 • 로그인/로그아웃 • 회원탈퇴 • 랜덤 로그인 • 원하는 계정으로 로그인 현재 카드 배치 언어 전환 통계 업적 59
  • 62. 런타임 테스트를 더 잘해보자! 유니티 정보 뷰어/편집기 기능 조작 기능 조작 (에디터 내) 동적 스크립트 실행 UnitySettings CLI 바인딩 EditorWindow LuaREPL 62
  • 63. 좋네요! 이제 범용적인 정보들을 UnitySettings에서 확인하고, 우리 프로젝트만을 위한 기능조작을 UnityCLI로 하고, 자주 사용하는 기능들을 EditorWindow에서 조작할 수 있어요! 이제 우린 충분한 생산성이 나오나요?정말로, 이제 우린 행복한 건가요? 63
  • 64. 음… 그런데 말입니다, • 이 모든 테스트 도구들은, • 유저가, 그러니까 개발팀이, • 어떤 식으로 테스팅을 할 지 알 때만 쓸 수 있네요? 64
  • 65. 음… 그런데 말입니다, • 다시 말해서, 게임의 기능 별로, • 테스팅용 기능을 각각 준비해야 하는거 잖아요? • 예를 들어, Wallet (코인을 관리)하는 클래스가 있을 때, • Wallet을 위한 CLI 명령어, • Wallet을 위한 Window 스크립트 • 를 만들어 줘야 테스팅이 가능하군요? 65
  • 66. 음… 그런데 말입니다, • 그러니까 정리하면, 어려운 말로, • 유즈케이스가 있을 때의 테스팅 기법이군요? • 전혀 알 수 없는 버그가 나왔을 때는 • 사용할 수 없는 거구요… 66
  • 67. 유즈 케이스가 없는 경우의 테스팅 기능이 부족하다. 그래서 우리가 만든 것, Lua REPL 67
  • 68. Lua REPL 복잡한 문제 확인을 위한 유니티엔진 바인딩 68
  • 69. Lua REPL? 리플? 댓글을 말하는 건가요? •아닙니다 69
  • 70. Lua REPL? 대체 뭔가요? Lua javascript나 python과 같은 컴파일이 필요없는 동적 언어. REPL (read-eval-print-loop) 라인 단위로 원하는 명령어를 실행하고 출력(print)해주는 기능. 네? 뭐라구요? 70
  • 71. Lua REPL • 그러니까 한마디로, • 원하는 코드를 • 디바이스에서 • 라인 단위로 실행하고 • 결과를 볼 수 있는 • 플러그인! 맞아요, 맞는데, 그냥 한번 보시죠! 71
  • 73. 플러그인화 • 원하는 스크립트를 타겟디바이스에서 실행한다 • https://github.com/devsisters/UnityLuaREPL 73
  • 74. 예를 들어, 언제 어떻게 쓸 수 있을까요? • 문제가 파악을 위해, GameObject 하나하나 정밀하게 보고 싶다. • 기능을 확인할 수 있는 조건이 까다로울 때, 강제로 실행하고 싶다. • 리소스 수정 없이 수치를 실시간으로 튜닝해보고 싶다. • ThirdParty SDK의 API 파악을 위해, 다양하게 실험을 하고 싶다. • UI를 폰에서 실시간으로 잡아보고 싶다. • 문제가 있을 것 같은 특정 리소스의 내용을 보고 싶다. 74
  • 75. LuaREPL 스크립트만 추가하면 끝! 라인 단위로 스크립트 전달 파일 단위로 스크립트 전달 파일을 받아올 서버 75
  • 76. 그런데 어떻게 만들었죠? nc $IP $PORTCLI LuaREPL xLua TCP/IP 76 UnityEngine Windows의 경우에는 telnet을 사용합니다.
  • 77. 런타임 테스트를 더 잘해보자! 유니티 정보 뷰어/편집기 기능 조작 기능 조작 (에디터 내) 동적 스크립트 실행 UnitySettings CLI 바인딩 EditorWindow LuaREPL 77
  • 78. 4개의 테스팅 기법은 여기서 마무리입니다! 78
  • 79. 끝으로 덧붙이면: 79 좋은 테스팅 기법의 적용은 생산성을 높이는데 그치지 않습니다.
  • 80. 더 좋은 유저경험을 가져오고, 80
  • 83. 83 더 좋은 게임을 만드시는데 도움이 되셨으면 좋겠습니다. 감사합니다.
  • 84. 그리고… 함께 좋은 게임을 만드실 여러분을 기다립니다. https://github.com/devsisters/UnityCLI https://github.com/devsisters/UnitySettings https://github.com/devsisters/UnityLuaREPL https://youtu.be/X6TPbyVUmwo https://youtu.be/ifH3lKKndWQ http://www.devsisters.com/jobs/ 84

Hinweis der Redaktion

  1. 그래서 나온 것이 솔리테어: 덱다웃입니다. 다양한 테마와 애니메이션
  2. 가로세로 지원, 친구코드, 컬렉션요소가 있는 솔리테어 입니다.
  3. 가로세로 지원, 친구코드, 컬렉션요소가 있는 솔리테어 입니다.
  4. (사진) 폰에서 버그가 발생했어요! (사진) 원인 파악을 위해서 USB 연결 (사진) 테스트 기기가 연결이 되지 않는다… (사진) ADB LOGCAT으로 로그 확인 (사진) 원인 파악 iOS는 로그 확인이 더 복잡하다 사진 교체
  5. (사진) 폰에서 버그가 발생했어요! (사진) 원인 파악을 위해서 USB 연결 (사진) 테스트 기기가 연결이 되지 않는다… (사진) ADB LOGCAT으로 로그 확인 (사진) 원인 파악 iOS는 로그 확인이 더 복잡하다 사진 교체
  6. 애니메이션 처리
  7. 디버깅 기능을 만들고, 또 만들고… 근데 의외로 프로젝트에 종속적이지 않다 Reporter에서 영감을 받아 만든 플러그인 누구나 이용할 수 있게 폰에서 바로 확인할 수 있게 확장가능하게
  8. 제스쳐인식을 통해서 팝업을 켠다 사진 교체
  9. 스크린샷 교체, 에러로그를 볼 수 있도록
  10. 기획자가 과연 쓸 수 있을까? TODO 기능추가될때마다 UI가 난잡해진다. (이미지) 복잡한 인자를 받는다면 더욱 복잡 GUI 없이 CLI로 클라를 조작하자.
  11. 기획자가 과연 쓸 수 있을까? TODO 기능추가될때마다 UI가 난잡해진다. (이미지) 복잡한 인자를 받는다면 더욱 복잡 GUI 없이 CLI로 클라를 조작하자.
  12. 기획자가 과연 쓸 수 있을까? TODO 기능추가될때마다 UI가 난잡해진다. (이미지) 복잡한 인자를 받는다면 더욱 복잡 GUI 없이 CLI로 클라를 조작하자.
  13. TODO 설계
  14. TODO 설계