首页 > 解决方案 > 在将 Unity3d WebGL 项目构建连接到数据库时遇到问题,在编辑器中工作正常

问题描述

我使用这段代码将我的 Unity 项目连接到我的 MySql 数据库:

public void SetupSQLConnection()
{
    Debug.Log("Connection Function Started");
    if (connection == null)
    {
        Debug.Log("If connection == null");
        try
        {
            Debug.Log("Try block started");
            MySqlConnectionStringBuilder connBuilder = new MySqlConnectionStringBuilder();

            connBuilder.Server = "localhost";
            connBuilder.UserID = "root";
            connBuilder.Database = "therapygame";
            connBuilder.Password = "";
            connBuilder.OldGuids = true;

            Debug.Log("String set");
            connection = new MySqlConnection(connBuilder.ConnectionString);
            Debug.Log("new MySqlConnection");
            connection.Open();
            Debug.Log("connection");
        }
        catch (MySqlException ex)
        {
            Debug.LogError("MySQL Error: " + ex.ToString());
        }
    }
}

在 Unity3d 编辑器中运行我的项目时,这可以正常工作。但是,当我构建 WebGL 时,它不再连接到数据库。

错误发生在“new MySqlConnection”和“connection”的Debug.Logs之间。换句话说,它在 connection.Open(); 上失败了。陈述。

这是谷歌浏览器的控制台日志:

SystemException: Thread creation failed.

Rethrow as TypeInitializationException: The type initializer for 'System.Threading.Timer.Scheduler' threw an exception.

Rethrow as TypeInitializationException: The type initializer for 'System.Threading.Timer' threw an exception.

Rethrow as TypeInitializationException: The type initializer for 'MySql.Data.MySqlClient.MySqlPoolManager' threw an exception.


(Filename: currently not available on il2cpp Line: -1)

这是该错误的根源(它太大了,我不得不将它分成几部分)(请参阅以下部分以了解要查找的内容):

https://0bin.net/paste/-28c3BvLx+Nx+Q+L#ltyOWWb+IembwSAgNKzPCRwvI5MkPOrUfgOAs3i4R+f

https://0bin.net/paste/ZleyLDeOcgr3kj-e#OPVr3oIC8-mcO9mXB1pV/+ONcdnUB+3I1RCy37/NI+p

https://0bin.net/paste/+rbHWsKmXhIXM50A#PaAFLCeDJZzIQTWczYbDepmubFhSaeDWqzcB+ItUTnb

https://0bin.net/paste/VdNv2NA8K0--ZXNM#fomzOVZ9iNOJDHequiSAbuv6I3lxDXXL+E5WK6GPKZv

https://0bin.net/paste/zcDPoycv5lqbjRcA#h0WNQdMSU4VtdIbwzOByW5csu68FERPvEdOKJz9oUeA

复制这个并粘贴到 ctrl+f 找到:

function _JS_Log_Dump(ptr, type) {
var str = Pointer_stringify(ptr);
if (typeof dump == "function") dump(str);
switch (type) {
case 0:
case 1:
case 4:
console.error(str);
return;
case 2:
console.warn(str);
return;
case 3:
case 5:
console.log(str);
return;
default:
console.error("Unknown console message type!");
console.error(str);
}
}

有问题的行是

case 4:
console.error(str);

我已将 System.Data.dll 和 MySql.Data.dll 包含到我的 Visual Studio 引用以及所有 I18N 文件中。我还将这些文件放在我构建的项目文件路径中。

如果您需要更多信息,请告诉我,我试图包含我认为相关的所有内容。

标签: c#mysqlunity3dunity-webgl

解决方案


由于 WebGL 构建归结为 javascript,因此您不能在这些构建中使用标准 C# 网络 API(MySQL 连接器使用 ADO.NET,因此不幸的是,它不符合 WebGL 构建的资格)。有一些关于使用 Unity WebGL 构建网络的好信息,但这里是与您的情况相关的部分:

由于安全问题,JavaScript 代码无法直接访问 IP 套接字来实现网络连接。因此,.NET 网络类(即 System.Net 命名空间中的所有内容,尤其是 System.Net.Sockets)在 WebGL 中不起作用。这同样适用于 Unity 的旧 UnityEngine.Network* 类,这些类在为 WebGL 构建时不可用。

如果您需要在 WebGL 中使用网络,您目前可以选择使用 Unity 中的 WWW 或 UnityWebRequest 类或支持 WebGL 的新 Unity 网络功能,或者使用 JavaScript 中的 WebSockets 或 WebRTC 实现您自己的网络。

请记住,它提到的“新的 Unity 网络功能”是 UNet 的一部分,它正在被弃用。编辑:看起来整个NetworkTransport API都消失了。


希望您在浏览这些文章时能找到解决方案。我没有尝试过使用 UNet、WebSockets 或 WebRTC 进行任何操作,但就个人而言,为了在我自己的 WebGL 项目中解决这个问题,我使用UnityWebRequestPOST请求发送到我在 AWS 上托管的运行 LAMP 堆栈的服务器。我的 php 页面处理请求,MySQL 数据库位于同一台服务器上。


推荐阅读