This translation is community contributed and may not be up to date. We only maintain the English version of the documentation. Read this manual in English
フォントは、ラベル(Label)コンポーネント(component)と GUI のテキストノード(text node)でテキストを描画するために使います。Defold は、次のフォントファイル形式をサポートしています。
従来のテキストレイアウトエンジンと完全なテキストレイアウトエンジンは、どちらも TrueType の輪郭と OpenType CFF1/CFF2 の輪郭に対応し、.ttf と .otf リソースからの実行時生成もサポートします。
個々のテキストスパンにスタイルを適用する方法や、リンクとインラインのスプライトの扱いについては、リッチテキストマークアップのマニュアルを参照してください。
TrueType と OpenType のフォントでは、Mode プロパティでグリフの描画方法を選択します。
新しく作成したフォントリソースでは、Vector モードと Dynamic グリフ生成を使います。既存のフォントリソースは Bitmap または SDF モードを保持します。BMFont ソースは、常に付属のビットマップを使います。
Vector モードには RGBA16F と R32UI テクスチャへの対応が必要で、OpenGL ES 2 と WebGL 1 では利用できません。非対応のグラフィックスアダプターを対象とする場合は、Bitmap または SDF フォントと、それに合うマテリアルを使ってください。Vector から SDF への自動フォールバックはありません。設定については、ベクターフォントを参照してください。
Glyph Generation プロパティでは、各フォントのグリフデータを生成するタイミングを選択します。
.ttf または .otf ファイルはバンドルしません。.ttf または .otf ファイルをバンドルし、実行時に必要に応じてグリフを生成します。Prewarm Text は、フォントを読み込むときにグリフを準備します。ほかのグリフは後から必要に応じて生成できます。SDF フォントと Vector フォントは、どちらの選択肢にも対応します。Bitmap フォントと BMFont ソースは Static 生成を使います。各フォントリソースを個別に設定するため、プロジェクト内で Static フォントと Dynamic フォントを混在させられます。
動的生成は、特に文字集合の大きなフォントで、バンドルサイズと実行時のメモリ使用量を削減できます。エンジンの完全なテキストレイアウトシステムが必要です。ランタイムフォントの有効化を参照してください。
ランタイムフォントには、右から左への表示など、完全なテキストレイアウトをサポートするという利点もあります。 現在は、HarfBuzz、SheenBidi、libunibreak、SkriBidi ライブラリを使用しています。
ランタイムフォントの有効化を参照してください。
エディターは、フォントとシーン内のテキストのプレビューにエンジンのフォントレンダラーを使います。テキストの字形形成と右から左へのレイアウトには、ランタイムフォントと App Manifest の Use full text layout system オプションが必要です。オフラインフォントの場合、プレビューはフォントの Characters と All Chars 設定に従います。
.fontc ファイル形式は、フォントコレクション(font collection)とも呼ばれます。オフラインモードでは、1つのフォントだけが関連付けられます。
ランタイムフォントを使うと、複数のフォントファイル(.ttf または .otf)をフォントコレクションに関連付けられます。
これにより、異なる言語の複数のテキストを描画するときに、メモリ占有量を低く抑えながらフォントコレクションを使用できます。 たとえば、日本語フォントを含むコレクション(collection)を読み込み、そのフォントを現在のメインフォントに関連付けた後、日本語フォントのコレクションをアンロードします。
Defold で使うフォントを作成するには、メニューから File ▸ New... を選択し、続いて Font を選択して、新しい Font ファイルを作成します。Assets ブラウザーの任意の場所を 右クリック し、New... ▸ Font を選択することもできます。

新しいフォントファイルに名前を付けて Ok をクリックします。新しいフォントファイルがエディターで開きます。
使用するフォントを Assets ブラウザーにドラッグし、適切な場所にドロップします。
Font プロパティにフォントファイルを設定します。.ttf または .otf ソースでは、Mode と Glyph Generation を選択し、残りのプロパティを必要に応じて設定します。Dynamic 生成では、ランタイムフォントの設定も完了してください。

Vector フォントでは、Label コンポーネントまたは GUI テキストノードの Font Size で、表示する文字のサイズを変更します。Outline/Shadow Bitmap Size は、表示サイズとは独立して、エフェクト用ビットマップの解像度を制御します。
Bitmap フォントと SDF フォントでは、フォントリソースの Size で、生成するグリフのサイズを選択します。BMFont のサイズはソースの .fnt ファイルから取得します。これらのフォントの表示サイズを変更するには、Label コンポーネントまたは GUI テキストノードを拡大縮小します。
.fnt ファイルです。.ttf または .otf ソースの描画方法で、Bitmap、SDF、Vector から選びます。以前の Output Format プロパティを置き換えるものです。BMFont ソースでは表示しません。.ttf または .otf ソースの Bitmap モードでのみ表示します。SDF、Vector、BMFont ソースでは、Defold がレイヤー構成を自動的に選択します。
.fnt ファイルからサイズを読み取り、ここでは編集できません。.ttf または .otf ソースの Bitmap モードでのみ表示します。組み込みの Bitmap フォントシェーダーは、Single Layer と Multi Layer の両方の描画モードで影に対応します。Single Layer で描画し、影が不要な生成 Bitmap フォントでは、カスタムマテリアルに /builtins/fonts/font-singlelayer.fp を使えます。SDF と Vector のフォントには、モードに合うシェーダーが必要です。フォントのマテリアルを参照してください。
font.prewarm_text() で、スクリプトからテキストを事前準備することもできます。ASCII の印字可能文字は次のとおりです。 スペース ! “ # $ % & ‘ ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~
ERROR:RENDER: Out of available cache cells! Consider increasing cache_width or cache_height for the font.)。
0に設定するとキャッシュサイズは自動で設定され、最大 2048x4096 まで拡大します。
フォントのモードに合うマテリアルを使います。フォントリソースの Material は GUI テキストノードが使います。Label コンポーネントには独自の Material プロパティがあり、こちらもフォントと一致する必要があります。
| フォントのモードまたはソース | GUI テキスト用のフォントマテリアル | Label コンポーネントのマテリアル |
|---|---|---|
| Bitmap | /builtins/fonts/font.material |
/builtins/fonts/label.material |
| SDF | /builtins/fonts/font-df.material |
/builtins/fonts/label-df.material |
| Vector | /builtins/fonts/font-vector.material |
/builtins/fonts/label-vector.material |
BMFont (.fnt) |
/builtins/fonts/font-fnt.material |
/builtins/fonts/label-fnt.material |
フォントエディターで Mode を変更すると、対応する組み込みの Bitmap、SDF、Vector マテリアルのいずれかが割り当てられている場合は、マテリアルも切り替わります。カスタムマテリアルは自動では置き換えません。そのフォントを使う Label コンポーネントの Material プロパティも確認してください。
ベクターフォントは曲線からグリフ本体を描画するため、表示サイズを変更しても鮮明さを保ちます。実行時にグリフを生成するフォントは、次のように設定します。
/fonts/ui.font などの .font リソースを作成し、Font プロパティに TrueType または OpenType ソースを選択します。通常のテキストには、組み込みの /builtins/fonts/vera_mo_bd.ttf を使えます。/builtins/fonts/font-vector.material に設定します。これらは新しいフォントリソースのデフォルト値です。/builtins/fonts/label-vector.material に設定します。コンポーネントまたはノードの Font Size に、表示したいサイズを設定します。Vector のグリフ本体は曲線テクスチャを使いますが、有効な輪郭線と影は引き続き SDF ビットマップデータを生成し、グリフキャッシュのテクスチャメモリを消費します。Outline/Shadow Bitmap Size は、そのビットマップの解像度を Label や GUI テキストノードの Font Size とは独立して設定します。エフェクトが不要な場合は、Outline Alpha と Shadow Alpha を 0 にすると、ビットマップデータの生成を避けられます。
Vector フォントは、パレットの色や線形・放射状グラデーションを含む COLRv1 カラー絵文字を描画できます。Bitmap と SDF のモードは、COLRv1 の色を描画しません。上記の Dynamic Vector の設定を行い、フォントコレクションに COLRv1 絵文字フォントをフォールバックとして追加します。通常のテキストは引き続き元のフォントを使います。
たとえば COLRv1 の Noto Color Emoji フォントを、プロジェクトに /fonts/NotoColorEmoji-Regular.ttf としてコピーします。COLRv1 版を選んでください。ほかの絵文字フォントは、ファイル名が .ttf で終わっていても、異なるカラー形式を使う場合があります。
game.project の Project ▸ Custom Resources に /fonts/NotoColorEmoji-Regular.ttf を追加します。ほかのカスタムリソースがない場合、設定は次のようになります。
[project]
custom_resources = /fonts/NotoColorEmoji-Regular.ttf
Lua にフォントパスを書くだけでは、フォントファイルはバンドルされません。Custom Resources に設定すると、リソースシステム経由で読み込む font.add_font() から、このソースフォントを利用できます。バンドルから読み込む際は、ソースフォントのパスを文字列で渡します。
フォールバックの追加は、共有フォントリソースごとに1回だけ行います。この変更は、そのフォントを使うすべての Label と GUI テキストノードに反映され、同じフォールバックを2回追加するとエラーになります。同じ .font で Label の例と GUI の例を併用する場合は、どちらかが事前準備や表示を行う前に、フォールバックを1回だけ追加するよう初期化を調整します。これらの例は、フォールバック追加後にテキスト全体を事前準備し、コールバックが成功してから表示します。
距離フィールドフォントは、ビットマップデータの代わりに、グリフの輪郭までの距離をテクスチャに格納します。エンジンがフォントを描画するには、距離データを解釈し、それを使ってグリフを描画する専用のシェーダーが必要です。距離フィールドフォントはビットマップフォントより多くのリソースを消費しますが、サイズ変更の自由度が高くなります。

Mode で SDF を選択し、Glyph Generation で Static または Dynamic を選びます。フォントには /builtins/fonts/font-df.material、Label コンポーネントには /builtins/fonts/label-df.material、または距離場データを処理するカスタムマテリアルを使います。
Defold は、生成したビットマップに加え、あらかじめ焼き込まれたビットマップの「BMFont」形式のフォントをサポートしています。この形式のフォントは、すべてのグリフを含む PNG フォントシートで構成されます。さらに、.fnt ファイルには、各グリフのシート上の位置と、サイズやカーニングの情報が含まれています。(Defold は、Phaser などのツールが使用する .fnt 形式の XML 版をサポートしていません。)
この形式のフォントには、TrueType や OpenType フォントファイルから生成したビットマップフォントに対するパフォーマンス上の利点はありませんが、任意のグラフィックス、色、影を画像に直接含められます。
生成した .fnt と .png ファイルを Defold プロジェクトに追加します。これらは同じフォルダーに配置してください。新しいフォントファイルを作成し、Font プロパティに .fnt ファイルを設定します。Defold は付属のビットマップを使い、.fnt ファイルからサイズを読み取ります。BMFont ソースでは Mode と Glyph Generation は表示されません。
BMFont を作成するには、適切なファイルを生成できるツールを使う必要があります。次のような選択肢があります。

フォントの Material を /builtins/fonts/font-fnt.material に設定します。Label コンポーネントでは /builtins/fonts/label-fnt.material を使います。
一般に、拡大縮小せずにフォントを描画する場合は、ビットマップフォントが最適です。距離フィールドフォントより高速に画面へ描画できます。
距離フィールドフォントは、拡大しても良好な表示を維持できます。一方、ビットマップフォントはピクセルで構成された画像なので、フォントを拡大するとピクセルも大きくなり、ブロック状の乱れが生じます。次は、フォントサイズ48ピクセルのサンプルを4倍に拡大したものです。

縮小する場合、ビットマップテクスチャは GPU によってきれいかつ効率よく縮小され、アンチエイリアスを適用できます。ビットマップフォントは、距離フィールドフォントよりも色をよく維持します。次は、同じサイズ48ピクセルのサンプルフォントを1/5のサイズに縮小したものの拡大表示です。

距離フィールドフォントは、グリフの曲線を表現できる距離情報を保持するのに十分な目標サイズで描画する必要があります。次は、上と同じフォントを18ピクセルのサイズで作成し、10倍に拡大したものです。この書体の形状をエンコードするには、このサイズが小さすぎることがはっきりと分かります。

影や輪郭線が不要な場合は、それぞれのアルファ値をゼロにします。そうしないと影と輪郭線のデータも生成され、不要なメモリを消費します。Vector モードでは、両方を無効にするとビットマップデータの生成を避けられます。グリフ本体は引き続き曲線データを使います。
Bitmap と SDF のフォントリソースは、実行時にグリフキャッシュテクスチャとフォントデータを使います。Vector フォントはグリフ本体を曲線データとして格納し、有効な輪郭線と影にビットマップキャッシュを使います。以下のテクスチャ配置の説明は、Bitmap と SDF フォントに適用されます。
実行時にテキストを描画するとき、エンジンはまず描画対象のグリフを順に調べ、どのグリフがテクスチャキャッシュにあるか確認します。グリフテクスチャキャッシュにないグリフごとに、フォントデータに格納されたビットマップデータからテクスチャへのアップロードが行われます。
各グリフは内部的にフォントのベースラインに合わせてキャッシュ内に配置されるため、シェーダーで、そのグリフに対応するキャッシュセル内のローカルテクスチャ座標を計算できます。これにより、グラデーションやテクスチャの重ね合わせなど、特定のテキストエフェクトを動的に実現できます。エンジンは、texture_size_recip という特別なシェーダー定数を通じて、キャッシュに関する指標をシェーダーに提供します。この定数のベクトル成分には、次の情報が含まれます。
texture_size_recip.x は、キャッシュの幅の逆数です。texture_size_recip.y は、キャッシュの高さの逆数です。texture_size_recip.z は、キャッシュの幅に対するキャッシュセルの幅の比率です。texture_size_recip.w は、キャッシュの高さに対するキャッシュセルの高さの比率です。たとえば、フラグメントシェーダーでグラデーションを生成するには、次のように記述します。
float horizontal_gradient = fract(var_texcoord0.y / texture_size_recip.w);
シェーダーのユニフォーム(uniform)の詳細は、シェーダーマニュアルを参照してください。
実行時生成は、フォントリソースごとに設定します。
.font リソースを開き、TrueType(.ttf)または OpenType(.otf)ソースを選択します。font.prewarm_text() を使い、コールバックを待ってから表示します。新しいフォントリソースは、すでに Vector モードと Dynamic 生成を使いますが、上記の App Manifest の設定は引き続き必要です。
Dynamic フォントは、フォント読み込み時に Prewarm Text に必要なグリフを生成します。このフィールドはレイアウトするテキストとして解釈され、そのテキストに必要なグリフをキャッシュに準備します。Dynamic フォントでは All Chars は利用できません。
Dynamic フォントには、font.prewarm_text(font_collection, text, callback) も呼び出せます。コールバックは、不足するすべてのグリフがキャッシュに追加され、テキストを表示してよくなったことを通知します。Static フォントでは、この関数を使えません。
Dynamic フォントでは、フォントコレクションにソースフォント(.ttf または .otf)を追加したり、削除したりできます。
これは、大きなフォントが異なる文字セット(CJK など)ごとに複数のファイルに分割されている場合に便利です。
フォントコレクションにフォントを追加しても、すべてのグリフが自動的に読み込まれたり、描画されたりするわけではありません。
function init(self)
-- Get the target font collection.
self.font_collection = go.get("#label", "font")
-- Get the first font assigned to the selected language collection.
local language_collection = go.get("localization_japanese#label", "font")
local font_info = font.get_info(language_collection)
self.language_ttf_hash = font_info.fonts[1].path_hash
-- Associate it with the target collection and increase its reference count.
font.add_font(self.font_collection, self.language_ttf_hash)
end
function final(self)
-- Remove the association and release the font reference.
font.remove_font(self.font_collection, self.language_ttf_hash)
end
ランタイムフォントでテキストを正しく表示するには、グリフを解決する必要があります。font.prewarm_text() がこの処理を行います。
これは非同期処理であり、処理が完了してコールバックを受け取ると、それらのグリフを含むメッセージの表示に進めます。
グリフキャッシュがいっぱいになると、キャッシュ内の最も古いグリフが追い出されます。
font.prewarm_text(self.font_collection, info.text, function (self, request_id, result, err)
if result then
print("PREWARMING OK!")
go.set(self.label, "text", info.text)
else
print("Error prewarming text:", err)
end
end)