6월, 2013의 게시물 표시

Unity3D Android 91 Market Platform SDK Integration - 1. 준비작업

이미지
유니티3D 안드로이드에 중국 GameNoll의 SDK 연동을 했었습니다. 이번에는 중국에서 안즈와, 360마켓, 완또우자등과 함께 중국 안드로이드 시장을 대표하는 앱 마켓인 91.com의 마켓 플랫폼 SDK 연동을 위한 준비작업에 대해 포스팅해봅니다. GameNoll과 마찬가지로 해당 SDK 설치나 다운로드는 저도 제가 직접 받은게 아닌 업무적인 절차로 처리된 것을 받은것이라 이 부분은 잘 모르겠네요. SDK를 이미 가지고 있고 압축 해제까지 했다는 전제로 진행합니다.


1. 유니티3D 안드로이드 플러그인 기본 작업


유니티3D 안드로이드 Jar 플러그인 프로젝트를 만들어 기본적인 처리를 합니다. 전 스샷과 같이 패키지명을 com.wwforever.plugin91 이라고 했습니다. 참고로 91측에서 요구하는 필수 개발사항중 패키지명에 91이 위 스샷과 같이 꼭 포함 되어야한다고 하네요.


 다음으로 91SDK 압축해제 후 SDK_lib\91SDK_LibProject\libs 안에있는 NdComPlatform.jar 파일을 Java Build Path의 Add External JARs로 추가합니다.


2. AndroidManifest.xml 수정

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.SEND_SMS">…

Unity3D GameNoll SDK Android Integration - 1. 준비작업

이미지
중국에는 수백개의 안드로이드 마켓이 존재한다고 합니다. 구글 플레이와 국내 티스토어 등의 몇개 안되는 마켓과 같이 각개격파하듯 대응하면 답이 없겠죠. 너무 많으니까요. 중국 퍼블리셔?측의 NollGame인지 GameNoll 인지(사이트는 GameNoll인데 SDK명이 NollGame)를 통하면 SDK하나로 몇백개의 중국 마켓을 커버할 수 있다고합니다. 이번 포스팅은 유니티3D 안드로이드 GameNoll SDK 연동에 대한 내용입니다.

 GameNoll SDK를 어떻게 다운받는지는 모르겠네요. 저도 해외지원팀에게서 받은것이고 따로 직접 받으려고해도 중국사이트 접근자체가 안됩니다. 그러므로 SDK 다운로드 부분은 생략합니다.

 또한 GameNoll이외 몇개의 중국 마켓 SDK 연동에 대해 글을 포스팅 예정인데요. 모두 서버딴 작업은 제외된 클라이언트 딴 작업에 대한 내용만 있다는걸 미리 말씀드립니다.


1. NollGame Lib 추가

유니티3D 안드로이드 플러그인 기본형을 만든 후 GameNoll SDK\libs 디렉터리의 alipay_msp.jar와 NollGame-SDK-1.0-20130423.jar를 자바 빌드 패스에 추가합니다. NollGame-SDK는 파일명이 다를수 있겠네요. 유니티3D 플러그인 디렉터리에도 복사해줍니다.


2. CallbackListener 상속 클래스 추가


 스샷과 같이 nollgame에 있는 CallbackListener을 부모 클래스로하는 콜백 클래스를 하나 만듭니다. 저는 CallbackNollGame이라고 만들었습니다.


3. 권한 설정 추가

<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<use…

Google Blogger SyntaxHighlighter로 소스코드 이쁘게 삽입하기

이미지
그동안 제가 블로그에 정리했던 샘플 코드들이 위와같이 이쁘지 않았습니다. 구글 블로거에 그냥 텍스트 형식으로 붙여넣기가 되어버리는게 원인이었죠. 이번 포스팅은 구글 블로거에 소스코드를 이쁘게 삽입할 수 있는 신택스 하이라이터(SyntaxHighlighter)를 적용하는 것을 정리해봅니다.

 현재 3.0.83이 최신버전이네요. 최신버전 말고 2.1.382를 사용하시길 추천합니다. 3.0.83 사용했다가 제 블로그 최신 포스팅들이 검색 안되는 문제가 생겨서 블로그 이전하는등 삽질을 했었네요.

 직접다운로드해서 자신의 서버에 설치하거나 자신의 구글 코드 프로젝트에 설치 후 적용하는도 가능한 듯 보이지만, 따로 설치없이 바로 웹 링크를 통해서 적용해보도록 하겠습니다.

 블로거 -> 템플릿에서 사용중인 디자인의 HTML 편집을 클릭합니다.

<link href="http://alexgorbatchev.com/pub/sh/2.1.382/styles/shCore.css" rel="stylesheet" type="text/css" />
<link href="http://alexgorbatchev.com/pub/sh/2.1.382/styles/shThemeDefault.css" rel="stylesheet" type="text/css" />
<script src="http://alexgorbatchev.com/pub/sh/2.1.382/scripts/shCore.js" type="text/javascript">
</script>
<script src="http://alexgorbatchev.com/pub/sh/2.1.382/scripts/shBrushCpp.js" type="text/javascript">
</script>
&l…

Unity3D GameNoll SDK 로그인시 java.lang.NullPointerException

이미지
Shutting down VM
threadid=1: thread exiting with uncaught exception (group=0x40a461f8)
FATAL EXCEPTION: main
java.lang.Error: FATAL EXCEPTION [main]
Unity version     : 4.1.2f1
Device model      : Acer A500
Device fingerprint: acer/a500_ww_cus1/picasso:4.0.3/IML74K/1336617649:user/release-keys
Caused by: java.lang.NullPointerException
at com.nollgame.net.NollDialog.setUpTitle(NollDialog.java:231)
at com.nollgame.net.NollDialog.onCreate(NollDialog.java:79)
at android.app.Dialog.dispatchOnCreate(Dialog.java:353)
at android.app.Dialog.show(Dialog.java:257)
at com.nollgame.net.NollGame.memberLogin(NollGame.java:126)
at com.Test.unityandroidjartest.MainActivity$2.run(MainActivity.java:75)
at android.os.Handler.handleCallback(Handler.java:605)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4424)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:5…

Unity3D error CS1525: Unexpected symbol `else'

Assets/Plugin91Manager.cs(124,20): error CS1525: Unexpected symbol `else'
Assets/Plugin91Manager.cs(130,20): error CS1519: Unexpected symbol `else' in class, struct, or interface member declaration Assets/Plugin91Manager.cs(130,36): error CS1519: Unexpected symbol `==' in class, struct, or interface member declaration Assets/Plugin91Manager.cs(132,40): error CS1519: Unexpected symbol `=' in class, struct, or interface member declaration Assets/Plugin91Manager.cs(136,20): error CS8025: Parsing error
 유니티3D 안드로이드에 중국 91 마켓 Platform SDK 연동중에 위와 같이 에러가 발생했습니다. 오류 메세지를 보면 딱히 91 마켓 SDK 문제는 아니고 문법적인 이슈인 듯하죠.
// public static final int UPDATESTATUS_NONE = 0; // 이미 최신 버전임 if (strResult == "0") { this.strLogMsg = "Update None"; } // public static final int UPDATESTATUS_UNMOUNTED_SDCARD = 1; // SD 장착 안됨 else if(strResult == "1") { this.strLogMsg = "Update Failed. SDCard Unmounted"; } // public static final int UPDATESTATUS_CANCEL_UPDATE = …

Unity3D Android GCM Integration - 3. Send Single, Multi Push(without Server)

이미지
유니티3D에 안드로이드 GCM 클라이언트 부분인 Sender ID 등록과 푸시 메세지 핸들링 후 알림 띄우기까지 정리해봤습니다. 이번에는 마지막으로 서버측 처리를 정리하겠습니다. 하지만 미리 언급했듯이 JSP나 PHP등의 서버가 아닌 안드로이드 자바딴에서 클라이언트 + 서버 기능을 사용하는 내용입니다.


1. GCM Server 라이브러리 준비


  안드로이드 Jar 프로젝트 빌드를 위해 gcm 서버 기능을 사용하기 위해 gcm-server.jar 파일을 자비 빌드 패스에 추가해줍니다. 위치는 스샷에 보이는 것과 같이 androidsdk/extras/google/gcm/gcm-server/dist 에 있습니다.

 당연히 유니티3D 최종 빌드를 위해 플러그인 디렉터리에도 복사를 해줍니다.

 마지막으로 androidsdk/extras/google/gcm/gcm-server/lib 에 있는 json_simple-1.1.jar파일을 유니티3D 플러그인 디렉터리에 복사해줍니다. 이것이 없다면 java.lang.NoClassDefFoundError: org.json.simple.JSONValue 오류가 발생합니다.


2. GCM에 단일 또는 멀티로 푸시하기

 원래는 자체 서버딴에서 처리해야할 푸시 기능을 안드로이드 프로젝트에 자바로 구현한 부분을 정리해보겠습니다. 아래는 기존 MainActivity에 추가 된 것입니다.

publicclass MainActivity extends UnityPlayerActivity { privatefinal String LOG_TAG = "UNITY_GCM_TEST"; privatefinal String GCM_SENDER_ID = "xxxxxxxxxxxx"; // API ACCESS KEY privatefinal String API_KEY = "xxxxxxxxxxxxxxx"; // 이 앱을 실행중인 디바이스의 RegId private String strRegId = null; // 현 디바이스와 다른 디바…

Unity3D GCM java.lang.NoClassDefFoundError: org.json.simple.JSONValue

이미지
FATAL EXCEPTION: AsyncTask #1
java.lang.Error: FATAL EXCEPTION [AsyncTask #1]
Unity version     : 4.1.2f1
Device model      : Acer A500
Device fingerprint: acer/a500_ww_cus1/picasso:4.0.3/IML74K/xxxxxxx:user/release-keys
Caused by: java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:278)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:856)
Caused by: java.lang.NoClassDefFoundError: org.json.simple.JSONValue
at com.google.android.gcm.ser…

cocos2d-x Unity3D 처럼 쉽고 빠르게 개발할 수 있을까?

이미지
cocos2d-x로 게임 개발하시는게 많이들 불편하시진 않았나요? 퍼포먼스 이슈나 외부 SDK 연동 이슈 같은 것을 제외하고라도 첫 시작인 프로젝트 개발 환경 설정하는 것에서부터 최종 빌드하는 것까지 마무리 할려면 한번쯤 곤욕을 치루게되죠. 제 블로그의 수많은 포스팅들이 그 것을 증명?을 해주고 있습니다. 상용 엔진이 아닌 오픈소스 엔진이다보니 어느정도 불편함을 감안한다고 하더라도 많은 사람들이 스트레스를 적잖이 받은건 사실입니다.


cocos2d-x 2.1.4 업데이트

 약 하루전에 cocos2d 씨리즈가 5번째 합동? 릴리즈를 했습니다. 지속적인 업데이트가 이루어지는 모습 보기 좋네요. 간단히 하이라이트를 보면,
HighlightsAdded support for XMLHttpRequest and WebSocket on JSBAdded support for encoded JavaScript files and add command line tool for generating javacript codeUpgraded Spidermonkey to v21Added support for Emscpriten and Tizen port, usage of Emscpriten and usage of TizenAssetsManager downloads resources in a new threadCCLabelTTF supports shadows and strokeAdded support for ETC1 image format on AndroidAdded many test cases for Lua bindingsAdded more plugins: weibo, twitter
 위와 같고 자세한 업데이트 체인지 로그는 링크를 통해 확인할 수 있습니다. 크게 눈에 띄는건 WebSocket 추가, CCLabelTTF에서 그림자 처리 지원, Lee Jae-Hong님께서 cocos2d-x를 타이젠으로 포팅하신 것이 정식으로 적용된 것이 눈에 띄네요.


cocos2d-x Component Bas…

Unity3D 91.com SDK android.content.res.Resources$NotFoundException: Resource ID #0x0

이미지
FATAL EXCEPTION: main
java.lang.Error: FATAL EXCEPTION [main]
Unity version     : 4.1.2f1
Device model      : Acer A500
Caused by: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.wwforever.plugin91/com.nd.commplatform.activity.SNSLoginActivity}: android.content.res.Resources$NotFoundException: Resource ID #0x0
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
at android.app.ActivityThread.access$600(ActivityThread.java:123)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4424)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.Zygot…

APK 파일 Compile, Decompile 해보자. APK Manager

이미지
안드로이드를 사용한다면 한번쯤 APK Manager라는 것을 들어봤을 수 있습니다. 보통 테마를 만든다던지, 게임 데이터 조작이나 리소스 추출 또는 변경등을 하기위해 APK Mnager를 사용 하는 것 같더군요.

 제 경우는 중국 SDK를 연동중에 이상한 요구사항때문에 만지게 되었는데요, 요구사항에 대한 것은 다음에 중국 SDK 연동 포스팅에서 정리하기로하고 이번 포스팅에서는 직접 개발한 APK파일을 APK Manager로 컴파일, 디컴파일하는 것을 정리해보겠습니다. 보통은 framework-res.apk와 SystemUI.apk등을 필요로하는 것 같더군요.


1. APK Manager 설치

Redmaner라는 분의 블로그에 가보면 링크를 통해 다운로드 할 수 있습니다. 또는 아래 링크를 클릭해 직접 다운로드합니다. 5.1이 최신인 듯하네요. 블로그를 보니 요구사항으로 자바 1.6과 안드로이드 SDK를 필요로하니 설치되지 않은분은 설치하시기 바랍니다.

APK Manager 5.1 Windows

 다운로드 후 적당한 곳에 압축해제합니다.


2. 디컴파일

 place-apk-here-for-modding 디렉터리에 작업을 진행할 APK 파일을 넣어줍니다. AndroidBuild.apk와 Unity3DBuild.apk를 넣어봤습니다. 이름 그대로 이클립스에서 빌드한 순수 안드로이드 apk 파일과 유니티3D에서 빌드한 안드로이드 apk파일입니다.

 상위 디렉터리에 있는 Script.bat를 실행하면 위와같이 콘솔창이 뜹니다. 작업할 apk를 선택하기위해 22를 입력합니다.

 작업 디렉터리에 넣었던 apk가 보입니다. AndroidBuild.apk로 진행해 보겠습니다. 1을 선택합니다.

 오른쪽 위에 보면 선택한 apk명이 보입니다. Decompile apk인 9번을 선택하면 디컴파일이 진행됩니다.

 디컴파일된 apk의 파일들은 projects안에 파일명과 같게 생성 된 디렉터리 안에 생성됩니다.


3. 컴파일

 컴파일도 메뉴 몇번만 선택해주면 쉽습니다. 디컴파일과 같이 22번을…

Unity3D Android GCM Integration - 2. Sender ID 등록 및 Push 메세지 핸들링 후 알림 띄우기

이미지
유니티3D 안드로이드 푸시 처리를 위한 GCM 연동 준비작업을 정리했었습니다. 이번에는 안드로이드 디바이스에서 GCM 푸시를 받을 수 있게 Sender ID를 등록하고 푸시 메세지 핸들링을 처리할 GCMBaseIntentService를 상속받는 GCMIntentService 클래스 클라이언트쪽 작업을 정리해보겠습니다.

자체 서버(JSP든 PHP든) + DB + 운영툴(공지 메세지 보내기)  보통은 GCM 푸시하려면 위와 같은 구조로 서버 구성을 하겠죠. 제가 정리할 내용은 아래와 같은 구조입니다.

자체 서버 없음. 앱 하나에서 GCM Push Send까지 다 함.DB 없음. 등록된 디바이스는 오직 한개라고 정의하고 간단히 멤버변수에 때려박음.운영툴 없음. GUI TextFiled로 입력받은 스트링을 GCM에 보냄.
 한마디로 with out Server 구조입니다. 즉, Client -> GCM -> 동일 Client 이런식이 되는거죠. 혼자 북치고 장구치고 다 하는 튜토리얼입니다. 일반적으론 각자 구현한 Server -> GCM -> Clients 이렇게 되겠죠. 제가 서버 개발자가 아니라서 일단 이렇게 하는데요, 서버와의 연동부분이 필요한 부분은 소스구현없이 따로 살짝 언급하고 진행하도록 하겠습니다.


1. 안드로이드

publicclass MainActivity extends UnityPlayerActivity { privatefinal String LOG_TAG = "UNITY_GCM_TEST"; privatefinal String GCM_SENDER_ID = "1111111111111"; private String strRegId = null;
@Override protectedvoid onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); GCMRegistrar.checkDevice(this); GCMRegistrar.checkManife…