[펌] 유니티 안드로이드 빌링 api3 적용 팁입니다.

|

출처 : http://lab.gamecodi.com/board/zboard.php?id=GAMECODILAB_Lecture&page=1&sn1=&divpage=1&sn=on&ss=on&sc=on&keyword=%C0%AF%B4%CF%C6%BC&select_arrange=last_comment&desc=desc&no=291


안녕하세요.


게임 코디 눈팅 족이었다가, 저처럼 삽질 많이 하실분이 있을거 같아 이렇게 강좌를 쓰내요.

안드로이드 billing api3를 작업하면서, 유용한 플러그인 (prime31)을 쓸려고 했지만,

Purchase 의 Json이랑, Signature 정보를 안주드라고요 ㅠㅠ 

그래서 직접 구글 샘플을 가지고, 직접 이클립스 프로젝트에 코딩을 했습니다 (ctrl + c, ctrl + v)

예제 다 따라해서 안드로이드 샘플 코드 그대로 동작을 하면 잘 됩니다만..

이제 이벤트를 연결해서 , 아이템을 Purchage 성공 이벤트를 유니티에서 캡쳐해서, Java 의  Consume 함수 처리를 할때

앱이 중단 되는 사태가 나왔습니다. 

문제의 근원은  Consume 처리시, IabHelper의 consumeAsyncInternal 이 함수에서 핸들러를 만들고 쓰레드 를 생성해 처리를 하는데,

이렇게 쓰지 마시고. consumeAsyncInternal  에 MainActivity를 인자를 받으시고 runOnUiThread 로 작업을 수행하게 해주면 잘 동작됩니다.

이것때문에 결재 한 40번 넘게 테스트 한거 같내요.. 계속 패키지 빌드 하고, 기계에 심고 , 로그 보고 ㅠ


Trackback 0 And Comment 0

[펌] 유니티 엔진 팁 - 광고 모듈 붙이기

|
출처 : http://lab.gamecodi.com/board/zboard.php?id=GAMECODILAB_Lecture&page=1&sn1=&divpage=1&sn=on&ss=on&sc=on&keyword=%C0%AF%B4%CF%C6%BC&select_arrange=last_comment&desc=desc&no=277



[유니티 엔진 팁 - 광고 모듈 붙이기]

외부 광고모듈 적용.
- IOS : 해외버전은 apple의 iAD / 국내버전은 MezzoMedia라는 광고업체의 모듈을 사용하였습니다.
iAD는 자료찾기가 비교적 쉬웠고요, 국내업체의 광고모듈은 유니티엔진을 따로 지원하지는 않더군요.

- 삽질한부분...
xcode <-> 유니티 연동을 처음 하는거라 생각처럼 쉽게는 안되었음.
초기 프로젝트 설정할때는 수십개의 링크에러가 발생하여 멘붕상태가 되었는데요,
어떤 경우에는 xcode를 재시작하니 빌드오류가 싹 사라지는 경우도 있더군요.
그리고 유니티에서 빌드를 할때 xcode프로젝트가 다시 생성되면서 기존 파일들을 싹 지워버리는 경우도 있었습니다.

- 광고모듈이 계속 무한루프를 도는 현상.
처음에 광고를 딱 붙이고 올려보니 viewDidLoad함수가 끊임없이 호출되는 문제 발생했습니다.
구글링으로 해결방법을 찾아내어 loadView라는 빈 함수를 제거해주는것으로 해결했습니다.

- 불편했던점
xcode와 유니티를 전환해 가며 코딩해야하는 불편함이 있었습니다.
생소한 개발환경(visual studio처럼 익숙하지 않아서 빌드설정값 하나 찾는데도 애먹음).
개발/배포 인증서, 프로파일, 프로비저닝등 개념정립이 안되어서 재발급 받고 세팅하는것만 5~6번 반복하였음.

빌드 결과물인 .app파일이 순수 xcode native로 작업했을때 생기는 경로와 다른것도 걸림돌이었네요.
게다가 mac os업그레이드를 하고 나면 "라이브러리"폴더가 숨김설정 되어있기 때문에
이것을 풀어줘야 아웃풋 파일을 확인할 수 있습니다.
(실제 경로는 "라이브러리\Developer\..." 어딘가에 있음)
이런 사소한것 하나도 구글링해야 했기 때문에 시간도 지체되고 몸도 지쳐갔음.ㅠ_ㅠ



- Android : T-store의 T-ad를 사용하였음.
유니티용 모듈이 올라와 있지만 꼭 이걸 써야만 하는것은 아닙니다.
그냥 eclipse에 라이브러리 링크시켜 놓고 유니티와 연동하면 가능하거든요.

- 불편했던점
유니티에서 스크립트 작업만으로는 불가능하기 때문에 유니티activity소스를 긁어다가
eclipse에 붙여넣는등 번거로운 작업을 해야만 했습니다.
정보들이 인터넷 여기저기에 흩어져 있기 때문에 괜한 삽질을 한 적이 많았네요.

- 팁
adb logcat을 활용하여 디버깅 하면 도움이 많이 됩니다.
(폰 환경에서 돌렸을때 logcat이라는 프로그램을 통해서 PC화면에서 로그를 볼 수 있음)

activity가 따운되는 현상 및 클래스를 찾지 못하는 문제들이 자주 발생하였는데
대부분 라이브러리가 실행파일에 포함(?)되지 않아서 그런것입니다.
(포함이라는 용어가 맞는지는 모르겠지만 개념상 비슷하다고 했을때).
eclipse 빌드 설정에서 해당 라이브러리들을 아웃풋 파일에 넣어주는 옵션이 있습니다.

광고업체에서 보여줄 광고가 없을때는 아무것도 나오지 않기 때문에 
광고출력 위치에 땜빵할 UI를 넣어놓는것이 좋습니다. apple은 이것때문에 리젝걸기도 하더군요.


Trackback 0 And Comment 0

[펌] 유니티 엔진 - 오브젝트 풀 시스템

|

출처 : http://lab.gamecodi.com/board/zboard.php?id=GAMECODILAB_Lecture&page=1&sn1=&divpage=1&sn=on&ss=on&sc=on&keyword=%C0%AF%B4%CF%C6%BC&select_arrange=last_comment&desc=desc&no=280

·미리보기 | 소스복사·
  1. using System.Collections;  
  2.   
  3. using System.Collections.Generic;  
  4.   
  5.    
  6.   
  7. /* 
  8.  
  9.  * Usage 
  10.  
  11.  *  
  12.  
  13.  * CGameObjectPool<GameObject> monster_pool; 
  14.  
  15.  * ... 
  16.  
  17.  *  
  18.  
  19.  * // Create monsters. 
  20.  
  21.  * this.monster_pool = new CGameObjectPool<GameObject>(5, () =>  
  22.  
  23.     {  
  24.  
  25.         GameObject obj = new GameObject("monster"); 
  26.  
  27.         return obj; 
  28.  
  29.     }); 
  30.  
  31.      
  32.  
  33.      
  34.  
  35.     ... 
  36.  
  37.      
  38.  
  39.     // Get from pool 
  40.  
  41.     GameObject obj = this.monster_pool.pop(); 
  42.  
  43.      
  44.  
  45.     ... 
  46.  
  47.      
  48.  
  49.     // Return to pool 
  50.  
  51.     this.monster_pool.push(obj); 
  52.  
  53.  * */  
  54.   
  55. public class CGameObjectPool<T> where T : class  
  56.   
  57. {  
  58.   
  59.     // Instance count to create.  
  60.   
  61.     short count;  
  62.   
  63.       
  64.   
  65.     public delegate T Func();  
  66.   
  67.     Func create_fn;  
  68.   
  69.       
  70.   
  71.     // Instances.  
  72.   
  73.     Stack<T> objects;  
  74.   
  75.    
  76.   
  77.     // Construct  
  78.   
  79.     public CGameObjectPool(short count, Func fn)  
  80.   
  81.     {  
  82.   
  83.         this.count = count;  
  84.   
  85.         this.create_fn = fn;  
  86.   
  87.    
  88.   
  89.         this.objects = new Stack<T>(this.count);  
  90.   
  91.         allocate();  
  92.   
  93.     }  
  94.   
  95.       
  96.   
  97.     void allocate()  
  98.   
  99.     {  
  100.   
  101.         for (int i=0; i<this.count; ++i)  
  102.   
  103.         {  
  104.   
  105.             this.objects.Push(this.create_fn());  
  106.   
  107.         }  
  108.   
  109.     }  
  110.   
  111.       
  112.   
  113.     public T pop()  
  114.   
  115.     {  
  116.   
  117.         if (this.objects.Count <= 0)  
  118.   
  119.         {  
  120.   
  121.             allocate();  
  122.   
  123.         }  
  124.   
  125.    
  126.   
  127.         return this.objects.Pop();  
  128.   
  129.     }  
  130.   
  131.       
  132.   
  133.     public void push(T obj)  
  134.   
  135.     {  
  136.   
  137.         this.objects.Push(obj);  
  138.   
  139.     }  
  140.   
  141. }  
유니티 엔진에서 사용 할 수 있는 오브젝트 풀 스크립트 입니다.
c#으로 코딩했기 때문에 꼭 유니티가 아닌 프로젝트에서도 사용 할 수 있습니다.
모바일 게임을 만들다 보니 실시간으로 객체를 생성하는것이 굉장한 부담으로 다가오더군요.
그래서 이런 풀 시스템을 사용하여 미리 적당한 개수를 만들어 놓고 
꺼내오고, 넣어주고 하는 방법을 사용했습니다.

이걸 쓰기 전에는 몬스터가 나올때 마다 딜레이가 생겼었는데,
풀을 쓰고나니 처음에 로딩시간이 약간 더 걸린다는 단점이 있지만,
게임 플레이중에는 아주 쾌적하게 돌아가더군요.^_^)
더불어 메모리 사용량도 예측 가능하게 됐죠.

이 시스템을 사용하는 이유가 객체의 재사용 측면도 있지만,
그것보다는 객체 생성/해제시 딜레이를 없애준다는 점이 더 큰 성과인것 같습니다.

예제가 들어있는 패키지 파일은 첨부파일로 올렸습니다.
집에서 시간날때 만든것이고요, 소스코드 수정/배포/사용등은 사용하는 사람의 자유입니다.
시간없을땐 그냥 휙휙 긁어다가 사용해서 야근을 줄이세요~ㅎㅎ
더 좋은 방법이 있으면 댓글로 조언 남겨주시면 감사하겠습니다.



gameobjectpool.unitypackage


Trackback 0 And Comment 0