我正在寻找一种在 XNA 运行时更新纹理和其他内容文件的方法,这样如果在应用程序之外对其进行了修改,它会在重新获得焦点时在游戏中自动更新。
这似乎可以使用 Texture2D 并从 Stream 加载,但我无法获得到给定资源的直接路径。
我意识到这不适用于内容管道和 .xnb,但出于调试和开发目的,它将非常有用。
有没有人看到这样的东西用 XNA 成功实现了?
我正在寻找一种在 XNA 运行时更新纹理和其他内容文件的方法,这样如果在应用程序之外对其进行了修改,它会在重新获得焦点时在游戏中自动更新。
这似乎可以使用 Texture2D 并从 Stream 加载,但我无法获得到给定资源的直接路径。
我意识到这不适用于内容管道和 .xnb,但出于调试和开发目的,它将非常有用。
有没有人看到这样的东西用 XNA 成功实现了?
首先,你们所有人都需要决定是采用推式还是拉式模型。在推送模型中,更改资产的应用程序/环境将需要以某种方式通知正在运行的游戏资产已更改并需要重新加载。这可以通过一个非常简单的消息队列来完成。
在拉取模型中,游戏会定期检查所有游戏资源以查看它们是否已被修改,如果有,则重新加载它们。这将是一个更简单但性能更低的解决方案。
更大的问题是您的游戏是否可以在应用程序运行时优雅地处理重新加载资源。您可能需要实现某种后台线程来加载资产,然后将它们与游戏中的“实时”资产“交换”。或者,您的游戏可能会在每次重新加载资产时短暂暂停。无论哪种情况,这很容易成为流程中最复杂的部分,具体取决于您的内容管道当前的工作方式(您可能已经有一个后台加载程序线程等)。
编辑回应评论:
您可以使用此方法获取内容文件夹的完全限定路径:)
static public String FullContentDirectory(this ContentManager content)
{
var appPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase);
return System.IO.Path.Combine(appPath, content.RootDirectory);
}
现在,我认为您的下一个问题可能是,您如何从资产名称中知道文件扩展名?或者,如果资产名称与文件名不同怎么办?