Хорошо, я борюсь с проблемой и не знаю, что еще делать.Я создаю игровой фреймворк / движок, который я могу использовать для себя, и он состоит из самого игрового движка и отдельного приложения-редактора WinForms (использующего MonoGame.Forms), который ссылается на dll-движок, который я могу использовать для генерации файлов данных.используется движком (файлы сцен, типы объектов, материалы и т. д.).Это приложение-редактор полностью отделено от игры и имеет собственный подкласс Game.Когда пользователь выбирает папку проекта и файл сцены из игры, редактор пытается загрузить любые необходимые ресурсы из этой папки.
До сих пор я обходил конвейер контента, загружая текстуры и звуки с помощьюМетоды FromStream.Проблема в том, что теперь я включаю текст, и мне приходится использовать конвейер содержимого, поскольку я не нашел никаких методов для загрузки шрифтов спрайтов из потоков.И я не могу заставить spritefont загружаться в редакторе.Когда я запускаю игровой проект, все работает правильно, шрифт загружается и выводится на экран.Когда я пытаюсь открыть этот проект в редакторе, происходит сбой при загрузке spritefont, вызванного NullReferenceException.
Вот код, который я использую для загрузки ресурсов:
public Resource GetResource<Resource>(string resourceFile, string bundle, bool reload = false) where Resource : Cv_Resource, new()
{
var resource = new Resource();
resource.File = resourceFile;
var isOwnedByResManager = resource.VIsManuallyManaged();
Cv_ResourceData resData;
if (/** file has been loaded already**/)
{
/** return asset in memory **/
}
else
{
Cv_ResourceBundle resBundle;
if (!m_ResourceBundles.TryGetValue(bundle, out resBundle))
{
/** could not find resource bundle (a subclass of ContentManager) in the list **/
}
if (isOwnedByResManager)
{
/** do stuff with files that don't use the content pipeline **/
}
else
{
/** calls VLoad of the specific resource type, which loads the resource **/
if (!resource.VLoad(resourceFile, null, out size, resBundle))
{
/** error loading resource **/
}
}
}
return resource;
}
И вотМетод VLoad ресурса шрифта:
public bool VLoad(string resourceFile, Stream resourceStream, out int size, Cv_ResourceBundle bundle)
{
try {
var resource = Path.GetFileNameWithoutExtension(resourceFile);
/** EXCEPTION IN THIS NEXT LINE **/
var font = bundle.Load<SpriteFont>(resource); /** bundle is a subclass of ContentManager so this just loads the content as you would do normally in MonoGame **/
var resData = new Cv_SpriteFontData();
resData.Font = font;
ResourceData = resData;
/** Do some other stuff here **/
return true;
}
catch (Exception e)
{
/** handle the error **/
}
}
В редакторе я создаю экземпляры пакетов ресурсов, когда открываю папку проекта и устанавливаю для их RootDirectory подкаталог в этой папке (в данном случае это каталог Assets).Это хорошо работает при запуске игрового движка в том же каталоге, что и папка «Ресурсы», но, поскольку редактор запускается отдельно, возникают проблемы с загрузкой шрифта спрайта.Внутри папки Assets у меня есть файлы xnb и spritefont, сгенерированные проектом содержимого, и, похоже, с ними проблем нет, потому что они правильно загружаются в игре.
Вот ошибка, которую я получаю при попытке загрузитьсцена с текстом:
System.NullReferenceException: Object reference not set to an instance of an object.
at Microsoft.Xna.Framework.Content.Texture2DReader.Read(ContentReader reader, Texture2D existingInstance)
at Microsoft.Xna.Framework.Content.ContentTypeReader`1.Read(ContentReader input, Object existingInstance)
at Microsoft.Xna.Framework.Content.ContentReader.InnerReadObject[T](T existingInstance)
at Microsoft.Xna.Framework.Content.SpriteFontReader.Read(ContentReader input, SpriteFont existingInstance)
at Microsoft.Xna.Framework.Content.ContentTypeReader`1.Read(ContentReader input, Object existingInstance)
at Microsoft.Xna.Framework.Content.ContentReader.InnerReadObject[T](T existingInstance)
at Microsoft.Xna.Framework.Content.ContentReader.ReadObject[T]()
at Microsoft.Xna.Framework.Content.ContentReader.ReadAsset[T]()
at Microsoft.Xna.Framework.Content.ContentManager.ReadAsset[T](String assetName, Action`1 recordDisposableObject)
at Microsoft.Xna.Framework.Content.ContentManager.Load[T](String assetName)
at Caravel.Core.Resource.Cv_SpriteFontResource.VLoad(String resourceFile, Stream resourceStream, Int32& size, Cv_ResourceBundle bundle)
Function: VLoad
Я проверил имя ресурса и RootDirectory перед вызовом Load, и они кажутся правильными.Так что я не знаю, что делать.Диспетчер содержимого не может загружать файлы вне каталога, в котором запущено приложение?Или я что-то здесь упускаю?Есть ли у вас какие-либо предложения о том, что мне следует делать, чтобы заставить спрайт-шрифты корректно загружаться как в игре, так и при загрузке сцен в редакторе?
Я использую MonoGame 3.5, если это имеет значение.
Редактировать: Вот снимок экрана локальных переменных во время исключения.
Спасибо за чтение этой стены текста.