如何在Content Manager中扫描所有XNB文件?

时间:2016-05-22 20:44:53

标签: c# xna game-engine monogame

所以我在VS中用MonoGame构建游戏。我正在使用MonoGame的内容管道(生成XNB文件)。

问题是我的游戏是可扩展的(这是一个用户可以下载歌曲/图表的游戏)。所以我不得不支持“插件”XNB文件。

所以我已经为我的自定义类型制作了自定义导入器/读取器/写入器,但我找不到扫描内容文件夹的方法来查找哪些xnb可用。例如,如果用户在Content文件夹中添加了Song1.xnb,我将如何(以编程方式)知道该文件在那里?

我在ContentManager中找不到任何showFiles或scanContent来列出所有可用文件。如何以跨平台方式查找我的内容文件夹中的文件?

我的结构示例:

Content
  - Songs
    - Song0
      - 0.xnb
      - 1.xnb
      - Song0.xnb
    - Song1
      - 0.xnb
      - Song0.xnb

所以我的歌曲文件夹总是有一个 {Folder} .xnb 文件,其中包含歌曲的结构(以及X.xnb(0,1,2 ...)的参考) 。但我找不到歌曲文件夹中存在的文件夹,因此我可以拨打Load<Music>("Songs\\{SongFolder}\\{SongFolder}.xnb")

谢谢!

1 个答案:

答案 0 :(得分:1)

我使用此功能加载我文件夹中的所有纹理。

public static           List<Texture2D>     Textures(string folderPath)
{
    if (!folderPath.StartsWith(@"\")) folderPath = @"\" + folderPath;
    List<string> paths = Directory.GetFiles(Help.RootDir(Content.RootDirectory) + folderPath).ToList();
    List<Texture2D> images = new List<Texture2D>();
    foreach (string s in paths)
    {
        if (s.EndsWith(".xnb"))
            images.Add(Texture(s.Replace(Content.RootDirectory, "").Replace(".xnb", "")));
    }
    return images;
}

folderPath变量应该是从内容的文件夹(没有它)到要加载所有纹理/歌曲的文件夹的路径。在你的情况下,传递&#34;歌曲\歌曲0&#34;作为参数,将 Texture2D 替换为 Song SoundEffect ,它将正常工作。

此外,Help.RootDir是我做的一个简单的功能:

public static string RootDir(string s)
{ return s.Substring(0, s.LastIndexOf(@"\")); }

还包括System.IO;