이번 포스팅은 Facebook Unity SDK(https://developers.facebook.com/)를 이용하여 Unity와 facebook을 연동하는 방법에 대해서 다룹니다. 예제 코드는 facebook sdk 패키지를 import하면 만들어지는 Examples/InteractiveConsole이 깔끔하고 쉽게 나와있으므로 그것을 보시는 것이 좋습니다. 


본 포스팅에서는 InteractiveConsole 예제를 실행하면서 겪었던 환경 셋팅 문제를 주로 다룹니다. 현재 안드로이드 버젼마 다루고 있으며 ios의 경우에는 해당 작업을 하게 되면 추가하도록 하겠습니다.


준비 작업 :

  • Java SDK(ver 1.7) : : facebook 앱 인증에 필요한 key hash를 생성하는데 사용됩니다.
  • OpenSSL(dowload) : facebook key hash를 생성과 안드로이드 빌드 위해 필요 합니다.
    • Java SDK와 OpenSSL의 경우에는 설치를 하고 환경 변수 PATH에 bin 디렉토리의 경로를 등록합니다.
  • Unity 3D(ver. 4.3.4f) : http://unity3d.com/ 에서 다운 받으시면 됩니다. 자세한 설명은 생략합니다.
  • Facebook Unity SDK(ver 4.3.6) : https://developers.facebook.com/docs/unity/downloads/ 에서 다운 받으시면 됩니라. 링크가 변경 되었더라도 충분히 검색을 통해 찾으실수 있으리라 믿습니다.
  • 혹시나 몰라 버젼을 기록해 두었습니다. 뭔가 이상하게 돌아간다면 버젼을 확인해보시고 버젼이 상이하고 이 문서가 더 이상 도움이 되지 않는다고 생각 되시면 kukuta@gmail.com으로 메일 주십시오.

Overview : 

  우리가 하게 될 작업에 대해 간단하게 알아 보겠습니다.

  1. 일단 Unity가 설치되어 있어야 합니다.
  2. Facebook Unity SDK를 Unity 프로젝트에 import 합니다. 
  3. Facebook app을 만듭니다.
  4. Unity에서 Build Setting과 Facebook 연동.
  5. 빌드해서 스마트 폰에 올려 봅니다.
  6. 테스트 합니다.
  7. 문제를 발견 합니다..고칩니다..빌드해서 스마트 폰에 올려 봅니다..테스트 합니다..문제르..쿨럭..

step 1. Unity 설치

  • 알아서들 설치 합니다. 이 포스트를 볼 정도면 Unity 설치가 문제가 아니라고 생각 됩니다.

step 2. Facebook Unity SDK Download & Import

  • https://developers.facebook.com/docs/unity/downloads/ 에서 SDK를 다운 받습니다.
  • 페이지가 깨지거나 링크가 달라지더라도 검색을 통해 알아서 다운 받으실수 있다고 믿습니다.
  • 다운로드 받고 custom import 하는 부분에 대해서도 설명을 생략합니다.
  • SDK가 import 되고 나면 Unity 메뉴에 'Facebook'이 추가 됩니다.
  • https://developers.facebook.com/docs/unity/getting-started/canvas 참조

step 3. Facebook 앱 만들기

  • Facebook 앱 생성에 대한 설명 역시 생략합니다.
  • 설정에 필요한 Package Name, Class Name, Key Hashes 항목은 Unity 셋팅을 통해 생성됩니다. 
  • 본 포스팅 마지막 과정에서 위 세개 값을 Unity로 부터 생성하여 복사해서 넣도록 하겠습니다.

step 4. Unity와 Facebook 연동

1) App Name, App Id - "Invalid App Id"

  • Unity 프로젝트 생성, Scene 생성 등에 대한 설명은 생략합니다.
  • 'Facebook > Edit Settings' 메뉴를 클릭하면 Facebook Settings Inspector가 뜹니다.
  • 'Facebook 앱'에서 App Name과 App Id 복사해 붙여 넣습니다.

2) 플랫폼 안드로이드로 변경

  • 'File > Build Settings' 메뉴를 클릭, Platform=Android 변경, Switch Platform을 클릭하여 플랫폼을 변경합니다.

3) Package Name 지정

  • 'Facebook > Edit Settings'에 보면 기본 Package Name이 (com.Company.ProductName) 셋팅 되어 있습니다.
  • 'File > Build Settings > Player Settings 클릭 > Inspector 창 > Other Settings 메뉴 > Bundle Identifier'를 수정
4) Class Name
  • 'com.facebook.unity.FBUnityDeepLinkingActivity'
  • 지정되어 있는대로 내비둡니다. 나중에 이걸 복사해서 facebook 엡에 붙여 넣을 겁니다.

5) Key Hash 생성

  • 조심하십시오. 가장 많은 삽질이 여기서 일어납니다!!!
  • "your android debug keystorefile is missing! you can create new one by creating and build empty android project in eclipse" 가 디스플레이 되고 있다면 아직은 정상입니다. 
  • key hash를 먼저 생성해 주어야 합니다. 그러기 위해서는 Java SDK 에 들어 있는 keytool과 OpenSSL이 필요 합니다. (혹시 아직 설치하지 않았다면 Java SDK와  OpenSSL을 설치하시고 환경 변수(PATH)에 bin 디렉토리를 등록하신 다음 여기로 돌아 오시기 바랍니다)
  • 커맨드 창을 열어 다음과 같이 입력 합니다 :

keytool -genkey -alias androiddebugkey -keystore D:\Project\FacebookLogin\Facebook\debug.keystore| "openssl.exe" sha1 -binary | "openssl.exe" base64

    • '-genkey' : 키를 생성하라는 옵션입니다.
      Facebook 가이드 문서를 보면 -exportcert 옵션을 사용하는데, 이 옵션의 경우 파일이 없는 경우 새로 생성 해내지 않습니다. 하지만 우리는 대부분 처음 작업하는 사람인지라 기존 파일이 없겠지요.
    • '-alias' : 뭔지 잘 모르겠습니다. 그냥 androiddebugkey라고 적어 줍니다.
    • '-keystore' : key가 저장될 위치와 이름을 지정합니다.
      상대 경로도 가능한지 모르겠습니다. 지정된 디렉토리가 없는 경우 새로 생성하지 않고 실패 합니다. 디렉토리는 미리 생성 되어 있어야 합니다.
    • 나머지는 그냥 그대로 따라 쓰면 됩니다.
  • 정상적인 상황이라면 패스워드를 물어 옵니다. "android" 를 입력 합니다. 그 외에 질문하는 것들은 모두 엔터로 넘겨 버리고 맨 마지막 질문에 "yes(한글 버젼이면 예)"를 타이핑합니다. 이렇게 되면 key hash 생성에 성공 입니다.(따옴표는 입력하지 않습니다. 만일 패스워드를 묻지 않는다면 뭔가 잘못 된 것입니다.)

6) 'File > Build Settings > Player Settings 클릭 > Inspector 창 > Publishing Settings

  • Use Existing Keystore 체크
  • Browse Keystore클릭 하고 이전에 생성해놓은 debug.keystore 위치를 찾아 선택
  • Keystore password에 "android" 입력
  • Alias 에서 androiddebukey 선택
  • Password "android" 

  • 위와 같이 셋팅하고 다시 'Facebook > Edit Settings' 메뉴로 돌아가면 Package Name, Class Name, Debug Android Key Hash가 모두 반영 되어있습니다.
  • ..라고 하고 싶지만 여전히 "your android debug keystorefile is missing! you can create new one by creating and build empty android project in eclipse" 메시지가 나오고 있을 겁니다.
  • Facebook SDK의 윈도우쪽 버그로써 아래 Trouble Shooting에서 다루겠습니다.

7) Unity로 부터 Package Name, Class Name, Key Hash를 복사 & 붙여 넣기를 하고 저장

  • 'Facebook > Edit Settings'
  • Package Name, Class Name, Key Hash를 페이스 북에 복사 & 붙여 넣기
  • 로그인 테스트를 하는데 개발자만 로그인이 되고 다른 사람들이 로그인 되지 않는 경우는 아래 Trouble Shooting 항목을 참고 하세요.

step 5. Build & Run on Device

  • Facebook SDK 4.3버젼에서는 PC에서 로그인 테스트를 하는 경우 무조건 성공을 떨어뜨리는 버그가 있다. 제대로된 테스트를 위해서는 꼭 장치에 올려서 테스트 해보도록 한다.

step 6. Trouble Shooting :

  • "your android debug keystorefile is missing! you can create new one by creating and build empty android project in eclipse"
    • key hash 파일이 생성되지 않았거나, 지정된 위치에 없으면 발생하는 에러 메시지 입니다.
    • key hash 파일을 생성했고, 해당 파일이 지정된 디렉토리에 있는데도 불구하고 위 메시지가 발생 되는 경우원인은 Facebook Unity SDK 의 버그로써 SDK에서는 key hash 파일을 특정 위치에만 놓고 사용하도록 코드가 만들어져 있습니다(윈도우의 경우에는 "C:/Users/<계정>/.android/debug.keystore", 리눅스 or 맥의 경우에는 ~/.android/debug.keystore). 그런데 윈도우의 경우에는 앞에 "C:/" 부분이 빠져 있기 때문에 SDK 코드를 직접 수정해야만 합니다(http://answers.unity3d.com/questions/596752/android-debug-keystore-file-is-missing.html) :

    • 저 같은 경우 Unity 프로젝트 내에 Facebook이라는 디렉토리를 만들고 그 안에 debug.keystore 파일을 저장했습니다만..각자 편한대로 수정해서 사용하시면 될듯 합니다.
  • "openssl not found. make sure that openssl is installed and that it is in your path"
    • open ssl이 PATH 환경 변수에 제대로 등록 되지 않은 것입니다. 등록하시고 unity를 재시작 합니다.
  • 개발자만 로그인이 되고 다른 사람 계정은 로그인이 되지 않아요!
    • Facebook 앱을 공개로 변경하지 않으면 앱 개발자만 로그인 할수 있습니다. Status & Review 설정에서 앱을 공개로 변경하거나 테스트 사용자를 등록하여 로그인하셔야 합니다.


Posted by kukuta

댓글을 달아 주세요

  1. Favicon of http://QuainTree.tistory.com BlogIcon SOVOT 2014.04.03 10:00  댓글주소  수정/삭제  댓글쓰기

    좋은 글 감사합니다 여러 모로 많은 도움이 되었습니다~ 궁금한 점이 있는데요 페이스북 설정에서 key hash 값은 유니티 페이스북 세팅에서 보여지는 Debug Android Key Hash 값을 계속 사용하면 되는건가요?

  2. ItsMe 2014.07.24 00:12  댓글주소  수정/삭제  댓글쓰기

    좋은 정보 진심으로 감사드립니다.
    좋은 하루되세요~ ^^

  3. BlogIcon 데코 2014.08.28 18:15  댓글주소  수정/삭제  댓글쓰기

    좋은글 감사합니다 트러블슈팅이 아주 도움이 되었습니다.

  4. 다른사람도 보여주고싶은데 ㅠㅠ 2014.10.31 16:38  댓글주소  수정/삭제  댓글쓰기

    아래 설명해 주셨지만 경로좀 알수 있을까요 ...?

  5. 스타키 2014.11.16 00:24  댓글주소  수정/삭제  댓글쓰기

    잘 보고 갑니다!

  6. mgk 2014.12.08 22:06  댓글주소  수정/삭제  댓글쓰기

    좋은글 감사드립니다.
    설정이 제대로 된것 같은데 정작 apk 파일 만들어서 폰에서 실행시키면
    FB.Login 함수 호출되는 타이밍에 애플리케이션이 비정상 종료되네요..
    조언부탁드립니다.

  7. 토고망고 2015.03.09 07:42  댓글주소  수정/삭제  댓글쓰기

    개인 개발자입니다. 능력자님 덕분에 막혔던 부분을 해결하고 갑니다. 고맙습니다~!

  8. 초식식물 2017.01.04 11:14  댓글주소  수정/삭제  댓글쓰기

    감사합니다 :) 덕분에 해결됬네여

px - 픽셀(pixel)

in - 인치(inche)

mm - 밀리미터(millimeter)

pt - 포인트(point) 1/72 인치

dip(=dp) - Density-independent Pixels - 추상적 단위. 스크린을 160dpi로 보고, 160 dpi 스크린에서는 1dp는 1픽셀.

sp - scale independent pixels - dp와 비슷. 유저가 지정한 폰트 사이즈에 따라 스케일이 조절된다는데..무슨말인지..


ref. http://stackoverflow.com/questions/2025282/difference-of-px-dp-dip-and-sp-in-android

Posted by kukuta

댓글을 달아 주세요

안드로이드 어플리케이션에서 다이얼로그 안에 Spinner를 하나 붙이려고 했으나 모든 것이 정상인것 처럼 보임에도 불구하고 Spinner 객체가 null롤 셋팅 되는 현상이 있었습니다. 코드는 아래와 같습니다 :

static final int DLG_ID_INSERT = 0;
private Spinner spinner;
private ArrayAdapter<CharSequence> adapter;

protected Dialog onCreateDialog(int id) {
    Dialog dlg = null;
    switch (id) {
    case DLG_ID_INSERT:
        dlg = new Dialog(this);
        dlg.setContentView(R.layout.insert_dlg);
   
        spinner = (Spinner)findViewById(R.id.spinner_item_category); // null
        ArrayList<CharSequence> list = new ArrayList<CharSequence>();
        list.add("category1");
        list.add("category2");

        adapter = new ArrayAdapter<CharSequence>(this, android.R.layout.simple_spinner_item, list);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
   
        spinner.setAdapter(adapter); // NullPointerException!!
        break;
    }
}

문제는 Spinner 객체를 찾지를 못한다는 것이었습니다. 근 하루를 삽질한 끝에 인터넷에서 답을 발견했습니다..의외로 허망한 것이더군요(http://efreedom.com/Question/1-3673717/Set-Spinner-Within-Custom-Dialog) :

static final int DLG_ID_INSERT = 0;
private Spinner spinner;
private ArrayAdapter<CharSequence> adapter;

protected Dialog onCreateDialog(int id) {
    Dialog dlg = null;
    switch (id) {
    case DLG_ID_INSERT:
        dlg = new Dialog(this);
        dlg.setContentView(R.layout.dialog);
   
        spinner = (Spinner)dlg.findViewById(R.id.spinner_item_category); 
        ArrayList<CharSequence> list = new ArrayList<CharSequence>();
        list.add("category1");
        list.add("category2");

        adapter = new ArrayAdapter<CharSequence>(this, android.R.layout.simple_spinner_item, list);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
   
        spinner.setAdapter(adapter); // OK!!
        break;
    }
}


수정한 것이라고는 findViewById함수 앞에 dlg 객체를 명시한 것 입니다. dialog.xml 레이아웃에서 뭔가를 읽어 오려고 하면 그것을 이용해 만들어진 View에서 찾았었어야 할 것을 너무 교제만 따라하다 발생한 실수 였습니다.

다른 누군가에게 도움이 되었으면 합니다.

Posted by kukuta

댓글을 달아 주세요

  1. Favicon of http://blog.ggamsso.wo.tc BlogIcon 깜쏘 2010.12.23 22:13  댓글주소  수정/삭제  댓글쓰기

    갑자기 왠 안드로이드입니까...
    이건 뭔 일입니까...

  2. Favicon of http://blog.naver.com/zalnon2 BlogIcon 감사합니다. 2011.11.03 09:25  댓글주소  수정/삭제  댓글쓰기

    감사합니다. 많은 도움이 되었습니다.

    제 블로그에 퍼갑니다.

    수고하세요~

  3. 정말 감사합니다. 2012.06.20 16:23  댓글주소  수정/삭제  댓글쓰기

    몇시간 동안 이유를 알수없었는데 덕분에 해결되었네요. 이렇게 또 배우네요...

  4. ㅇㅇ 2012.07.25 11:01  댓글주소  수정/삭제  댓글쓰기

    진짜 레알 큰 도움이 되었습니다 감사합니다^^

  5. gxuk 2012.10.03 00:57  댓글주소  수정/삭제  댓글쓰기

    아...... 정말 감사합니다.ㅠ 후어어어엉

  6. 우와 2012.11.15 11:00  댓글주소  수정/삭제  댓글쓰기

    간지러운 곳을 긁어주셨네요. 땡큐베리감사용

  7. 허허 2015.06.09 15:01  댓글주소  수정/삭제  댓글쓰기

    허 감사합니다..전 프래그먼트에서 사용중이었는데, getActivity가 아닌 dialog를 사용해야했었군요..수정햇더니 잘됩니다..정말 감사합니다.