Я занимаюсь разработкой шахматной игры в Unity3D.Я хочу разработать его для платформы Android.Для AI я использую шахматный движок Stockfish.Я скачал двоичный файл Stockfish для Android под названием " Stockfish-9-armv7 ".Я поместил этот бинарный файл в папку StreamingAssets, чтобы он правильно вошел в целевую платформу на этапе сборки.Пока все работает нормально, т.е. когда я строю свой проект Unity, файл помещается в правильное место, и я очень хорошо вижу его.
Сейчасчтобы мой AI работал, я должен общаться с этим двоичным файлом, используя протоколы UCI .И поэтому я написал сценарий C # в своем проекте Unity, который создает процесс для запуска двоичного файла и связи с ним.Но это не работает.
Однако, когда я делаю то же самое для Windows, то есть использую двоичную версию Stockfish для Windows с именем stockfish_9_x64.exe и собираю ее как отдельное приложение, все работает отлично, и я могу общаться с движкомчерез мой код C #.
Я исследовал его в Интернете, но не смог найти много ресурсов и рекомендаций.Я нашел аналогичный пост , и его чтение привело меня к выводу, что, возможно, это как-то связано с правами доступа к файлам.Парень, который задал этот вопрос, на самом деле решил проблему, написав две строчки кода:
string[] cmd = { "chmod", "744", Path.Combine(strToFolder, fileName) };
Java.Lang.Runtime.GetRuntime().Exec(cmd);
Однако он использовал Xamarin и имел доступ к библиотеке времени выполнения Java.Я использую Unity и C #, и я действительно не знаю, как изменить разрешение на выполнение / запуск этого двоичного файла и запустить его.На самом деле я даже не знаю, в этом проблема или нет.
Я просто хочу интегрировать Stockfish в свой проект Unity с Android в качестве целевой платформы.Если у кого-то есть какие-либо идеи, предложения или кто-то делал это раньше, пожалуйста, направьте меня.Даже если я ошибаюсь с самого начала и мой подход ошибочен, дайте мне знать об этом вместе с исправленным подходом.
Ниже приведен мой код:
public class CommunicateWithEngine {
public static Process mProcess;
public static void Communicate()
{
// since the apk file is archived this code retreives the stockfish binary data and
// creates a copy of it in the persistantdatapath location.
string filepath = Application.persistentDataPath + "/" + "Stockfish-9-armv7";
if (!File.Exists(filepath))
{
WWW executable = new WWW("jar:file://" + Application.dataPath + "!/assets/" + "Stockfish-9-armv7");
while (!executable.isDone)
{
}
File.WriteAllBytes(filepath, executable.bytes);
}
// creating the process and communicating with the engine
mProcess = new Process();
ProcessStartInfo si = new ProcessStartInfo()
{
FileName = System.IO.Path.Combine(Application.persistentDataPath, "Stockfish-9-armv7"),
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardError = true,
RedirectStandardInput = true,
RedirectStandardOutput = true
};
mProcess.StartInfo = si;
mProcess.OutputDataReceived += new DataReceivedEventHandler(MProcess_OutputDataReceived);
mProcess.Start();
mProcess.BeginErrorReadLine();
mProcess.BeginOutputReadLine();
SendLine("uci");
SendLine("isready");
}
private static void SendLine(string command) {
mProcess.StandardInput.WriteLine(command);
mProcess.StandardInput.Flush();
}
private static void MProcess_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
string text = e.Data;
Test.PrintStringToTheConsole(text);
}
}