Это дополнительный вопрос от мой последний вопрос о том, как читать и писать из потоков. Следующий код является лучшим ответом оттуда:
var byteData = Encoding.UTF8.GetBytes(data);
var saveFileDialog = new SaveFileDialog
{
DefaultExt = "json",
AddExtension = true,
Filter = "JSON|*.json"
};
if (saveFileDialog.ShowDialog() != DialogResult.OK ||
string.IsNullOrEmpty(saveFileDialog.FileName)) return;
using (var saveFileDialogStream = saveFileDialog.OpenFile())
{
saveFileDialogStream.Write(byteData, 0, byteData.Length);
}
Человек, который дал мне это, подтверждает, что он работает за пределами Unity, однако, когда я пытаюсь запустить его через Unity, он выдает следующую ошибку:
InvalidProgramException: Invalid IL code in System.Forms.SaveFileDialog: .ctor (): method body is empty
Любые идеи? Если вы хотите получить более подробную информацию, просто спросите. Я сделаю все возможное, чтобы конкретизировать мою проблему.
РЕДАКТИРОВАТЬ
Кажется, исправлена первая ошибка, но это обнаружило вторую, вызвав проблему с оператором if, показанным выше:
NullReferenceException: Object reference not set to an instance of an object
@Chris Благодаря этому я нашел то, что кажется решением, но теперь я столкнулся со второй ошибкой, NullReferenceException, связанной с оператором if, показанным в приведенном выше фрагменте кода. Любая идея, что может быть причиной этого?
Ну как ты решил первую проблему? Я предполагаю, что то, что вы сделали, сделало saveFileDialognull.
Я повторно импортировал System.Windows.Forms.dll, но взял его из «C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api» вместо «C:\Program Files (x86)\ Reference Assemblies\Microsoft\Framework\.NETFramework\v3.5\Profile\Client', так что, может быть, это разница в версии API?





SaveFileDialog для запуска класса требуется .NET Framework 1.1 или выше, как указано на последней странице документация, на которую вы ссылались в исходном сообщении.
.NET Framework — одна из нескольких сред выполнения, предоставляемых в среде .NET. Проблема в том, что Unity не использует .NET Framework в качестве основной среды выполнения использует Мононуклеоз, более легкую и переносимую версию среды выполнения .NET, предназначенную для работы на нескольких платформах. Вот как Unity может выполнять код .NET/C# в iOS, Android, ПК, macOS и т. д.
Таким образом, вы не можете использовать класс SaveFileDialog в Unity, не возясь с плагинами, которые предоставляют специфичные для платформы реализации диалога для сохранения файлов. Вам нужно было бы написать плагин, который мог бы получить доступ к этому классу, и даже тогда он мог бы выполняться только на платформах на базе Windows, как .NET Framework — это среда выполнения .NET для Windows..
Спасибо, тогда буду искать альтернативу.
Разве EditorUtility.SaveFilePanel не предназначен для сохранения файлов в Unity?
OP, вам следует взглянуть на этот метод, предложенный @DStanley, чтобы отобразить «диалоговое окно сохранения файла», которое запускается внутри Unity. Единственным недостатком является то, что EditorUtility является частью сборки UnityEditor, которая не компилируется, когда вы создаете окончательный исполняемый файл для своего приложения/игры. Это означает, что он работает только внутри UnityEditor, а не в исполняемом файле вашей финальной игры. Если вы создаете сценарии, которые должны выполняться только в редакторе Unity3D, то это определенно отличное (и переносимое) решение.