Я делаю игру, в которой игрок выполняет код Python для перемещения персонажа.Я сделал это с помощью UnityPython , который по сути является просто IronPython, интегрированным в Unity.Это работает так: код, вводимый игроком, заключен в скрипт Python.Затем этот скрипт запускается в другом потоке (это работает из оболочки, используя класс threading
Python), который связывается с Unity для перемещения игрока.Эта система прекрасно работает в редакторе, но не в сборке.
Сначала я обнаружил, что проблема заключается в том, что поисковые пути, используемые механизмом сценариев, не находят нужную папку библиотеки (поскольку сам UnityPythonнаходится в папке активов).Конкретные классы, которые мне нужны, это threading
и Queue
.
Инициализатор движка выглядит так:
var engine = UnityPython.CreateEngine();
var paths = engine.GetSearchPaths();
paths.Add(Application.dataPath + "/Python/Lib");
engine.SetSearchPaths(paths);
Один из обходных путей, о котором я подумал, - это просто копирование папки Pythonв папку StreamingAssets, а затем с помощью Application.streamingAssetsPath
в третьей строке.Но затем отладчик сборки dev выдает мне странную ошибку:
System.TypeInitializationException: инициализатор типа для CodecsInfo вызвал исключение.---> System.NotSupportedException: кодировка 37 данных не найдена.Убедитесь, что у вас установлена и включена правильная сборка международных кодовых наборов.
Вот где я застрял прямо сейчас.Любые мысли о том, что означает эта ошибка и как ее обойти?
Редактировать: похоже, проблема возникает, когда скрипт используется движком.Код здесь выглядит так:
try
{
var source = engine.CreateScriptSourceFromFile(scriptPath);
source.Compile();
// script here is a dynamic variable
script = engine.Runtime.UseFile(scriptPath); // this is where the error is thrown
script.GameManager = this;
script.start();
}
catch (Exception e)
{
Debug.Log("Error: " + e);
}