[펌] 유니티3D 페이스북 연동|작성자 미친바람
<!– 인터넷 접속 퍼미션 –> <uses-permission android:name=”android.permission.INTERNET”/> <application : : <!– 페이스북 로그인을 위한 엑티비티 –> <activity android:label=”@string/app_name” android:name=”com.facebook.LoginActivity”> </activity> <!– 페이스북 로그인을 위한 앱 아이디 등록 –> <meta-data android:value=”@string/app_id” android:name=”com.facebook.sdk.ApplicationId”/> </application> |
6. AssetsPluginsAndroid 에 복사한 res 폴더의 valuesstring.xml 수정
앱 아이디는 페이스북에 등록한 앱 정보에 있는 ‘앱 ID/API 키’ 를 입력하면 된다.
<resources> : : <!– 추가 –> <string name=”app_id”>111111111111111</string> </resources> |
7. FacebookManager 클래스 생성
FacebookManager 는 필자가 만든 클래스로 안정성이 검증되지 않았으니 참고만 하고 각자
프로젝트에 알맞게 사용하는 것을 추천.
import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import android.app.Activity; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.Signature; import android.util.Base64; import android.util.Log; import com.facebook.Request; import com.facebook.Response; import com.facebook.Session; import com.facebook.SessionState; import com.facebook.model.GraphUser; import com.unity3d.player.UnityPlayer; public class FacebookManager { private final String LOG_TAG = “FacebookManager Log”; GraphUser currentFBUser; // 유저 정보 private static FacebookManager _instance = null; public static FacebookManager Instance() { if(_instance == null) { _instance = new FacebookManager(); } return _instance; } // 로그인 public void LoginFacebook() { // start Facebook Login Session.openActiveSession(UnityPlayer.currentActivity, true, new Session.StatusCallback() { // callback when session changes state @Override public void call(Session session, SessionState state, Exception exception) { Log.d(LOG_TAG, “Session State ” + state.toString()); if (session.isOpened() == true) { // make request to the /me API Request.executeMeRequestAsync(session, new Request.GraphUserCallback() { // callback after Graph API response with user object @Override public void onCompleted(GraphUser user, Response response) { if (user != null) { currentFBUser = user; Log.d(LOG_TAG, “Login Success! ” + user.getName()); } else { Log.d(LOG_TAG, “Login Failed!”); } } }); } } }); } // 로그 아웃 public void LogoutFacebook() { Session session = Session.getActiveSession(); if(session != null && session.isClosed() == false) { session.closeAndClearTokenInformation(); } } // 로그인 상태를 얻는다. public boolean IsLogin() { Session session = Session.getActiveSession(); if(session != null) { return session.isOpened(); } return false; } // 해시키를 얻는다. public String GetHashKey(String packageName) { String hashKey = “”; try { PackageInfo info = UnityPlayer.currentActivity.getPackageManager().getPackageInfo(packageName, PackageManager.GET_SIGNATURES); for (Signature sig : info.signatures) { MessageDigest md = MessageDigest.getInstance(“SHA”); md.update(sig.toByteArray()); hashKey = Base64.encodeToString(md.digest(), Base64.DEFAULT); } } catch (NameNotFoundException e) { Log.d(LOG_TAG, “Error Hashkey not found”); } catch (NoSuchAlgorithmException e) { Log.d(LOG_TAG, “Error Hashkey no such algorithm”); } // 해시키를 출력. 이 값을 페이스북 개발자 센터의 등록한 앱에 기입 Log.d(LOG_TAG, “HashKey : ” + hashKey); return hashKey; } public void onActivityResult(Activity currentActivity, int requestCode, int resultCode, Intent data) { Session session = Session.getActiveSession(); if(session != null) { session.onActivityResult(currentActivity, requestCode, resultCode, data); } } } |
8. MainActivity 수정
import android.content.Intent; import android.os.Bundle; import android.util.Log; import com.google.android.gcm.GCMRegistrar; import com.unity3d.player.UnityPlayer; import com.unity3d.player.UnityPlayerActivity; public class TestMainActivity extends UnityPlayerActivity { private final String LOG_TAG = “TestMainActivity Log”; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 페이스북 연동을 위한 해시키를 얻어 온다. // keytool 을 이용하여 얻는 방법 말고 이 함수로 얻어 올 수도 있음. // 해시키를 얻었으면 필요 없는 코드. FacebookManager.Instance().GetHashKey(“com.company.testproject”); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); FacebookManager.Instance().onActivityResult(this, requestCode, resultCode, data); } // 페이스북 로그인 public void FacebookLogin() { FacebookManager.Instance().LoginFacebook(); } // 페이스북 로그 아웃 public void FacebookLogout() { FacebookManager.Instance().LogoutFacebook(); } // 페이스북 로그인 상태를 얻는다. public boolean IsFacebookLogin() { return FacebookManager.Instance().IsLogin(); } } |
9. 유니티 테스트 오브젝트 생성 및 스크립트 작성
AndroidManager 클래스는 GCM 구현 에 보면 소스가 있음.
using UnityEngine; using System.Collections; public class AndroidTest : MonoBehaviour { private bool showText = true; private bool facebookLogin = false; // Use this for initialization void Start () { } // Update is called once per frame void Update () { #if UNITY_ANDROID if(Input.GetKeyDown(KeyCode.Escape) == true) { Application.Quit(); } #endif } void OnGUI() { facebookLogin = AndroidManager.I.Call<bool>(“IsFacebookLogin”); if(GUI.Button(new Rect(0, 360, Screen.width, 100), facebookLogin ? “페이스북 로그아웃” : “페이스북 로그인”) == true) { if(facebookLogin == true) { AndroidManager.I.Call(“FacebookLogout”); } else { AndroidManager.I.Call(“FacebookLogin”); } } } } |
10. 유니티 빌드
. 참고 사항
– 테스트 전에 페이스북 어플을 로그 아웃 상태로 만들고 테스트 해보자.
– 로그인은 됐는데 연결이 안되는 경우.
로그인 부분의 SessionState 를 로그캣으로 봤을 때 CLOSED_LOGIN_FAILED 로 나온다.
필자는 해시키를 잘못 입력했거나 앱 ID를 잘못 입력했을 때 2가지 경우에 연결이 안됐다.
– 로그 아웃을 해도 재 로그인시 아이디를 물어보지 않고 바로 연결이 된다.
다른 아이디로 로그인을 하려면 페이스북 어플에서 직접 로그 아웃을 해야된다.
Bejeweled Blitz란 게임으로 테스트를 해봐도 같은 현상이 일어나는 걸 보면 시스템이 원래
그런 것 같아서 이부분은 신경쓰지 않기로 했음.
. 참고 사이트
– http://westwoodforever.blogspot.kr/2013/05/unity3d-facebook-sdk-for-android_31.html
'프로그래밍' 카테고리의 다른 글
Unity3D – SetActive (0) | 2023.02.09 |
---|---|
Unity Object Pool (0) | 2023.02.09 |
[펌] 이클립스로 안드로이드 JAR 생성해서 유니티에 연동 (0) | 2023.02.09 |
[SmoothMoves] Smooth Moves 2.x Tutorial 정리 (0) | 2023.02.09 |
[2D Toolkit] 스프라이트를 겹칠 때 경계가 보이는 문제 (0) | 2023.02.09 |