我正在开发要在Facebook上发布的Unity3d游戏。
有关设置的信息:
如您所知,Facebook Canvas提供了使用Unity Integration的选项。此选项的说明是:
“是”以使用Facebook Unity SDK
但是我想拥有一个自定义画布页面,该页面在加载Unity Player之前显示。因此,这就是为什么我需要停止使用Facebook Canvas的Unity Integration的原因。因此,目前我有一台服务于我的应用程序的服务器。除unity插件外,其他一切正常。
我遇到的第一个问题是缺少CanvasFacebook.dll
和AuthToken.unityhash
文件。我通过从此链接(dll)和此链接(unityhash)下载它们解决了此问题。并将它们放在服务器上的适当路径(rsrc/unity/lib/sdk_6.1/CanvasFacebook.dll
和rsrc/unity/key/sdk_6.1/AuthToken.unityhash
)中。因此,现在FB.cs
加载该dll不会出现问题。
但是现在我又遇到了一个问题。在FB.cs
有一个代码:
var fb = typeof(FBComponentFactory)
.GetMethod("GetComponent")
.MakeGenericMethod(facebookClass)
.Invoke(null, new object[] { IfNotExist.AddNew }) as IFacebook;
当我在Facebook Canvas中使用Unity Integration时,此代码有效。但是,当我禁用Unity Integration并在Facebook内部运行应用程序时,上述代码将执行并失败(没有任何错误或消息)。我怎么知道它失败了?好吧,它不会走得更远。简单检查-在此Debug.Log("Got/Added CanvasFacebook component");
之后添加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
。所以我从sdkFBComponentFactory
使用ILSpy
on检查了类IFacebook.dll
。这是类定义:
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
显式地添加组件(我知道这很丑陋,但是我只是想了解问题的根源):
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;
我使用日志错误,因为它们会调用,console.error
并且在浏览器日志中更容易看到。
因此,当我使用此更改构建游戏并在facebook画布中运行时,我看到下一个输出:
[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());
没有执行。没有错误,没有例外。执行器(或如何调用)简单地从此方法移出并继续。我可以玩我的游戏,但是facebook插件无法正常工作。
然后再次。先前的代码不会引发任何异常(至少,我无法使用捕获它们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
。有没有人经历过类似的事情?主要问题:
是否可以使用Facebook Unity SDK和自定义画布?我知道我可以在JS SDK和Unity SDK之间创建自己的桥梁,但是当我知道有人已经创建它并且唯一的问题-创建CanvasFacebook
组件时,我不喜欢这个想法。
提前致谢。
这个问题比较老了。但是由于7.0.0
facebook插件的版本描述了流程是可能的。
有关更多信息,请查阅官方文档。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句