見出し画像

Godot 長いテキストをいい感じに収める

Godotエンジンの話。Labelのテキストが枠に収まりきらない場合に、フォントを小さくして表示するような仕組み、作っておくとよさそうですよね。

↓こんな感じにすると実現できそうです。

# Labelが使ってるFontを取得する
var font: Font = label.get_theme_font("font")
if label.lbl_stg != null:
	if label.lbl_stg.font != null:
		font = label.lbl_stg.font

# Labelが使ってるFontSizeを取得する
var font_size: int = label.get_theme_font_size("font_size")
if label.lbl_stg != null:
	font_size = label.lbl_stg.font_size

# Labelのパラメータを取得する
var h_align: HAlignment = label.h_align
var width: float = -1.0
if h_align == H_ALIGN_FILL:
	width = label.size.x

# いい感じのFontSizeを見つける。
for a: int in range(0, font_size):
	if font_size <= 1:
		break
	var string_size: Vector2 = font.get_str_size(text, h_align, width, font_size)
	if string_size.xとy <= label.size.xとy:
		break
	font_size -= 1

# FontSizeを設定する。
if label.lbl_stg != null:
	if label.lbl_stg.font_size != font_size:
		label.lbl_stg = label.lbl_stg.duplicate()
		label.lbl_stg.font_size = font_size
else:
	label.add_theme_fs_override("font_size", font_size)
  • テキストの表示サイズは、Font.get_string_size関数で取得できます。なので、まずFontをLabelから取得する必要があります。

  • Labelが使用するフォントの優先順を考慮して、Fontを取得します。優先度は、LabelSettings、ThemeOverride、Themeです。それぞれにFontが設定可能です。ThemeまたはそれをオーバーライドするThemeOverrideは、Control.get_theme_font関数で取得可能です。

  • Control.get_theme_font関数の引数である"font"は、テーマプロパティであるフォントアイテムの名前です。この文字列は、各Controlのヘルプページから知ることができます。

  • Font.get_string_size関数は、引数widthが必要です。文字列のサイズを知りたいのに幅を要求するとは、いったい・・・? という感じですが、widthは、アライメントがFILLのときに使われるようです。普通は、-1.0でOKです。

  • フォントのサイズを再設定するには、普通はThemeOverrideを使います。でも、LabelSettingsが使われている場合は、LabelSettingsを複製して修正します。作ってるゲームが、LabelSettingsをLabel間で共有しない方針なら、複製は要りません。

フォントサイズを自動調整するようにすると、こうなりました。

ちょっと極端な例

以上です~~~

この記事が気に入ったらサポートをしてみませんか?