Я работал над игрой в шахматы и использую движок Stock для создания AI для него. Мне удалось заставить его работать на P C, поскольку это было довольно просто.
//Starting the process
string filepath = Application.streamingAssetsPath+ "/" + "stockfish_10_x64.exe";
mProcess = new Process();
ProcessStartInfo si = new ProcessStartInfo()
{
FileName = filepath,
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");
Это в основном запускает процесс для данного файла (в данном случае stockfish_10_x64.exe). Я могу легко отправлять данные и получать от них данные.
Это работает безупречно. Теперь я хочу просто запустить его на Android. Я использую скомпилированный двоичный файл Stockfi sh для Android (https://stockfishchess.org/download/). Мне удалось извлечь его из сборки приложения Unity и скопировать этот двоичный файл в его постоянное местоположение.
string filepath = Application.persistentDataPath + "/" + "stockfish-10-armv7";
Debug.Log(filepath);
if (!File.Exists(filepath))
{
WWW executable = new WWW("jar:file://" + Application.dataPath + "!/assets/" + "stockfish-10-armv7");
while (!executable.isDone)
{
}
File.WriteAllBytes(filepath, executable.bytes);
}
Нет потери данных. Я проверил количество переданных байтов и сравнение окончательного размера исходного файла и файла результатов.
Теперь проблема в этом. Как запустить файл из скрипта Unity c#? Я просто не могу прочитать и написать файл. Насколько я знаю, нам нужно отправить ввод в файл движка, и он вернет мне лучший ход в качестве вывода. да, мне нужны разрешения на чтение и запись. Я делаю это, давая разрешение с помощью chmod
var plugin = new AndroidJavaClass("com.chessbattles.jeyasurya.consoleplugin.AndroidConsole");
string command = "chmod 777 "+filepath;
outPut = plugin.CallStatic<string>("ExecuteCommand",command);
Я действительно не уверен, что это правильный способ сделать это.
Ну, тогда я просто использую mProcess (созданный выше) для отправки ввода. Но это не похоже на работу. Что я делаю неправильно? Предложение было бы здорово.