NullReferenceException при попытке загрузить SpriteFont в MonoGame - PullRequest
0 голосов
/ 16 сентября 2018

Хорошо, я борюсь с проблемой и не знаю, что еще делать.Я создаю игровой фреймворк / движок, который я могу использовать для себя, и он состоит из самого игрового движка и отдельного приложения-редактора 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, если это имеет значение.

Редактировать: Вот снимок экрана локальных переменных во время исключения.

Debugger info

Спасибо за чтение этой стены текста.

...