Как редактировать скомпилированный spritefont?
Как мне отредактировать скомпилированный spritefont? Я хотел бы изменить кернинг некоторых символов, стереть один или два пикселя, изменить псевдонимы, но я не смог найти никаких официальных инструментов, которые все еще поддерживаются или широко известны.
Если нет способа (или если это слишком сложно) редактировать скомпилированный spritefont, как мне создать spritefont вручную?
1 ответ
Официального способа сделать это не существует. Вы заметите, что если вы посмотрите на SpriteFont
типа там мало что можно модифицировать (DefaultCharacter
, Spacing
а также LineSpacing
).
И если вы посмотрите на его аналог контент-конвейера, SpriteFontContent
нет public
Участники на всех.
Лучше всего использовать ILSpy, чтобы увидеть, какие частные участники имеют эти классы (и как они работают). А затем измените их напрямую, используя отражение. 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;
}
}
Чтобы сделать вашу жизнь проще, вы можете использовать Exposed Object, который дает вам dynamic
что вы можете получить доступ к закрытым членам напрямую (что облегчает написание этого отраженного кода).
Вы можете взглянуть на Nuclex TrueType Importer, который реализует собственный процессор шрифтов спрайтов. Это открытый исходный код (albiet C++/CLI), поэтому вы можете проверить, что он делает, и, возможно, изменить его. Включает в себя собственную версию SpriteFontContent
но, к сожалению, он так же заблокирован. Самое важное, что даст вам Nuclex, - это комментарии, которые описывают, что означают различные метрики в шрифте спрайта.
Очевидно, вы возитесь с закрытыми частями XNA - так что не ожидайте, что он будет работать между разными версиями XNA. (Причина, по которой все это в первую очередь является частной, заключается в том, что команда XNA может изменить его в будущем.)
Другая вещь, которую вы можете сделать, это использовать альтернативный инструмент для создания вашего шрифта как "Текстура шрифта" ( описано здесь - хотя эта статья довольно старая).