나는 Unity3d 게임에서 페이스 북에 게시하고 싶습니다. 설정에 대한유니티 통합 (또는 다른 브릿지 옵션)없이 CanvasFacebook.dll로드하기
정보 :
- 유니티 4.6.1
- Unity Facebook SDK v6.1.0
- 내가 구축 OS의 X를 사용하고 있습니다. Safari에서 게임 테스트.
아시다시피 Facebook Canvas는 Unity 통합을 사용하는 옵션을 제공합니다. 이 옵션에 대한 설명은 다음과 같습니다
"예"를 사용하는 페이스 북 유니티 SDK
하지만 유니티 플레이어가로드되기 전에 표시됩니다 사용자 정의 캔버스 페이지를 갖고 싶어. 그렇기 때문에 페이스 북 캔버스 (Facebook Canvas)의 Unity 통합 사용을 중단해야합니다. 그래서 현재 내 응용 프로그램을 제공하는 서버가 있습니다. 화합 플러그인을 제외한 모든 것이 잘 작동합니다.
첫 번째 문제는 CanvasFacebook.dll
및 AuthToken.unityhash
파일이 부족하다는 것입니다. 나는 이것을 this link (dll)과 this one (유니티쉬)에서 다운로드하여 해결했다. 그리고 내 서버의 해당 경로 (rsrc/unity/lib/sdk_6.1/CanvasFacebook.dll
및 rsrc/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;
전화는 작동하지만 fb
는 null
입니다. 그래서 을 사용하여 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
구성 요소를 만들었다는 것을 알고 싶지 않다.
미리 감사드립니다.