我的目标是在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示例应用程序。
给定这些信息,如何创建表单呢?
假设您想要一个作为输入接收的表单
在 Firestore 控制台中,创建一个集合并为其命名(如表单数据树),提供自动 ID 并添加字段
然后,我会将这些脚本放在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