"If you do nothing, nothing will happen."

프로그래밍

[펌] 유니티3D 페이스북 연동|작성자 미친바람

tedhong 2023. 2. 9. 13:57
2013-07-10 글쓴이 TED HONG

[펌] 유니티3D 페이스북 연동|작성자 미친바람

 
. 순서
 1. 이클립스에서 페이스북 안드로이드 SDK 임포트.
 2. 안드로이드 페이스북 SDK 라이브러리 추가.
    프로젝트 Properties>Android>Library 에서 Add 클릭.
    facebook 라이브러리 추가.
 3. 유니티 AssetsPluginsAndroid 폴더에 페이스북 SDK bin 폴더에 있는 facebook.jar 파일과
    libs 폴더에 있는 android-support-v4.jar 파일을 복사.
    (facebook.jar 파일은 facebbokSDK.jar 라는 이름으로도 있는 모양임.)
 4. 유니티 AssetsPluginsAndroid 폴더에 페이스북 SDK 의 res 폴더를 통채로 복사.
 5. 유니티 AssetsPluginsAndroid 폴더에 facebookR.jar 파일 복사.
     (facebookR.jar 만드는 방법이 있긴 한데 잘 안된다. 그냥 첨부파일에서 다운 받아서 쓰자!)
 5. 유니티 AssetsPluginsAndroid 에 있는 AndroidManifest.xml 에 수정
<!– 인터넷 접속 퍼미션 –>
<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