scene と ymm4
scene はシーンの解像度とシーン単位の共有値を、ymm4 はグループ・タイムライン・再生状態などの
環境情報を提供します。
scene — シーン情報
| メンバー | 説明 |
scene.width | シーンの横解像度(ピクセル) |
scene.height | シーンの縦解像度(ピクセル) |
scene.cx | 横解像度の半分(scene.width / 2) |
scene.cy | 縦解像度の半分(scene.height / 2) |
scene.set(name, value) | シーン全体で共有する値を保存します |
scene.get(name) | scene.set() で保存した値を取得します |
シーンサイズに対する相対配置
obj.x = scene.cx * obj.track0 / 100
scene.set / scene.get — シーン内の値共有
scene.set(name, value) は、シーンごとに用意された共有領域へ値を保存します。
保存した値は、同じシーンに置かれたすべての Lua スクリプトエフェクトから
scene.get(name) で読み取れます。どちらの実行エンジンでも同じ動作をします。
| 引数 | 説明 |
name | 値の名前を文字列で指定します |
value | 保存する値を指定します。数値と文字列と真偽値を保存できます。nil を渡すと値を削除します |
-- アイテムA: 自分の座標を共有する
scene.set("leader_x", obj.x)
-- アイテムB: 共有された座標へ追従する
obj.x = scene.get("leader_x") or 0
値が見えるタイミング
- 自分のスクリプトが書き込んだ値は、同じ実行の中で直後の
scene.get からそのまま読み取れます。
- 他のアイテムが書き込んだ値は、次のフレームの評価から読み取れます。同じフレームの中では、アイテムがどの順番で評価されても読み取れる値は変わりません。
- スクリプトがエラーまたはタイムアウトで終了した場合には、その実行の書き込みは共有領域へ反映されません。
- 動画出力を開始すると、共有領域は空の状態から始まります。そのため、同じプロジェクトを出力すれば毎回同じ結果になります。
制限
- 保存できる値は数値と文字列と真偽値だけです。テーブルや関数を渡した呼び出しは無視されます。
- 名前と文字列の値は、UTF-8 で 4095 バイトを超える部分が切り捨てられます。
- 1 つのシーンに保存できる名前は 4096 個までです。上限を超えた新しい名前への書き込みは無視されます。
- 同じフレームの中で複数のアイテムが同じ名前へ書き込んだ場合には、どちらの値が残るかは保証されません。
- 値は YMM4 を終了するまでメモリ上に保持されます。プロジェクトファイルには保存されません。
ymm4 — 環境・メタ情報
| メンバー | 型 | 説明 |
ymm4.group_index | 整数 | グループ制御内の現在のインデックス(0 始まり) |
ymm4.group_count | 整数 | グループ制御内の総アイテム数 |
ymm4.group_ratio | 数値 | グループ内の進行割合(group_index / group_count) |
ymm4.timeline_totalframe | 整数 | タイムライン全体の総フレーム数 |
ymm4.timeline_totaltime | 数値 | タイムライン全体の総時間(秒) |
ymm4.time_ratio | 数値 | 現在の再生位置の割合(0.0 ~ 1.0) |
ymm4.is_saving | 真偽値 | 動画出力中のみ true |
ymm4.is_playing | 真偽値 | 再生中のみ true |
ymm4.is_paused | 真偽値 | 一時停止中のみ true |
ymm4.scene_id | 文字列 | 現在のシーンを識別する文字列(GUID) |
グループ内のインデックスで時間差をつける
local d = ymm4.group_index * 0.1
local p = anim.duration(anim.delay(time, d), 0.5)
obj.alpha = p * 255
グループ内の進行割合で配置をずらす
obj.x = obj.x + ymm4.group_ratio * 400
出力時のみ挙動を変える
if ymm4.is_saving then
obj.alpha = 255
else
obj.alpha = 128
end