特定の文字を置き換える

ゲームの中で特定の文字を置き換えたいときがあります。
例えば、入力されたプレイヤーの名前を置き換える場合などが当てはまります。

replace関数

var message:String = "むかしむかし、@playerは鬼退治に行きました"
var player_name:String = "桃太郎"

func _ready():
    var result:String = message.replace("@player", player_name)
    print(result) #むかしむかし、桃太郎は鬼退治に行きました

format関数

var message:String = "むかしむかし、{player}は鬼退治に行きました"
var player_name:String = "桃太郎"

func _ready():
    var result:String = message.format({"player": player_name})
    print(result) #むかしむかし、桃太郎は鬼退治に行きました

replaceとformatの違い

replaceは指定した文字列と一致するすべての文字を置換します。
仮に文中に偶然同じ文字列が出てきたとしても、機械的に置換します。

formatよりもreplaceの指定方法の方が単純なので手軽に使用することができますが、今回のケースのようにプレイヤー名を置換するだけの場合はformatの方が確実に置換することができます。

使用するケースによって使い分けるのが良いかと思います。

また、フォーマットを設定する(簡易版)で置換することも可能ですが、%sの数と配列の順番を揃える必要があり、実装で混乱しやすいため、上記いずれかの方法を取ることをお勧めします。

1文字ずつ表示する

画面に表示する場合はLabelクラスを使用します。

メッセージウィンドウなどで1文字ずつ順番に表示したい場合があります。
Labelクラスのvisible_ratio変数の値を変更することで簡単に実装することができます。

Labelクラスのvisible_ratioの値を変更

onready var label = $Label

func _ready:
    label.text = "むかしむかし、浦島はたすけた亀に連れられて"
    label.visible_ratio = 0.5 #むかしむかし、浦島は

LabelおよびRichTextLabelクラスには、割合でテキストを表示する機能が備わっています。

awaitを使用する場合

onready var label = $Label
var duration:float = 0.05

func _ready():
	label.text = "むかしむかし、浦島はたすけた亀に連れられて"
	label.visible_ratio = 0
	message_play()
	
func message_play():
	label.visible_ratio += 1.0 / label.text.length() 
	await get_tree().create_timer(duration).timeout
	if label.visible_ratio < 1: 
        _message_play()

_process()を使用する場合

onready var label = $Label
var duration:float = 0.05

func _ready():
	label.text = "むかしむかし、浦島はたすけた亀に連れられて"
	label.visible_ratio = 0
	
func _process(_delta):
	if label.visible_ratio < 1:
		label.visible_ratio += 1.0 / label.text.length() * (1.0 - duration)

BBCodeを使用したRichTextLabelでは、自動でBBタグを無視してくれるので、単純にvisible_ratioの値を指定すれば実装できます。

文字にエフェクトをかける

RichTextLabelでのみ動作します。
まずは、bbcode_enabletrueにする必要があります。(インスペクタでも設定可能)

主な組み込みエフェクト

func  _ready():
	rich_label.bbcode_enabled = true
	rich_label.text += "[center]"
	rich_label.text += "[color=#ff6666]文字色が赤[/color]な部分と[color=#6666ff]文字色が青[/color]な部分\n"
	rich_label.text += "[wave]ウェーブする文字列[/wave]\n"
	rich_label.text += "[tornado]トルネードする文字列[/tornado]\n"
	rich_label.text += "[shake]シェイクする文字列[/shake]\n"
	rich_label.text += "[fade start=0 length=9]フェードする文字列[/fade]\n"
	rich_label.text += "[rainbow]ゲーミング文字列[/rainbow]\n"
	rich_label.text += "[/center]"

文字をフェードして表示させる

文字にエフェクトをかける処理で1文字ずつ表示するに似た挙動を作ることも可能です。

var msg_count:float = 0
var msg_text:String = "[fade start=%s length=5]いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせすん[/fade]"

func  _ready():
	rich_label.bbcode_enabled = true
	
func _process(delta):
	var _msg_len:int = msg_text.length()
	if msg_count < _msg_len:
		msg_count += 0.3
		rich_label.text = msg_text % int(msg_count)