Skip to content

シーンレコーディング

シーンの構図は、視覚的に調整する方が簡単なことがよくあります。キャラクターを配置し、スケールや回転を調整してから、カメラを移動またはズームして、画面が思いどおりに見えるようにします。この結果をシナリオスクリプトで再現するには通常、数値パラメーターを何度も推測し、シーンを再生して微調整する必要があります。

シーンレコーディングは、この試行錯誤をなくします。シナリオ行で記録を開始し、Unityの通常のシーンビューやインスペクターツールで対応するアクターとカメラを配置すると、対応するシナリオコマンドが ストーリーエディター または VS Code拡張機能 にリアルタイムで表示されます。新しいシーンを演出するとき、既存の構図を微調整するとき、手作業では計算しにくいトランスフォームを取り込むときに使用してください。

cover

ストーリーエディターでの記録

  1. Play Modeに入り、シナリオの再生を開始します。
  2. ストーリーエディターで記録先の行を右クリックし、Start Scene Recording を選択します。
  3. Unityのシーンビューのギズモまたはインスペクターで、対応するオブジェクトを変更します。生成された行はリアルタイムで更新され、赤い枠で囲まれます。
  4. 行を右クリックして Stop Scene Recording を選択するか、スクリプトを保存して記録を停止します。

記録全体が単一の Record Scene Undoステップとして登録されます。シナリオスクリプトを編集するか、再生を停止した場合も、進行中の記録が停止します。

VS Codeでの記録

  1. Play Modeに入り、シナリオの再生を開始します。
  2. 記録先のシナリオ行を右クリックし、Start Scene Recording を選択します。
  3. Unityのシーンビューのギズモまたはインスペクターで、対応するオブジェクトを変更します。コマンドの更新中は、ガターの赤い丸が記録対象のブロックを示します。
  4. 行を右クリックして Stop Scene Recording を選択するか、スクリプトを保存して記録を停止します。

記録を停止すると、VS Codeはドキュメントを自動的に保存します。UndoまたはRedo、記録対象ブロック外の編集、再生の停止でも記録が停止します。

対応オブジェクト

デフォルトレコーダーは、次のシーンオブジェクトとシリアル化されたプロパティに対応しています。

オブジェクト記録されるプロパティ生成されるコマンド
メインカメラ位置、回転、正投影サイズ、FOV@camera offset: rotation: zoom:
キャラクター位置、回転、スケール@char ID position: rotation: scale:
背景位置、回転、スケール@back ID position: rotation: scale:

デフォルトレコーダーは、アクターの外観や表示状態、プロジェクトアセットやプレハブアセット、ランタイムスクリプト、アニメーション、Timelineによる変更を記録しません。Unityエディターの変更システムを介して行われたシーンオブジェクトのシリアル化された変更を監視します。たとえば、シーンビューのギズモによるオブジェクトの移動や、インスペクターでの値の変更が対象になります。

カスタムレコーダー

追加のシーンオブジェクトに対応したり、コマンドの生成方法を変更したりするには、パラメーターなしのコンストラクタを持ち、ISceneRecorder を実装するC#クラスを追加します。Assets/Editor ディレクトリなど、エディター専用のアセンブリに配置してください。Naninovelは、デフォルトの実装の代わりにカスタム実装を自動的に使用します。

カスタム実装では、デフォルトの SceneRecorder クラスを継承して出力を変更できます。次の例では、ライトの強度の変更をカスタムコマンドで記録します。

cs
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 リストの要素を削除または変更して、デフォルトの動作をカスタマイズまたは無効化することもできます。