Xna 如何编辑已编译的spritefont?

Xna 如何编辑已编译的spritefont?,xna,spritefont,Xna,Spritefont,如何编辑已编译的spritefont?我想更改一些字符的字距,擦除一两个像素,更改别名,但我找不到任何仍然受支持或广为人知的官方工具 如果无法(或太难)编辑已编译的spritefont,如何手动创建spritefont?没有正式方法。您会注意到,如果查看SpriteFont类型,您可以修改的内容很少(DefaultCharacter,间距和行间距) 如果您查看它的内容管道对应项,SpriteFontContent,则根本没有公共成员 最好的办法是使用查看这些类有哪些私有成员(以及它们如何工作)

如何编辑已编译的spritefont?我想更改一些字符的字距,擦除一两个像素,更改别名,但我找不到任何仍然受支持或广为人知的官方工具


如果无法(或太难)编辑已编译的spritefont,如何手动创建spritefont?

没有正式方法。您会注意到,如果查看
SpriteFont
类型,您可以修改的内容很少(
DefaultCharacter
间距
行间距

如果您查看它的内容管道对应项,
SpriteFontContent
,则根本没有
公共成员


最好的办法是使用查看这些类有哪些私有成员(以及它们如何工作)。然后使用反射直接修改它们
SpriteFont
基本上是一组度量数据和一个
Texture2D

我建议您创建一个内容管道扩展,并在构建它时修改
SpriteFontContent
(如果您有一个不是自己构建的XNB文件,这将变得更加棘手)。它看起来像这样:

[ContentProcessor(DisplayName = "Custom Font Processor")]
public class CustomFontProcessor : FontDescriptionProcessor
{
    public override SpriteFontContent Process(FontDescription input, ContentProcessorContext context)
    {
        SpriteFontContent output = base.Process(input, context);
        // ... your modifications here ...
        return output;
    }
}
为了使您的生活更轻松,您可以使用它提供一个
动态
,然后您可以直接访问私有成员(使编写此代码更容易)

您可以查看Nucleux TrueType导入器,它实现了自己的sprite字体处理器。它是开源的(albiet C++/CLI),所以您可以检查它的功能,或者修改它。它包括自己版本的
SpriteFontContent
,但遗憾的是,它同样被锁定。Nucleux给你的最重要的东西是它有一些注释,这些注释描述了sprite字体中不同度量的含义

很明显,您正在搞乱XNA的私有部分-所以不要期望它在不同的XNA版本之间继续工作。(首先,它是私有的,这是因为XNA团队将来可以自由修改它。)


您可以做的另一件事是使用另一种工具将字体构建为“字体纹理”(尽管本文已经很老了)