シーンレコーディング
シーンの構図は、視覚的に調整する方が簡単なことがよくあります。キャラクターを配置し、スケールや回転を調整してから、カメラを移動またはズームして、画面が思いどおりに見えるようにします。この結果をシナリオスクリプトで再現するには通常、数値パラメーターを推測し、シーンを再生し直して微修正する、という作業を何度も繰り返す必要があります。
シーンレコーディングは、この試行錯誤をなくします。シナリオ行で記録を開始し、Unityの通常のシーンビューやインスペクターツールでサポート対象のアクターとカメラを配置すると、対応するスクリプトコマンドが ストーリーエディター または VS Code拡張機能 にリアルタイムで表示されます。新しいシーンを演出するとき、既存の構図を微調整するとき、手作業では計算しにくいトランスフォームを取り込むときに使用してください。
ストーリーエディターでの記録
- プレイモードに入り、シナリオの再生を開始します。
- ストーリーエディターで記録先の行を右クリックし、
Start Scene Recordingを選択します。 - Unityのシーンビューのギズモまたはインスペクターで、サポート対象のオブジェクトを変更します。生成された行はリアルタイムで更新され、赤い枠で囲まれます。
- 記録を停止するには、行を右クリックして
Stop Scene Recordingを選択するか、スクリプトを保存します。
記録全体が、Record Scene という1つの「元に戻す」操作として登録されます。シナリオスクリプトを編集した場合や、再生を停止した場合も、進行中の記録が停止します。
VS Codeでの記録
- プレイモードに入り、シナリオの再生を開始します。
- 記録先のシナリオ行を右クリックし、
Start Scene Recordingを選択します。 - Unityのシーンビューのギズモまたはインスペクターで、サポート対象のオブジェクトを変更します。コマンドの更新中は、ガターの赤い丸が記録対象のブロックを示します。
- 記録を停止するには、行を右クリックして
Stop Scene Recordingを選択するか、スクリプトを保存します。
記録を停止すると、VS Codeはドキュメントを自動的に保存します。元に戻す操作ややり直し操作、記録対象ブロック外の編集、再生の停止でも記録が停止します。
対応オブジェクト
デフォルトレコーダーは、次のシーンオブジェクトとシリアル化されたプロパティに対応しています。
| オブジェクト | 記録されるプロパティ | 生成されるコマンド |
|---|---|---|
| 背景 | 位置、回転、スケール | @back wpos: rotation: scale: |
| キャラクター | 位置、回転、スケール | @char wpos: rotation: scale: |
| プリンター | 位置、回転、スケール | @printer wpos: rotation: scale: |
| 選択肢 | 位置、回転、スケール | @choiceHandler wpos: rotation: scale: |
| カメラ | 位置、回転、正投影サイズ、FOV | @camera offset: rotation: zoom: |
デフォルトレコーダーは、アクターの外観や可視性、プロジェクトアセットやプレハブアセット、およびランタイムスクリプト、アニメーション、Timelineによる変更を記録しません。Unityエディターの変更システムを介して行われたシーンオブジェクトのシリアル化された変更を監視します。たとえば、シーンビューのギズモによるオブジェクトの移動や、インスペクターでの値の変更が対象になります。
カスタムレコーダー
追加のシーンオブジェクトに対応したり、コマンドの生成方法を変更したりするには、パラメーターなしのコンストラクターを持ち、ISceneRecorder を実装するC#クラスを追加します。Assets/Editor ディレクトリなど、エディター専用のアセンブリに配置してください。Naninovelは、デフォルトの実装の代わりにカスタム実装を自動的に使用します。
カスタム実装では、デフォルトの SceneRecorder クラスを継承して出力を変更できます。次の例では、ライトの強度の変更をカスタムコマンドで記録します。
public class CustomRecorder : SceneRecorder
{
// 記録中にシーンが変更されると呼び出されます
public override void Record (
// 入力:記録するシーンの変更
IReadOnlyList<SceneChange> changes,
// 出力:記録されたシナリオ行
List<string> lines)
{
// デフォルトの動作を維持します(省略可能)
base.Record(changes, lines);
// 現在のシーン変更のバッチを走査します
foreach (var change in changes)
// 対象のオブジェクトとプロパティを検索します
if (change is { Target: Light light, Property: "m_Intensity" })
// 変更をシナリオスクリプトに記録します
lines.Add($"@light power:{light.intensity}");
}
}各 SceneChange は、変更されたシリアル化プロパティを所有するUnityオブジェクトと、そのプロパティのシリアル化パスを示します。完全なNaniScriptコマンド行を lines に追加してください。lines リストの要素を削除または変更して、デフォルトの動作をカスタマイズまたは無効化することもできます。