Как загрузить модель XNA из пути к файлу, а не из содержимого (например, Model.FromStream, но он не существует) - PullRequest
2 голосов
/ 01 января 2012

Как загрузить модель XNA из пути к файлу, а не из содержимого (например, Model.FromStream, но его не существует) ??Texture2D имеет .FromStream, как я могу сделать эквивалент для Model?

1 Ответ

2 голосов
/ 02 января 2012

Вы можете использовать Content.Load<Model>("Path here, make sure you use drive letter");

Если вам действительно нужен метод FromStream в модели, вы можете использовать методы расширения (не совсем идеальный дубликат FromStream, но он должен работать):

public static Model FromPath(this Model model, ContentManager content, string path)
{
    return content.Load<Model>(path);
}

РЕДАКТИРОВАТЬ:

Я только что протестировал приведенный выше код и, по-видимому, вместо использования буквы диска, вам необходимо соответствовать число "..\\" in a reversePath string with the number of levels of the root directory of the ContentManager . The problem is accessing the full directory of the ContentManager`, который является частным (или защищенным, я не уверен).Если не считать отражения, я не думаю, что эта переменная может быть доступна.Если мы знаем полный путь к корневому каталогу, тогда это должно работать:

string reversePath = "";
foreach (string level in Content.FullRootDirectory.Split('\\'))// I know there isn't actually a property 'FullRootDirectory' but for the sake of argument,
{
    reversePath += "..\\";
}
reversePath = reversePath.Substring(4);

Я несколько раз гуглил и не смог найти способ получить корневой каталог ContentManager.Я мог бы даже задать это как вопрос здесь, в SO, чуть-чуть здесь .

Хорошо, вот последняя вещь (используя ответ на вопрос, связанный с выше):

  1. Добавьте ссылку на System.Windows.Forms в ваш проект

  2. Добавьте следующий код в начало файла Game1.cs:

    using System.IO;
    using TApplication = System.Windows.Forms.Application;
    
  3. Добавьте этот код там, где он вам нужен, как в LoadContent или метод расширения:

    string ContentFullPath = Path.Combine(Path.GetDirectoryName(TApplication.ExecutablePath),
    Content.RootDirectory);
    
    string reversePath = "";
    foreach (string level in ContentFullPath.Split('\\'))
    {
        reversePath += "..\\";
    }
    
    reversePath = reversePath.Substring(3);
    
    
    Model test = Content.Load<Model>(Path.Combine(ContentFullPath, reversePath) + "*Your file name here*");
    
...