【问题标题】:Getting the content type from ContentManager in XNA从 XNA 中的 ContentManager 获取内容类型
【发布时间】:2011-12-16 22:19:44
【问题描述】:

我正在为 XNA 游戏构建内容编辑器,并且我已经准备好内容阅读器和编写器。在我的编辑器中,我将遍历文件夹中的所有文件以在我的编辑器窗口中显示对象列表。我已经做好了一切准备,但是在获取内容文件夹的文件列表后,我无法解决我将要做的事情。

所有文件都有 XNB 扩展名,读取它们的唯一(非 hacky)方法是使用 XNA 内容阅读器。但是我想提前知道文件的内容类型(是地图还是游戏对象模板,还是我定义的许多其他类型的任何东西),而不是一个一个地加载它们并尝试加载每个对于每种可能的内容类型,实际上是不可能的(或者说,最糟糕的编程实践)。

我怎样才能得到这样的功能:

ContentManager.ContentTypeOf(string assetPath); 返回一个类型,所以我可以提前知道在哪里加载(而不是加载)什么。仅仅为了编辑单个对象模板而加载游戏的所有地图并不是一个好主意。必须有一种实用的方法来区分内容文件的类型。

【问题讨论】:

    标签: .net xna content-pipeline


    【解决方案1】:

    您可以访问 xnb 以获取内容阅读器名称。

    你是xnb format specification file

    【讨论】:

    • 没有提供 API 的方法来完成这项任务吗?我不认为 xnb 格式规范会在多年和不同版本中保持不变
    • 也许可以,但是(1)您也可以检查版本并检查它是否受支持...(2)xna工作室不经常更改...(3)xnb格式是定义明确,很难相信它会很快改变......(4)你的游戏将依赖xna工作室版本,所以你的内容编辑器也会依赖,这是怎么回事?
    • @Blau 我不确定这是否可行。从内存来看,规范没有描述(详细)使用的压缩,因此发布模式构建的 XNB 不可读。
    • 我的游戏引擎(它不是游戏,它是即时构建的引擎)将不依赖于 xna 版本,至少以硬编码方式,因此对内容阅读器进行硬编码不是一个好主意。我只是想知道是否有一种内置机制可以在不加载的情况下检测内容类型。
    【解决方案2】:

    可能有点晚了,但我遇到了同样的问题。

    我只是使用了自己的内容处理器,在输出目录“[modelfilename].model”中添加了一个空文件。并在我的代码中枚举所有 *.model 文件,然后仅通过不带扩展名的文件名加载模型。如果需要,您还可以轻松地将更多信息放入该文件中。

    自定义内容处理器的代码:

     string Name = Path.GetFileNameWithoutExtension(context.OutputFilename);
     FileStream fs = File.Create(Path.GetDirectoryName(context.OutputFilename) + @"\" + Name + @".model");
     fs.Close();
    

    【讨论】:

      【解决方案3】:

      这很简单,只需将其加载为Object

      Type type = content.Load<Object>("MyContent").GetType();
      

      唯一的缺点是您必须加载整个资源才能确定其类型。

      要对以这种方式加载的内容实施不同的生命周期策略,请考虑使用单独的 ContentManager 实例,或者甚至从 ContentManager 派生您自己的类并查看受保护的 ReadAsset 方法。

      【讨论】:

      • 我会有很多文件并将它们全部加载到内存中,只是为了发现它们是什么类型,这实际上并不是一个很好的解决方案。我想我将在我的内容文件夹下使用预定义的文件夹结构,并将下面的 XNB 文件视为相应的内容类型。只要人们使用我制作的地图编辑器,我认为这不会造成问题,无论如何这将是一种“官方方式”来编辑东西:)
      【解决方案4】:

      好的,在没有找到任何实际读取文件的简单解决方案后,我决定将文件组织到文件夹层次结构中,现在我知道什么文件是什么了。它至少完成了这项工作。可能不是最可行的解决方案,但它确实有效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-12
        • 1970-01-01
        • 2018-01-25
        • 2014-02-10
        • 2012-09-13
        • 1970-01-01
        相关资源
        最近更新 更多