当前位置: 首页 > 知识库问答 >
问题:

Unity WebGL使用Firebase JS SDK将帖子发布到Cloud FiRecovery

毋承基
2023-03-14

我的目标是在Unity中构建一个具有特定表单的WebGL游戏,并在提交表单后将数据发布到Firebase存储解决方案之一。阅读本文后,我很清楚我需要使用Cloud FiRecovery而不是实时数据库。好消息是,截至2020年3月,其中一名团队成员写道,

我们发布了Firebase Unity SDK 6.12.0,其中包括FiRecovery的alpha版本。

问题是,火基地的Unity SDK不适用于WebGL构建,对于正在经历该思维过程的人来说,可以使用火基地JS SDK(垃圾邮件警报)。从发行说明中可以看出,火库JS SDK支持火库,因此这已经具备了快速解决方案的所有条件。

因此,我去了Firebase控制台,创建了一个项目,一个使用Firebase JS SDK的Web应用程序,这个过程输出了以下代码

<!-- The core Firebase JS SDK is always required and must be listed first -->
<script src="https://www.gstatic.com/firebasejs/7.17.1/firebase-app.js"></script>

<!-- TODO: Add SDKs for Firebase products that you want to use
     https://firebase.google.com/docs/web/setup#available-libraries -->
<script src="https://www.gstatic.com/firebasejs/7.17.1/firebase-analytics.js"></script>

<script>
  // Your web app's Firebase configuration
  var firebaseConfig = {
    apiKey: "",
    authDomain: "",
    databaseURL: "",
    projectId: "",
    storageBucket: "",
    messagingSenderId: "",
    appId: "",
    measurementId: ""
  };
  // Initialize Firebase
  firebase.initializeApp(firebaseConfig);
  firebase.analytics();
</script>

上面写着

将这些脚本复制并粘贴到标签底部,但在使用任何Firebase服务之前

除此之外,这是如何从Unity脚本调用JavaScript函数,这是一个Cloud Firestore JS示例应用程序。

给定这些信息,如何创建表单呢?

共有1个答案

严元白
2023-03-14

假设您想要一个作为输入接收的表单

    < li >字符串 < li >号码 < li >来自用户的文本

在 Firestore 控制台中,创建一个集合并为其命名(如表单数据树),提供自动 ID 并添加字段

  • strVal
  • intVal
  • webVal

然后,我会将这些脚本放在WebGL模板中head标签的底部。因此,在Assets中创建一个名为WebGLTemplates的文件夹,以及名为New Template的文件夹(或其他名称),然后添加索引。html。

根据文档,这个index.html应该类似于

<!DOCTYPE html>
<html lang="en-us">

  <head>
    <meta charset="utf-8">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Unity WebGL Player | %UNITY_WEB_NAME%</title>
    <script src="%UNITY_WEBGL_LOADER_URL%"></script>
    <script>
    var unityInstance = UnityLoader.instantiate("unityContainer", "%UNITY_WEBGL_BUILD_URL%");
    </script>
  </head>
  
  <body>
    <div id="unityContainer" style="width: %UNITY_WIDTH%px; height: %UNITY_HEIGHT%px; margin: auto"></div>
  </body>
  
</html>

所以,有了这些新信息,它会是这样的

<!DOCTYPE html>
<html lang="en-us">

  <head>
    <meta charset="utf-8">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Unity WebGL Player | %UNITY_WEB_NAME%</title>
    <script src="%UNITY_WEBGL_LOADER_URL%"></script>
    <script>
        var unityInstance = UnityLoader.instantiate("unityContainer", "%UNITY_WEBGL_BUILD_URL%");
    </script>
    <!-- The core Firebase JS SDK is always required and must be listed first -->
    <script src="https://www.gstatic.com/firebasejs/7.17.1/firebase-app.js"></script>

    <!-- TODO: Add SDKs for Firebase products that you want to use
         https://firebase.google.com/docs/web/setup#available-libraries -->
    <script src="https://www.gstatic.com/firebasejs/7.17.1/firebase-analytics.js"></script>

    <script>
      // Your web app's Firebase configuration
      var firebaseConfig = {
        apiKey: "",
        authDomain: "",
        databaseURL: "",
        projectId: "",
        storageBucket: "",
        messagingSenderId: "",
        appId: "",
        measurementId: ""
      };
      // Initialize Firebase
      firebase.initializeApp(firebaseConfig);
      firebase.analytics();
    </script>
  </head>
  
  <body>
    <div id="unityContainer" style="width: %UNITY_WIDTH%px; height: %UNITY_HEIGHT%px; margin: auto"></div>
  </body>
  
</html>

然后,在“播放器设置”下,选择该模板。

然后在模板的主体中,有一个窗体将其可见性隐藏起来。包括游戏中的内容以及您希望在浏览器中填写的任何输入内容:

<form id="webForm" style="visibility:hidden;">
    <input type="hidden" id="stringInput" name="stringInput">
    <input type="hidden" id="intInput" name="intInput">
    <label for="webInput">web input</label><input type="text" id="webInput" name="webInput">
    <button type="submit">Submit</button>
</form>

然后,在Firebase脚本和表单下方,在页面上包含表单的提交侦听器,该侦听器将提交给Firestore(基于此答案):

myForm.addEventListener('submit', function(evt) {
  evt.preventDefault(); //Prevent the default form submit action

  var strVal = myForm.stringInput.value;
  var intVal = myForm.intInput.value;
  var webVal = intInput.webInput.value;

  var formData = {
    "strVal" : strVal,
    "intVal" : intVal,
    "webVal" : webVal
  };

  firebase.database().ref('/formDataTree').push( formData ); // Adds the new form data to the list under formDataTree node
});

总而言之,索引。html应该是这样的

<!DOCTYPE html>
<html lang="en-us">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Change Mapping | %UNITY_WEB_NAME%</title>
    <script src="%UNITY_WEBGL_LOADER_URL%"></script>
    <script>
        var unityInstance = UnityLoader.instantiate("unityContainer", "%UNITY_WEBGL_BUILD_URL%");
    </script>
    
    <!-- The core Firebase JS SDK is always required and must be listed first -->
    <script src="https://www.gstatic.com/firebasejs/7.17.1/firebase-app.js"></script>

    <!-- TODO: Add SDKs for Firebase products that you want to use
         https://firebase.google.com/docs/web/setup#available-libraries -->
    <script src="https://www.gstatic.com/firebasejs/7.17.1/firebase-analytics.js"></script>

    <script>
      // Your web app's Firebase configuration
      var firebaseConfig = {
        apiKey: "",
        authDomain: "",
        databaseURL: "",
        projectId: "",
        storageBucket: "",
        messagingSenderId: "",
        appId: "",
        measurementId: ""
      };
      // Initialize Firebase
      firebase.initializeApp(firebaseConfig);
      firebase.analytics();
    </script>
  </head>
  <body>
    <div style="height:20px; width: %UNITY_WIDTH%px; background: green;" onclick="unityInstance.SetFullscreen(1)"><b>Click here to make it full screen.</b></div>
    <div id="unityContainer" style="width: %UNITY_WIDTH%px; height: %UNITY_HEIGHT%px; margin: auto"></div>
    <form id="webForm" style="visibility:hidden;">
        <input type="hidden" id="stringInput" name="stringInput">
        <input type="hidden" id="intInput" name="intInput">
        <label for="webInput">web input</label><input type="text" id="webInput" name="webInput">
        <button type="submit">Submit</button>
    </form>
    <script>
        var myForm = document.getElementById("webForm");
        myForm.addEventListener('submit', function(evt) {
          evt.preventDefault(); //Prevent the default form submit action

          var strVal = myForm.stringInput.value;
          var intVal = myForm.intInput.value;
          var webVal = intInput.webInput.value;

          var formData = {
            "strVal" : strVal,
            "intVal" : intVal,
            "webVal" : webVal
          };

          firebase.database().ref('/formDataTree').push( formData ); // Adds the new form data to the list under formDataTree node
        });
    </script>
  </body>
</html>

在模板中使用apiKey、authDomain等意味着它将在检查页面或查看页面源代码时显示。然而,正如这里提到的,分享这些信息是可以的。

然后,在Assets文件夹中,创建一个Plugins文件夹,并向其中添加一个。jslib文件,对于名为form.jslib的实例,它有一个显示表单的函数,并将游戏数据放入表单的隐藏输入中。

mergeInto(LibraryManager.library, {
  ShowWebForm: function (importantString, importantInt) {
    var myForm = document.getElementById("webForm");

    myForm.stringInput.value = Pointer_stringify(importantString);
    myForm.intInput.value = importantInt;

    myForm.style.visibility="visible"
   
  },
});

在完成到这一步之后,如果您进入控制台net::ERR_BLOCKED_BY_CLIENT,只需停用该站点的AdBlocker,因为这就是您得到该错误的原因。

最后,在Unity中,声明该函数并在适当的时候调用它。所以,考虑到你有一个新创建的场景(所以它只有主摄像机和方向灯),你可以在新场景中调用的一些代码中调用该方法。这是一个静态方法,所以只要你能找到参数所需的数据,你就可以从任何地方调用它。

[DllImport("__Internal")]
private static extern void ShowWebForm(string importantString, int importantInt);

public void Start()
{
    // Suppose we want to send the version of unity the app is running on 
    // and the unix timestamp at start
    string unityVersion = Application.unityVersion;

    System.DateTime epochStart = new System.DateTime(1970, 1, 1, 0, 0, 0,  
            System.DateTimeKind.Utc);
    int cur_time = (int)(System.DateTime.UtcNow - epochStart).TotalSeconds;

    ShowWebForm(unityVersion, cur_time);
}

或者,如果您不想让用户在浏览器中填写内容,可以不显示表单,而不是将其设置为可见,而是发送提交事件:

mergeInto(LibraryManager.library, {
  ShowWebForm: function (importantString, importantInt) {
    var myForm = document.getElementById("webForm");

    myForm.stringInput.value = Pointer_stringify(importantString);
    myForm.intInput.value = importantInt;
    myForm.webInput.value = "some other value from the game could go here";

    myForm.dispatchEvent(new Event('submit'));
  },
});

目前无法测试,因此请注意错别字或其他语法错误。

 类似资料:
  • 问题内容: 我有这个json数据: 使用php我如何发送此发布请求? 问题答案: 不 使用任何外部依赖项或库: $ response 是一个对象。可以像往常一样访问属性,例如 $ response- > … 其中 $ data 是包含 数据 的数组: 警告 :如果在php.ini 中将 allow_url_fopen 设置设置为 Off ,则此方法将无效。

  • 问题内容: 我们如何在NodeJS中发出这样的HTTP请求?示例或模块的赞赏。 问题答案: Mikeal的请求 模块可以轻松做到这一点:

  • 问题内容: 几天前,我发布了一个有关如何在我正在开发的自定义Wordpress模板中滚动到“单个帖子 ”的问题。我需要的是在单击特定链接时将单个帖子加载到定义的DIV中,然后向下滚动到包含新加载内容的DIV。考虑到Wordpress或任何其他CMS的动态内容性质,该链接的URL不能是绝对的。 不幸的是,那时没有任何具体的答案,所以我决定稍作观察。由于主要问题是动态加载内容,因此我决定放大如何在Wo

  • 我必须使用ajax调用向php文件提交两个值。php文件将使用$_POST[]函数处理数据。问题是我的ajax代码没有正确发送数据,所以我在console.log(result)函数中没有得到任何结果。我该如何解决这个问题?知道吗? Jquery: .PHP:

  • 我被困在一件事情上,我确信这件事情一定很简单,但却让我发疯。我在工作中被迫使用WordPress,我对它没有任何经验,到目前为止,我很难理解它是如何操作挂钩和过滤器的 我想要的非常简单: 我正在使用最新帖子块来显示用户写的帖子。除了我正在处理的页面将是网站版主的前端,版主必须查看“待定”状态的帖子,而不是“发布”状态的帖子。我在编辑器中找不到任何选项来更改它,所以我尝试设置一个钩子来更改“post

  • 问题内容: 我有一个简单的php文件,它可以解码我的json字符串,并与ajax一起传递并标记结果,但是我不能保留变量,为什么? 我尝试使用fireBug进行检查,我可以看到POST请求已正确发送,当调用 php 脚本时,他对我做出了Noooooooob的响应,似乎已设置了任何POST变量。 我想要的就是拥有我的数组=) JSON字符串由生成: 的JavaScript save_categorie