Unity 3D WebGL:运行 Javascript 应用加载并准备就绪后的代码
Unity 3D WebGL: Run Javascript code after the app has been loaded and is ready
当 Unity WebGL 应用程序完成加载并准备好使用时,如何查看或接收消息?我想要的是在 WebGL 应用程序准备好后 运行 我的 Web 界面的 JavaScript 功能。
我找到了适合我的解决方案。在您的 WebGL 构建的 Build 文件夹中有一个 JavaScript 文件 UnityProgress.js
。在里面你可以找到一个变量progress
,它会在加载/下载进度完成后设置为1.0。您可以将您的代码放在底部 if-statement 之后 运行 您的 JavaScript 代码(不要忘记括号^^)。
但是 Unity App 需要一些初始化时间才能启动。所以你可能必须设置一个延迟时间。对我来说 2500
ms 效果很好。
function UnityProgress(gameInstance, progress) {
...
if (progress == 1.0) {
gameInstance.logo.style.display = gameInstance.progress.style.display = "none";
// call of my function:
console.log("#### WebGL is ready now ####");
setTimeout(function() {
myFunction();
}, 2500);
}
}
我使用不同的方法。这特别有用,因为您可以在您希望的 Unity 代码的任何部分定义回调,即您可以对异步事件做出反应。
//in your html|js
function OnAppReady(){
console.log("### application is loaded")
}
//in Unity
void Start()
{
//js callback when application is loaded
Application.ExternalEval("OnAppReady()");
}
如果您正在考虑使用前端框架,您可能需要查看我制作的这个库。它为您的网页和 Unity 内容之间的双向通信添加了功能。要从您的 Unity 内容发送消息,返回到网页,您可以创建 JavaScript 可以从您的 CSharp 代码触发的侦听器,甚至可以传递数据。
// Create a new Unity Content object (using the library)
this.unityContent = new UnityContent(
"MyGame/Build.json",
"MyGame/UnityLoader.js" );
// Then add a new listener to the object.
this.unityContent.on("GameOver", score => {
// Do somehting...
});
为了触发我们刚刚创建的事件,您必须创建一个 JSLib 文件来绑定通信。在 React 中注册的侦听器现在可以在任何 JSLib 文件中的 ReactUnityWebGL 对象中使用。您现在可以创建一个 JSLib 文件并开始使用。我们将在以下目录中创建一个新的 JSLib 文件。 Assets/Plugins/WebGL/MyPlugin.jslib.
mergeInto(LibraryManager.library, {
// Create a new function with the same name as
// the event listeners name and make sure the
// parameters match as well.
GameOver: function(score) {
// Within the function we're going to trigger
// the event within the ReactUnityWebGL object
// which is exposed by the library to the window.
ReactUnityWebGL.GameOver(score);
}
});
最后,在您的 CSharp 代码中触发事件。我们必须按以下方式导入 JSLib。
using UnityEngine;
public class GameController : MonoBehaviour {
// Import the JSLib as following. Make sure the
// names match with the JSLib file we've just created.
[DllImport("__Internal")]
private static extern void GameOver (int score);
// Then create a function that is going to trigger
// the imported function from our JSLib.
public void GameOver (int score) {
GameOver (score);
}
}
当 Unity WebGL 应用程序完成加载并准备好使用时,如何查看或接收消息?我想要的是在 WebGL 应用程序准备好后 运行 我的 Web 界面的 JavaScript 功能。
我找到了适合我的解决方案。在您的 WebGL 构建的 Build 文件夹中有一个 JavaScript 文件 UnityProgress.js
。在里面你可以找到一个变量progress
,它会在加载/下载进度完成后设置为1.0。您可以将您的代码放在底部 if-statement 之后 运行 您的 JavaScript 代码(不要忘记括号^^)。
但是 Unity App 需要一些初始化时间才能启动。所以你可能必须设置一个延迟时间。对我来说 2500
ms 效果很好。
function UnityProgress(gameInstance, progress) {
...
if (progress == 1.0) {
gameInstance.logo.style.display = gameInstance.progress.style.display = "none";
// call of my function:
console.log("#### WebGL is ready now ####");
setTimeout(function() {
myFunction();
}, 2500);
}
}
我使用不同的方法。这特别有用,因为您可以在您希望的 Unity 代码的任何部分定义回调,即您可以对异步事件做出反应。
//in your html|js
function OnAppReady(){
console.log("### application is loaded")
}
//in Unity
void Start()
{
//js callback when application is loaded
Application.ExternalEval("OnAppReady()");
}
如果您正在考虑使用前端框架,您可能需要查看我制作的这个库。它为您的网页和 Unity 内容之间的双向通信添加了功能。要从您的 Unity 内容发送消息,返回到网页,您可以创建 JavaScript 可以从您的 CSharp 代码触发的侦听器,甚至可以传递数据。
// Create a new Unity Content object (using the library)
this.unityContent = new UnityContent(
"MyGame/Build.json",
"MyGame/UnityLoader.js" );
// Then add a new listener to the object.
this.unityContent.on("GameOver", score => {
// Do somehting...
});
为了触发我们刚刚创建的事件,您必须创建一个 JSLib 文件来绑定通信。在 React 中注册的侦听器现在可以在任何 JSLib 文件中的 ReactUnityWebGL 对象中使用。您现在可以创建一个 JSLib 文件并开始使用。我们将在以下目录中创建一个新的 JSLib 文件。 Assets/Plugins/WebGL/MyPlugin.jslib.
mergeInto(LibraryManager.library, {
// Create a new function with the same name as
// the event listeners name and make sure the
// parameters match as well.
GameOver: function(score) {
// Within the function we're going to trigger
// the event within the ReactUnityWebGL object
// which is exposed by the library to the window.
ReactUnityWebGL.GameOver(score);
}
});
最后,在您的 CSharp 代码中触发事件。我们必须按以下方式导入 JSLib。
using UnityEngine;
public class GameController : MonoBehaviour {
// Import the JSLib as following. Make sure the
// names match with the JSLib file we've just created.
[DllImport("__Internal")]
private static extern void GameOver (int score);
// Then create a function that is going to trigger
// the imported function from our JSLib.
public void GameOver (int score) {
GameOver (score);
}
}