10월, 2013의 게시물 표시

Unity3D iOS에서 C++ 서버와 통신중 한글이 ???로 나올 때

이미지
위 그림과 같이 유니티3D iOS 버전에서 C++로 된 자체 서버와 통신하는데 있어서 한글만 ???로 깨지는 이슈가 발생했습니다. 안드로이드에서는 잘 되고 있다고 하네요. 일단 서버는 멀티바이트로 처리중인 상황이라고 하구요.



if( GUI.Button( newRect (390, 250, 70, sizeHeight ), "ATTACK" ) == true ) { Packet.S_CR_RELAY_PACKET packet = new Packet.S_CR_RELAY_PACKET(); packet.targetUID = matchUserUID; byte[] chatbytes = Encoding.UTF8.GetBytes(chattingstring); packet.relayData = Convert.ToBase64String(chatbytes); Debug.Log(packet.relayData + "__" + chattingstring); //byte[] chatBytes=Encoding.Unicode.GetBytes(chat); //packet.relayData = Encoding.Unicode.GetString(chatBytes); ConnectToGameserver.GetInstance().SendPacket( packet ); }
 보낼 때 소스입니다. 처음에는 그냥 string를 Buffer.BlockCopy를 통해서 바로 보내다가 주석에 있는 것 처럼 Encoding.Unicode 로 해서 보내도 봤지만 위와 같이 보낼 스트링을 Encoding.UTF8.GetBytes 로 일단 byte[] 로 가져온 후 Convert.ToBase64String로 인코딩 처리 후 보내줘야하더군요.
void OnRecivePacket( Packet.S_RC_RELAY_PACKET packet) { Debug.Log("S_RC_RELAY_PACKET - SendUser:"+packet.senderUID.ToString()+"payload=…

Unity3D iOS Simulator Error DebugStringToFile(char const*, int, char const*, int, int, int, int, int)

Undefined symbols for architecture i386:
  "DebugStringToFile(char const*, int, char const*, int, int, int, int, int)", referenced from:
      prcore::Surface::ClearImage(prcore::color32 const&, prcore::Surface::ClearMode) in libiPhone-lib.a(blitter_integer.o)
      prcore::Surface::BlitImage(prcore::Surface const&, prcore::Surface::BlitMode) in libiPhone-lib.a(blitter_integer.o)
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

 유니티3D 최신 버전인 4.2.2에서 iOS 시뮬레이터로 빌드시 위와 같은 오류가 발생합니다. 디바이스로 테스트시엔 이상없지만 시뮬레이터로 테스트 하시는 분들은 4.2.2로 업데이트 하지마시고 4.2.1 이하로 개발 진행을 당분간 하셔야 할 듯 합니다. 유니티3D 포럼에서도 핫이슈? 중인데 4.2.2 버그로 보이고 해결이 되지 않고 있네요.

Unity3D no matching function for call to 'UnitySendMessage'

- (void) completeTransaction:(SKPaymentTransaction *)transaction
{ NSLog(@"InAppPurchase completeTransaction"); NSLog(@"InAppPurchase Transaction Identifier : %@", transaction.transactionIdentifier ); NSLog(@"InAppPurchase Transaction Data : %@", transaction.transactionDate ); ///< 구매완료후아이템인벤등게임쪽후처리진행 /*     const char* pszProductId = [[[transaction payment] productIdentifier] UTF8String];     UnitySendMessage("iOSManager", "ResultBuyItem", pszProductId);      */ NSString* strReceipt = [[NSStringalloc] initWithBytes:transaction.transactionReceipt.byteslength:transaction.transactionReceipt.lengthencoding:NSUTF8StringEncoding]; UnitySendMessage("iOSManager", "ResultBuyItem", strReceipt); // Remove the transaction from the payment queue.     [[SKPaymentQueuedefaultQueue] finishTransaction:transaction]; }

 위 소스는 기존에유니티3D iOS 인앱 연동 작업했던 것 중에서 빌트인 모델로 했던 것을 서버 모델로 하기 위해 영수증 정보를 유니티3D에 넘기게 수정한 부분입니다. 자세한 인앱 영수증 서버 처리는 추후에 정리해보기로…

cocos2d-x iOS7에서 CCLabelTTF 렌더링 이슈

이미지
cocos2d-x 2.1.4 이하 버전은 iOS7에는 그림과 같이 CCLabelTTF 가 보이지 않는 렌더링 이슈가 있습니다. cocos2dx/platform/ios/CCImage.mm 파일을 수정해줘야 하는데 깃허브에 수정 된 내역을 보면

staticbool _initWithString(constchar * pText, cocos2d::CCImage::ETextAlign eAlign, constchar * pFontName, int nSize, tImageInfo* pInfo) {
...

// ios7 //CGContextRef context = CGBitmapContextCreate(data, dim.width, dim.height, 8, dim.width * 4, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); CGContextRef context = CGBitmapContextCreate(data, dim.width, dim.height, 8, (int)dim.width * 4, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
 위와 같은 메서드의 내용중에 주석된 부분을 아래의 내용으로 대체해주면 됩니다. 즉 dim.withd * 4에서 (int)형 변환을 추가해주는 것이죠.


// normal fonts /*         if( [font isKindOfClass:[UIFont class] ] )         {             [str drawInRect:CGRectMake(0, startH, dim.width, dim.height) withFont:font lineBreakMode:(UILineBreakMode)UILineBreakModeWordWrap alignment:align];         }         else // ZFont class          {             […

Unity3D Facebook SDK for Android Integration - 5. 친구에게 앱 요청하기

이미지
유니티3D 안드로이드 페이스북 친구 목록을 얻어와 친구 프로필 사진을 출력까지 해봤습니다. 이번에는 친구에게 같이 게임을 하기 위한 앱 요청을 처리해보겠습니다.

// 요청 다이얼로그 관련 변수 추가
private WebDialog dialog = null; private String dialogAction = null; private Bundle dialogParams = null;


public void inviteFriends_U(final String strMessage, final String strSuggestedFriends) {
runOnUiThread(new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub
Bundle params = new Bundle();
params.putString("message", strMessage);
Log.d(LOG_TAG, "SuggestedFriends " + strSuggestedFriends);
if (strSuggestedFriends.isEmpty() == false) {
JSONArray jsonArr;
try {
jsonArr = new JSONArray(strSuggestedFriends);
String suggestedFriends[] = new String[jsonArr.length()];

for(int i = 0 ; i < jsonArr.length() ; i++) {
String strFbId = jsonArr.getJSONObject(i).getString("FacebookId");
suggestedFriends[i] = strFbId;
}
params.putString("suggestions", TextUtils.join(",", suggestedFriends));
} catch (JSONException e) {
// TODO Auto-g…

.NET C#에서 자바 JNI 통신하기

이미지
cocos2d-x에서 안드로이드와 네이티브 C++ JNI 통신을 해봤었고 유니티3D 안드로이드 플러그인과도 JNI 통신을 해봤습니다. 이번에는 닷넷 프레임워크 C#과 자바 JNI 통신 해야할 이슈가 생겨서 관련해서 R&D 해본것을 정리해봅니다.

Using the Java Native Interface in C#jni4netjnicsharpHow to wrap a C# library for use in JavaIKVM.NETj-Interop
 먼저 자바와 C#간 JNI 처리를 도와주는 모듈들이 위와 같이 몇개 있더군요. 이중에서 제일 위에 있는 것을 가지고 C# 콘솔 어플리케이션에 연동하는 것을 정리합니다.

 링크를 클릭하시면 코드프로젝트로 이동하게 되는데 가입하지 않았다면 가입을 하신 후 해당 소스코드를 다운로드 합니다.

 JNI.dll 레퍼런스를 얻기위해 적당한 곳에 압축 해제 후 프로젝트를 열어 빌드를 해줍니다.

 JNI\Component\bin\Debug 에 JNI.dll이 생성되었습니다. 잠시 후 이것을 C# 콘솔 프로젝트에 추가해야 합니다.

 C# 콘솔 프로젝트를 간단히 만드신 후 References 마우스 우클릭 후 Add Reference 를 선택합니다. 위와 같은 다이얼로그 창이 뜨면 Browse를 눌러 좀전에 빌드한 JNI 파일을 지정해줍니다.

 OK를 눌러 적용합니다.

 마지막으로 다운로드한 소스의 JNI 폴더에 있는 HelloWorld.class 파일을 작업중인 콘솔 프로젝트의 bin\debug에 복사해줍니다. 이 파일은 같이 있는 HelloWorld.java를 컴파일 한 듯하네요. 위 그림에서 오른쪽이 원본 소스고 왼쪽이 작업중인 C# 콘솔 프로젝트입니다.

 이것으로 준비작업은 되었구요, 이제 코드 작업입니다. 사실 소스 내용은 샘플 소스와 크게 다르지 않습니다. 윈폼 기반이냐 콘솔 기반이냐 차이죠.


using System;
using System.Collections.Generic;
using System.Linq;
using …

Unity3D Error building Player: FileNotFoundException: Could not find file /Unity-iPhone.xcodeproj/xxx.pbxuser

이미지
Error building Player: FileNotFoundException: Could not find file "/Volumes/MacintoshHD2/ProgramSource/iOSfacebookTest/Unity3DFacebook/Temp/StagingArea/iPhone-Trampoline/Unity-iPhone.xcodeproj/sanghakahn-mac.pbxuser".

 어느날 갑짜기 잘 빌드되던 페이스북 플러그인 프로젝트가 위와 같은 오류와 함께 빌드가 안되더군요.

Error building Player: FileNotFoundException: Could not find file "/Volumes/MacintoshHD2/ProgramSource/UnityiOSInAppTest/Unity3DiOSInApp/Temp/StagingArea/iPhone-Trampoline/Unity-iPhone.xcodeproj/sanghakahn-mac.pbxuser".
 왠걸? iOS 인앱 플러그인 프로젝트도 같은 에러로 빌드가 안되네요. 구글링을 해보면 Temp 폴더를 지우면 된다고도 하지만 되지 않더군요.
 일단 command + b를 눌러 메뉴얼 빌드를 시도할 때 기존 xcode 프로젝트가 iOSInAppPlugin 이었다면 위와 같이 임시 폴더로 하나더 빌드해줍니다.

 임시 iOSInAppPluginTemp xcode 프로젝트가 생성되었습니다.

 임시 프로젝트 폴더안에 있는 Unity-iPhone.xcodeproj 파일에서 마우스 우클릭 -> 패키지 내용 보기 하신후

 안에 있는 자신의 맥 환경에 맞는 username.pbxuser 파일을 복사합니다. 그리고 기존 xcode 프로젝트 폴더의 같은 파일을 패키지 내용 보기로 해서 안에 복사해주면 이상없이 빌드가 됩니다.

 위와 같은 과정이 불편하신 분들은 그냥 메뉴얼 빌드시 Replace를 하면 되지만 이경우 기존 xcode 프로젝트의 소스나 기타 리소스들이 초…

facebook 오류가 발생했습니다. 잠시 후 다시 시도하세요

이미지
페이스북 안드로이드 친구 요청 기능이 '페이스북 오류가 발생했습니다. 잠시 후 다시 시도하세요(An error ocurred. Please try later)' 메시지와 함께 안된다는 이슈가 발생했습니다.

 구글링을 해보면,

설치된 페이스북 앱에서 로그아웃 후 시도테스트 중인 앱을 삭제(캐쉬까지 깨끗이 삭제) 재설치 후 시도샌드박스 모드를 비활성화 후 시도
 등과 같은 것을 찾을 수 있었지만 샌드박스는 이미 비활성화 모드였고 나머지는 해결되지 않았습니다.

 이상한 것은 위와 같은 증상이 초대 버튼 클릭 후 로그인 창이 다시 뜨고 에러가 발생한다고 하더군요. 로그인은 이미 그전에 했는데요. 구글링 들어가보니 이건 페이스북 앱 ID 설정을 잘 못 SDK에 초기화 해줘서 생긴 이슈라더군요. 그래서 직접 앱 id를 다르게 세팅 후 빌드해서 테스트해보니 같은 증상이 나왔지만 태국에 빌드해서 넘겨준 버전은 제대로 세팅된 버전이었습니다.

 사내에서 이리저리 테스트중 어느순간부터 친구 초대가 잘 되더군요. 그사이 태국에서 뭔가 설정을 변경했거나 아니면 릴리즈 빌드하시는 분 개발 세팅 문제 인걸로 하고 일단 완료되었습니다. 소스 문제는 아니었거든요. 좀 찝찝하네요.

캔디크러시 사가에서도 비슷한 오류가 있어서 포럼에서 이슈가 있던적이 있네요.

cocos2d-x 2.2.0 Build Issues

이미지
cocos2d-x 2.x 버전중 가장 최신인 2.2.0를 가지고 샘플을 빌드 중 몇가지 처음 격어보는 에러들이 발생해서 정리해봅니다.
cocos2d-x-2.2.0Windows7android-ndk-r8e-windows-x86adt-bundle-windows-x86_64-20130917  환경은 위와 같습니다.

1. NDK_ROOT not defined. Please define NDK_ROOT in your environment or in local.properties

작년 7월 처음 cocos2d-x 설치하는 것을 정리했을 때는 cygwin에서 bashrc 파일에 패스를 설정해줘야 했었죠. 이부분에 있어 cygwin이나 vi가 익숙치 않으셨던 분들은 불편했을텐데 cocos2d-x와 안드로이드 SDK 등이 버전업이 되면서 기본적으로 추가되어 있는 이클립스에서 NDK를 빌드할 수 있는 CDT까지 갖추어져 있어 설정 및 빌드가 가능해졌네요. 예전보다는 빌드 환경이 많이 좋아지긴 했네요.

 이 에러는 그림과 같이 이클립스 Window -> Preferences -> C/C++ -> Build -> Environment에 New variable을 Name은 NDK_ROOT로 각자의 NDK가 설치된 환경에 맞게 추가해줍니다. 이렇게 해주면 굳이 C++ NDK 빌드를 cygwin에서 하지 않아도 이클립스에서 빌드가 가능하더군요. 물론 cygwin 환견변수에 설정을 먼저 했다면 이 오류는 발생하지 않습니다.


2. Error generating final archive: java.io.FileNotFoundException: C:\Projects\cocos2d-x-2.2.0\samples\Cpp\HelloCpp\proj.android\bin\resources.ap_ does not existHelloCppUnknownAndroid Packaging Problem

 Ploblems 로그는 위와 같고

Unable to add 'C:\Projects\co…

Unity3D Facebook SDK for iOS Integration 4. 친구 목록 얻기 및 친구에게 초대 요청하기

이미지
유니티3D iOS 페이스북 담벼락 게시 및 자신의 정보 얻기연동을 정리해봤습니다. 이번에는 친구 목록을 가져와 친구 프로필 사진을 출력해보고 친구에게 요청을 보내기를 정리해봅니다.

 먼저 iOS 플러그인 부분입니다.

//iOSFacebookPlugin.h

- (void) requestFriendsInfo; - (void) requestInviteFriends:(NSString*)strMessage              suggestedFriends:(NSString*)strSuggestedFriends;

- (NSDictionary*)parseURLParams:(NSString *)query;

//iOSFacebookPlugin.mm

extern"C" { ...    void iOSRequestFriendsInfo()     {         [[iOSFacebookPluginsharediOSFacebookPlugin] requestFriendsInfo];     }
void iOSRequestInviteFriends(constchar* pszInviteMessage, constchar* pszSuggestedFriends)     { NSString* strInviteMessage = [NSStringstringWithUTF8String:pszInviteMessage]; NSString* strSuggestedFriends = [NSStringstringWithUTF8String:pszSuggestedFriends];         [[iOSFacebookPluginsharediOSFacebookPlugin] requestInviteFriends:strInviteMessage suggestedFriends:strSuggestedFriends];     }    
}


@implementation iOSFacebookPlugin ...
- (void) requestFriendsInfo { if (FBSession.activeSession.isOpen) {  …

Unity3D Facebook SDK for iOS Integration 3. 담벼락게시 및 자신의 정보 얻기

이미지
유니티3D iOS 페이스북 로그인 및 로그아웃 처리를 정리해봤습니다. 이번에는 자신의 담벼락에 글 게시 및 자신의 정보를 가져오는 것을 정리해보겠습니다.

 먼저 iOS 플러그인 소스입니다.


//iOSFacebookPlugin.h

- (void) postToMeWall:(NSString*)strPostMsg;
- (void) requestMe;


//iOSFacebookPlugin.mm

// iOS의 최상단 GLViewController을 얻기위해
externUIViewController* UnityGetGLViewController();


extern"C" { ... void iOSPostToMeWall(constchar* pszPostMsg)     { NSString* strPostMsg = [NSStringstringWithUTF8String:pszPostMsg];         [[iOSFacebookPluginsharediOSFacebookPlugin] postToMeWall:strPostMsg];     } void iOSRequestMe()     {         [[iOSFacebookPluginsharediOSFacebookPlugin] requestMe];     }     }
}


@implementation iOSFacebookPlugin ...
- (void) postToMeWall:(NSString*)strPostMsg {    NSURL *urlToShare = [NSURLURLWithString:@"http://westwoodforever.blogspot.com"]; // If it is available, we will first try to post using the share dialog in the Facebook app FBAppCall *appCall = [FBDialogspresentShareDialogWithLink:urlToShare name:@"Hello Facebook" captio…