统一 5.4
构建一个 Unity WebGL 应用程序(不是游戏)来处理 Unity 方面的所有 3D 内容,并且所有 UI 都是使用 HTML/CSS/JS 构建的。默认情况下,WebGLInput.captureAllKeyboardInput 设置为 true,这会导致任何需要键盘(文本)输入的输入字段被破坏,因为任何键盘控件都会被 Unity 自动占用而不是进入输入字段。正在做
#if !UNITY_EDITOR && UNITY_WEBGL
WebGLInput.captureAllKeyboardInput = false;
#endif
Run Code Online (Sandbox Code Playgroud)
修复了输入字段的问题,但导致统一忽略所有键盘输入,即使在元素被聚焦后,但添加
tabindex="1"
Run Code Online (Sandbox Code Playgroud)
修复它,以便 HTML 输入字段上的键盘输入在聚焦时工作,并且 Unity WebGL 应用程序内的键盘控件在聚焦时也工作。(这是所有文档:https : //docs.unity3d.com/ScriptReference/WebGLInput-captureAllKeyboardInput.html)。所以这一切正常。
但是,Unity WebGL 应用程序仍然会导致某些使用鼠标(而非键盘)控件的输入字段出现问题。也就是说,我在 input type="range" 字段(HTML5 滑块)和 input type="number (使用键盘输入数字有效,但鼠标上下点击无效)上注意到了它。
有什么解决方法可以解决这个问题吗?我基本上需要防止 Unity WebGL 画布不自动接受所有鼠标输入,除非首先单击/聚焦元素(就像键盘控件的工作方式一样)。在 Unity 方面有什么要改变的来解决这个问题吗?或者我是否需要编写一些自定义 JavaScript 来处理所有输入并确定它是用于 Unity 场景还是用于 HTML UI?
在我正在处理的项目中,StreamingAssets 目录中有两个 json 文件。处理它们的脚本在独立 PC 构建中完美运行,但在 WebGL 构建中根本不起作用。
我收到“找不到文件!” 根据脚本发送消息:
else if (!File.Exists (filePath))
{
Debug.LogError ("Cannot find file!");
}
Run Code Online (Sandbox Code Playgroud)
我得到了使用 WWW 类的答案,如 Unity Technologies 站点上的脚本 API 中所述,地址为:https ://docs.unity3d.com/ScriptReference/Application-streamingAssetsPath.html
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour {
public string filePath = System.IO.Path.Combine(Application.streamingAssetsPath, "MyFile");
public string result = "";
IEnumerator Example() {
if (filePath.Contains("://")) {
WWW www = new WWW(filePath);
yield return www;
result = www.text;
} else
result = System.IO.File.ReadAllText(filePath);
}
}
Run Code Online (Sandbox Code Playgroud)
我很乐意这样做,但我在编码方面太新了,我需要一些解释。我现在的第一个问题是:该行中的“我的文件”字符串是什么
public string filePath …Run Code Online (Sandbox Code Playgroud) 有没有办法在Web应用程序中集成统一与反应?甚至可能在子窗口中运行统一部分.
所以基本上我想使用图形和动画的统一部分.如果游戏中发生了一些有趣的事情,那么react/redux中的状态就会发生变化或触发某些动作.
如果我可以在游戏的统一部分中使用redux状态的某些部分,那将是理想的.因此,通过处理程序统一访问redux或某些部分.
非常感谢.我希望很清楚我想做什么.
我想找一个悬挂在起重机上的悬挂部分上的一点,它与起重机的距离最小,起重机臂上有BoxCollider撞击,我正在使用Physics.overlap方法.
如何从源对象中找到GameObject上最近的点?
我想导出适用于 WebGL 的 Unity 项目(Unity 版本 2021.2),但出现以下错误:
\n\n\n在此页面上运行 Unity 内容时发生错误。有关详细信息,请参阅您的浏览器 JavaScript 控制台。错误是:\nReferenceError:未定义运行时 unityFramework/_WebSocketConnect/instance.ws.onopen@http://localhost:55444/Build/WEbGL.framework.js:3:67866
\n
我正在使用这个 Websocket 包(https://github.com/endel/NativeWebSocket),并且在 Unity 或 Windows 构建中一切正常。当我运行 WebGL 构建时,它确实与 websocket 连接,但随后出现错误。\n错误消息显示更多信息在我的控制台中,但 F12 上的控制台仅重复该错误:
\n未捕获的 ReferenceError: 未定义运行时\nat WebSocket.instance.ws.onmessage (WEbGL.framework.js:3)\ninstance.ws.onmessage @ WEbGL.framework.js:3 \n
为了给出一个最小的可重现示例,我刚刚使用 Unity 2021.2 创建了一个空的 3D Core 项目,并导入了 NativeWebSocket 包(我从 GitHub 下载了该文件并手动安装了它:
\n\n\n将NativeWebSocket/Assets/WebSocket中的源复制到您的 Assets 目录中
\n
然后你必须通过 kentakang 在https://github.com/endel/NativeWebSocket/pull/54上发布修复程序,否则构建将失败。
\n然后我使用下面的代码(也来自 Github 页面)创建了一个新的 C# 脚本,并将其放在场景中的相机上。我将其导出为 WebGL 并收到了上述错误。
\n当调用方法 websocket.OnOpen/OnError/OnClose/OnMessage 之一时会发生这种情况,因此您\xc2\xb4t甚至不需要正在运行的 websocket,因为随后调用了 …
我需要用户将他(她)的头像图片从PC上传到游戏
如何创建文件对话框并将图像上传到WebGL游戏?
我收到了一个 Unity webgl 包,并将其放入 Wordpress 的课程中。Unity 生成的 index.html 可以在 iframe 中访问。这必须能够在访问课程时计算用户点击。
Unity开发者只说变量是Click,还有信息:
Application.ExternalCall("Send_Clicks", clickCount.ToString());
Run Code Online (Sandbox Code Playgroud)
我阅读了 Unity 文档,我应该创建一个 js 脚本来从 Unity 检索消息。如何从 Unity 检索消息?脚本应该放在哪里?
任何答案都非常感谢。谢谢你。
Unity SendMessage只能传递一个参数,并且可以是一个数组。所以我正在调用 javascript 的 sendMessage 并调用 C# 方法(实际上是 webgl 方法)
var arr = [x,y,z];
gameInstance.SendMessage("Cube","SetGameObjectPosition",arr);
Run Code Online (Sandbox Code Playgroud)
但出现这个错误
由于以下原因调用错误处理程序
Uncaught 2,2,2 没有 SendMessage 支持的类型。[违规]“单击”处理程序花费了 8994 毫秒 blob:http://localhost/1ff50200-cb3a-4367-ab45-f02e9734fac2:2 Uncaught 2,2,2 没有 SendMessage 支持的类型。
SendMessage @ blob:http://localhost/1ff50200-cb3a-4367-ab45-f02e9734fac2:2
发送消息@UnityLoader.js:4
SetObjectPosition @(索引):44
onclick @(索引):65(索引):65
[违规]“点击”处理程序花费了 9000 毫秒
我遇到了 WebGLInput 的非常奇怪的行为。我有一个使用 WebGL Unity 构建的网站。默认情况下,WebGL 会捕获所有键盘输入。但是,我必须在 html 中使用输入字段。
所以首先我禁用 WebGLInput 并且它可以工作:
private void Start()
{
#if !UNITY_EDITOR && UNITY_WEBGL
WebGLInput.captureAllKeyboardInput = false;
#endif
}
Run Code Online (Sandbox Code Playgroud)
然后使用下面的函数向 unity 发送一条消息来切换键盘输入。它首先会启用它,但不会禁用它!
document.addEventListener('click', function(e) {
if (e.target.id == "#canvas") {
this.FocusCanvas("1");
} else {
this.FocusCanvas("0");
}
}.bind(this), false);
Run Code Online (Sandbox Code Playgroud)
这是我用来切换 WebGLInput 的统一代码:
public void FocusCanvas(string focus)
{
#if !UNITY_EDITOR && UNITY_WEBGL
if (focus == "0") {
WebGLInput.captureAllKeyboardInput = false;
} else {
WebGLInput.captureAllKeyboardInput = true;
}
#endif
}
Run Code Online (Sandbox Code Playgroud)
我尽可能地调试了它,并且我非常确定该方法已被触发并且所有内容都已执行。但禁用 captureAllKeyboardInput 不起作用。有人遇到过这样的问题吗?如果是这样,请告诉我我做错了什么?
这是我的 API 请求
public IEnumerator Login(string bodyJsonString)
{
Debug.Log(bodyJsonString);
UnityWebRequest req = UnityWebRequest.Post("localhost:3000/login", bodyJsonString);
req.SetRequestHeader("content-type", "application/json");
yield return req.SendWebRequest();
if (req.isNetworkError || req.isHttpError)
{
Debug.Log(req.error);
}
else
{
Debug.Log("Form upload complete!");
}
}
Run Code Online (Sandbox Code Playgroud)
它返回错误状态代码 500,并在服务器上返回错误 Unexpected token % in JSON atposition 0","severity
这是我的协程调用
public void submitLogin()
{
_username = userInputField.GetComponent<InputField>().text;
_password = passwordInputField.GetComponent<InputField>().text;
Debug.Log("username" + _username);
Debug.Log("password" + _password);
string body = "{'username':'" + _username + "','password','" + _password + "'}";
//API Call
authChexi = new Auth();
StartCoroutine(authChexi.Login(body));
}
Run Code Online (Sandbox Code Playgroud)
如果您对如何处理我的表单有任何想法,请告诉我。谢谢
unity-webgl ×10
c# ×5
javascript ×3
json ×2
html ×1
input ×1
reactjs ×1
redux ×1
sendmessage ×1
upload ×1
websocket ×1
wordpress ×1