2015-01-29 9 views
1

나는 Unity3d 게임에서 페이스 북에 게시하고 싶습니다. 설정에 대한유니티 통합 (또는 다른 브릿지 옵션)없이 CanvasFacebook.dll로드하기

정보 :

  • 유니티 4.6.1
  • Unity Facebook SDK v6.1.0
  • 내가 구축 OS의 X를 사용하고 있습니다. Safari에서 게임 테스트.

아시다시피 Facebook Canvas는 Unity 통합을 사용하는 옵션을 제공합니다. 이 옵션에 대한 설명은 다음과 같습니다

"예"를 사용하는 페이스 북 유니티 SDK

하지만 유니티 플레이어가로드되기 전에 표시됩니다 사용자 정의 캔버스 페이지를 갖고 싶어. 그렇기 때문에 페이스 북 캔버스 (Facebook Canvas)의 Unity 통합 사용을 중단해야합니다. 그래서 현재 내 응용 프로그램을 제공하는 서버가 있습니다. 화합 플러그인을 제외한 모든 것이 잘 작동합니다.

첫 번째 문제는 CanvasFacebook.dllAuthToken.unityhash 파일이 부족하다는 것입니다. 나는 이것을 this link (dll)과 this one (유니티쉬)에서 다운로드하여 해결했다. 그리고 내 서버의 해당 경로 (rsrc/unity/lib/sdk_6.1/CanvasFacebook.dllrsrc/unity/key/sdk_6.1/AuthToken.unityhash)에 배치합니다. 자 이제 FB.cs이 문제없이이 DLL을로드합니다.

하지만 이제 또 다른 문제가 있습니다.

var fb = typeof(FBComponentFactory) 
     .GetMethod("GetComponent") 
     .MakeGenericMethod(facebookClass) 
     .Invoke(null, new object[] { IfNotExist.AddNew }) as IFacebook; 

내가 페이스 북 캔버스에서 유니티 통합을 사용하는 경우이 코드는 작동합니다 FB.cs에서 코드가있다. 하지만 유니티 통합을 비활성화하고 페이스 북 내부에서 애플리케이션을 실행하면 언급 된 코드가 실행되고 오류가 발생하지 않습니다. 실패했음을 어떻게 알 수 있습니까? 음, 더 이상 가지 않습니다. 간단한 검사 - 을 var fb = ... ; 바로 뒤에 추가하고 Log 메서드가 호출되지 않는 것을 확인하십시오. 그런데, 나는 꽤 많은 것들을 가지고 Application.ExternalCall("console.log", message) 같은 것을 호출하는 로그 처리기를 가지고있다.

좋아, 그래서이 코드가 사용자 정의 캔버스에서 작동하지 않는지 확인하려고했습니다. 왜 내가 dll이로드되고 작동해야한다고 생각합니까? 바로 이후이므로

var assembly = Security.LoadAndVerifyAssembly (www.bytes, authTokenWww.text); ... var facebookClass = assembly.GetType (facebookNamespace + className);

facebookClass은 null이 아니며 CanvasFacebook입니다. 이상, 나는 그것을 발견

var methodInfo = typeof(FBComponentFactory) 
       .GetMethod("GetComponent") 
       .MakeGenericMethod(facebookClass); 

또한 작동합니다. 이 메서드를 호출하면 문제가 발생합니다. 내가

하려고하면
var fb = methodInfo.Invoke(null, new object[] { IfNotExist.ReturnNull }) as IFacebook; 

전화는 작동하지만 fbnull입니다. 그래서 을 사용하여 FBComponentFactory 클래스를 확인했습니다. IFacebook.dll에서 sdk.그리고 여기에 클래스 정의가 있습니다 :

using System; 
using UnityEngine; 
namespace Facebook 
{ 
    public class FBComponentFactory 
    { 
     public const string gameObjectName = "UnityFacebookSDKPlugin"; 
     private static GameObject facebookGameObject; 
     private static GameObject FacebookGameObject 
     { 
      get 
      { 
       if (FBComponentFactory.facebookGameObject == null) 
       { 
        FBComponentFactory.facebookGameObject = new GameObject("UnityFacebookSDKPlugin"); 
       } 
       return FBComponentFactory.facebookGameObject; 
      } 
     } 
     public static T GetComponent<T>(IfNotExist ifNotExist = IfNotExist.AddNew) where T : MonoBehaviour 
     { 
      GameObject gameObject = FBComponentFactory.FacebookGameObject; 
      T t = gameObject.GetComponent<T>(); 
      if (t == null && ifNotExist == IfNotExist.AddNew) 
      { 
       t = gameObject.AddComponent<T>(); 
      } 
      return t; 
     } 
     public static T AddComponent<T>() where T : MonoBehaviour 
     { 
      return FBComponentFactory.FacebookGameObject.AddComponent<T>(); 
     } 
    } 
} 

그럼 이제 문제는 구성 요소를 추가하는 것입니다. 하지만 아무런 오류도 발생시키지 않습니다. (음, try catch을 사용하여 잡을 수는 없습니다.) 그래서 명시 적으로 FB.cs에서 AddComponent에 노력했다 (난이 해킹 못생긴 것을 알고,하지만 난 그냥 문제의 근본 이해하려고 노력하고 있어요) : 그들은 console.error를 호출하기 때문에

var type = typeof(FBComponentFactory); 
Debug.LogError("I got type: " + type); 
var fieldInfo = type.GetField("facebookGameObject", BindingFlags.NonPublic | BindingFlags.Static); 
Debug.LogError("I got fieldInfo: " + fieldInfo); 
var go = fieldInfo.GetValue(null) as GameObject; 

if (go == null) { 
    Debug.LogError("go is null, so creating new one"); 
    fieldInfo.SetValue(null, new GameObject("UnityFacebookSDKPlugin")); 
    go = fieldInfo.GetValue(null) as GameObject; 
} 

Debug.LogError("I got go with name: " + (go == null ? "null" : go.name)); 
var component = go.AddComponent(facebookClass); 
Debug.LogError("got component of type: " + component.GetType()); 
var fb = component is IFacebook; 

내가 로그 오류를 사용하고 그것입니다 브라우저 로그에서 좀 더 쉽게 볼 수 있습니다.

[Error] 7.24 I got type: Facebook.FBComponentFactory 
[Error] 7.24 I got fieldInfo: UnityEngine.GameObject facebookGameObject 
[Error] 7.24 I got go with name: UnityFacebookSDKPlugin 

그러나 Debug.LogError("got component of type: " + component.GetType());이 실행되지 않는 코드 :이 변경으로 게임을 구축하고 페이스 북 캔버스 안에 실행할 때

그래서, 나는 다음 출력을 참조하십시오. 오류도 예외도 없습니다. 집행자 (또는 호출 방법)는 단순히이 방법에서 벗어나 계속됩니다. 게임을 할 수는 있지만 페이스 북 플러그인이 작동하지 않습니다.

그리고 다시. 이전 코드는 예외를 throw하지 않습니다 (적어도, 나는 try catch을 사용하여 그들을 잡을 수 없었습니다). 내가 Player.log 파일을 확인할 때

또한, 나는 참조 :

7.24 I got type: Facebook.FBComponentFactory 
7.24 I got fieldInfo: UnityEngine.GameObject facebookGameObject 
7.24 I got go: UnityFacebookSDKPlugin 
7.24 got component of type: Facebook.CanvasFacebook 

그래서 그것은 모든 좋은 것을 보여준다. 하지만 실제로는 플러그인이로드되지 않습니다. 내가 FB.Login를 사용하려고하면 나는 참조 : 같은 긴 게시물에 대한

죄송합니다

180.49 Facebook: tried to login but we're not init'd yet. 

질문 (들). 하지만 내 질문은 여기에 있습니다 :

  • 도대체 무슨 일이 일어나고 있는지 알고 계시나요?
  • CanvasFacebook dll이 손상되었을 가능성이 있습니까?
  • AddComponent 같은 동작에 대한 정보를 찾을 수 없습니다. 비슷한 경험을 한 사람이 있습니까?

그리고 주요 질문 :

는 페이스 북 유니티 SDK 사용자 정의 캔버스를 사용할 수 있습니까? 나는 JS SDK와 Unity SDK 사이에 내 자신 만의 다리를 만들 수 있다는 것을 알고 있지만 누군가가 이미 그것을 만들었고 유일한 문제인 - CanvasFacebook 구성 요소를 만들었다는 것을 알고 싶지 않다.

미리 감사드립니다.

답변

0

질문은 다소 오래되었습니다. 단, 페이스 북 플러그인의 버전 7.0.0이 흐름이 가능합니다.

자세한 내용은 official documentation을 참조하십시오.