我想知道是否有一种简单的方法可以在字符串中存储纹理的路径。 我想知道这是因为我正在为游戏使用保存系统,我需要在文件中存储纹理的路径以便稍后加载它。 我尝试过使用Texture2D.Name,但只返回“”或null。 如果我无法获得完整的路径,那么至少我想得到纹理的名称。
编辑:我认为我解释得有点糟糕,或者我不能正确理解答案,我会解释一下新的尝试。我制作了一个脚本,可以保存位置,HP等“敌人”课程。然后将其存储在\ My Documents文件夹中的.txt文件中。一旦我想要重新加载信息,我就创建一个新的Enemy实例(Vector2,int)。然后我加载信息并使用int.Parse将我的字符串转换为int > new Enemy(new Vector2(int.Parse(string1), int.Parse(string2)), int.Parse(string3)) <
我当时想要的是以某种方式保存纹理的名称,以便稍后使用上面提到的类似方法将其加载回来。 (以字符串形式从.txt中检索)
答案 0 :(得分:1)
大多数对象没有可用的名称,即使它们可能没有必要安全地用作文件名。
除非你有充分的理由期待对象上的好名字并实际使用它,否则我建议只使用Guid.NewGuid().toString()
作为文件名 - 安全且独特。
答案 1 :(得分:1)
Texture2D严格来说是一个内存中的对象,Texture2D与文件之间没有关系(除了可以从文件中加载和保存Texture2D)。如果你想记住你加载它的文件名,你应该在加载纹理时保持文件名。
编辑回复您的评论:
假设您没有谈论屏幕截图,您需要执行以下操作:
FileStream fs = new FileStream("myFile.png", FileMode.OpenOrCreate);
myTexture.SaveAsPng(fs, myTexture.Width, myTexture.Height);
fs.Flush();
答案 2 :(得分:0)
ContentManager
具有RootDirectory
属性,用于标识存储内容管理器内容的文件夹。该路径相对于可执行文件夹,因此您可以使用该路径构建内容路径,以及加载内容时指定的名称。
例如,如果您加载如下的.PNG纹理:
Texture2D texture = Content.Load<Texture2D>("SomeTexture")
然后可以像这样构建该纹理的路径:
string path = Content.RootDirectory + Path.DirectorySeparator + "SomeTexture" + ".png"
请注意,您需要了解文件类型以了解扩展名是什么。这也假设您没有更改内容项属性中的名称,因此您在Load
调用中使用的键与文件名匹配,默认情况下会这样做。
如果您将内容存储在子文件夹中,那么您只需附加这些内容即可构建完整路径。
如果您需要完整的磁盘路径而不是相对路径,那么您可以获取可执行路径并将其添加到Content.RootDirectory
。在这方面,谷歌是你的朋友。
答案 3 :(得分:0)
如果您的游戏是基于内容项目的,最简单的方法是使用内容项目路径根目录的路径亲属。
在您的内容项目中:
the relative path to file is "Textures/Animated/Rambo"
在你的剧本中:
TextureAsset = "Textures/Animated/Rambo";
在你的引擎
中 Texture = Content.Load<Texture2D>( "Textures/Animated/Rambo");
//Or if you don't want to load through Content
Texture = Texture2D.LoadFromFile(Path.Combine(Content.RootDirectory, "Textures/Animated/Rambo"));
如果您想保存,我建议您以相同的方式继续,并强制保存在内容项目文件夹中。