在没有Unity集成(或其他桥选项)的情况下加载CanvasFacebook.dll

d12磨砂

我正在开发要在Facebook上发布的Unity3d游戏。

有关设置的信息:

如您所知,Facebook Canvas提供了使用Unity Integration的选项。此选项的说明是:

“是”以使用Facebook Unity SDK

但是我想拥有一个自定义画布页面,该页面在加载Unity Player之前显示。因此,这就是为什么我需要停止使用Facebook Canvas的Unity Integration的原因。因此,目前我有一台服务于我的应用程序的服务器。除unity插件外,其他一切正常。

我遇到的第一个问题是缺少CanvasFacebook.dllAuthToken.unityhash文件。我通过从此链接(dll)和链接(unityhash)下载它们解决了此问题并将它们放在服务器上的适当路径(rsrc/unity/lib/sdk_6.1/CanvasFacebook.dllrsrc/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;

通话有效,但是fbnull所以我从sdkFBComponentFactory使用ILSpyon检查了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.

问题)

抱歉,这么长的帖子。但是,这是我的问题:

  • 有人知道这里到底发生了什么吗?
  • 有没有可能是CanvasFacebookDLL被破坏?
  • 我找不到有关的此类行为的任何信息AddComponent有没有人经历过类似的事情?

主要问题:

是否可以使用Facebook Unity SDK自定义画布?我知道我可以在JS SDK和Unity SDK之间创建自己的桥梁,但是当我知道有人已经创建它并且唯一的问题-创建CanvasFacebook组件时,我不喜欢这个想法

提前致谢。

d12磨砂

这个问题比较老了。但是由于7.0.0facebook插件的版本描述了流程是可能的。

有关更多信息,请查阅官方文档

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章