Text+ の Write On に Expression を設定して、 フレーム毎に1文字づつ表示 させるようにします。
Fusion ページは使わず、Edit ページのみで完結させられます。
入力した 文字数に依存 するため、キーフレームも使用しません。
タイムラインに配置したText+のInspectorから、「Write On」の「End」にExpressionを設定します。
「End」の文字部分を右クリックして、Expressionを選択します。
Expression入力エリアが表示されます。
初期値の1.0を消して、以下を入力(コピペ)
math.max(0, math.min(1, 1 / #(self.StyledText.Value):gsub("[\128-\191]", "") * time))
再生すると1フレーム毎にWrite On の値が変わり、1文字づつ表示されるようになります。
※ まれに2文字一緒に出ることがあります。数値的には合っていても Write On の挙動に数値のまるめなどの影響があるのかと思いますが、現時点では対処していません。
開発経緯
開発というほどでは無いですが…
1文字づつ表示させる演出は、キーフレームを打ったり、どこからどこまでにというフレーム数に依存した形の実装が多いと思います。
単純に1文字づつ順に表示してるのでいいのにという場合、文字数を数えてキーフレーム打つのは面倒、スクリプトでやらせることにしました。
文字数のカウントについて
Luaには、string.len()という文字数を数えるメソッドがありますが、全角などのUTF-8に対応していません。
バイト数としてして返ってくるため、1文字で3カウントされます。
string.len()を使わず、string.gsub()のパターンでUTF-8コードポイント([\128-\191])をキャプチャして、長さ演算子「#」で数を出しています。
※Lua5.3からは、UTF-8対応の utf.len が実装されているようですが、DaVinci Resolve 18 では対応していません。
最大小値設定について
Write On が受け付ける値は[0-1.0]です。
math.max(0, math.min(1, *)) でその範囲に収まるようにしています。
Expression貼り付け時に再生ヘッドがその範囲の位置にあれば、以降それを超えようが動いてはくれます。
そこに気をつければ max, min無しでも動きますが、再生ヘッドがその範囲を超えているとエラーとなり、描画されなくなります。
それを回避するために、冗長ですが出力の値の範囲を絞っています。
カスタマイズ
数フレーム毎に出す
単純に time の後に希望するフレーム数で割ってやります。
2で割れば、2フレーム毎に1文字が出てきます。
-- 2フレーム毎に1文字出す(time / 2)
math.max(0, math.min(1, 1 / #(self.StyledText.Value):gsub("[\128-\191]", "") * time / 2))
フレーム数を固定して出す
20フレームで最初から最後まで出したい場合、文字数は関係なくなるので、以下の Expression で可能です。
math.max(0, math.min(1, time / 20))
以上