Возникают проблемы с подключением сборки Unity3d WebGL к базе данных, отлично работает в редакторе - PullRequest
0 голосов
/ 22 марта 2019

Я использовал этот код для подключения моего проекта 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, он больше не подключается к базе данных.

Ошибка возникает между Debug.Logs "new MySqlConnection" и "connection".Другими словами, это терпит неудачу в соединении. Open ();оператор.

Вот журнал консоли в Google Chrome:

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.Я также поместил эти файлы в путь к файлу моего встроенного проекта.

Пожалуйста, скажите мне, если вам нужна дополнительная информация, я попытался включить все, что мне показалось уместным.

1 Ответ

0 голосов
/ 23 марта 2019

Поскольку сборки WebGL сводятся к javascript, вы не можете использовать стандартные сетевые API C # в этих сборках (MySQL-коннектор использует ADO.NET и поэтому, к сожалению, дисквалифицирован из сборок WebGL).Есть некоторая полезная информация о Сетевом взаимодействии с Unity WebGL Builds , но вот часть, относящаяся к вашей ситуации:

Из-за проблем безопасности код JavaScript не имеет прямого доступа к сокетам IPреализовать подключение к сети.В результате сетевые классы .NET (т. Е. Все в пространстве имен System.Net, в частности System.Net.Sockets) не работают в WebGL.То же самое относится к старым UnityEngine.Network * классам Unity, которые недоступны при сборке для WebGL.

Если вам нужно использовать Networking в WebGL, у вас есть возможность использовать классы WWW или UnityWebRequest в Unityили новые функции Unity Networking, которые поддерживают WebGL, или для реализации собственной сети с использованием WebSockets или WebRTC в JavaScript.

Имейте в виду, что "новые функции Unity Networking", которые он упоминает, являются частью UNet, , который устарел .РЕДАКТИРОВАТЬ: Похоже, что весь NetworkTransport API ушел.


Надеюсь, вы можете найти решение, просматривая эти статьи.Я ничего не пробовал с UNet, WebSockets или WebRTC, но лично, чтобы решить эту проблему в своих собственных проектах WebGL, я использую UnityWebRequest для отправки POST запросов на сервер, который я размещаю на AWS, на котором работает LAMP.стек.Мои php-страницы обрабатывают запросы, и база данных MySQL находится там на одном сервере.

...