状態ビジュアライザー — MRTK3

Unity Inspector ウィンドウの State Visualizer スクリプトを示す図。

StateVisualizer は、操作状態に応じて視覚的なフィードバックを作成するためのローコードのデザイナー向けのインターフェイスです。 アニメーションベースの複雑な効果だけでなく、一般的な既製の効果の両方を可能にします。

基本方針

MRTK3 では、状態とビジュアルの分離が適用されます。 Interactable は対話ロジックと状態を担当しますが、状態に基づいて独自のビジュアルや効果をレンダリングしないように設計されています。 この分離の動機は、状態と相互作用のロジックを複数のビジュアル コンテキストで再利用できることと、操作の視覚的フィードバックとアートの方向を、基盤になる状態や対話式操作に触れることなくカスタマイズできることです。 さらに、状態をビジュアルに混在させると、ビジュアル効果とそれらが表す対話式操作の関係が複雑で理解しにくくなり、保守できないコードになる可能性があります。

その結果、StateVisualizer の大部分はステートレスです。 関連付けられている StatefulInteractable をリッスンし、現在の対話式操作の状態に基づいて IEffect グラフを実行します。 Selectedness やパッシブ/アクティブなホバー意図のような複雑な状態は、StateVisualizer で使用するために公開されています。 一部の効果は、小数部の選択値に反応して、ユーザーの動き、ピンチ、押しに応答する楽しい "アナログ" 効果を駆動できるものもあります。

StateVisualizer は、部分的に Unity Playables API に構築されています。

使用方法

StateVisualizer を Animator と共に Interactable に追加します。 状態を選択し、目的の効果を追加します。 StateVisualizer が実行時に Interactable を見つけることができない場合は、Interactable プロパティが設定されていることを確認します。

重要

効果を作成する場合を除き、Animator には Animator Controller は必要ありません。 StateVisualizer は、Playables API を介して直接 Animator を駆動します。 StateVisualizer は、パフォーマンスと保守性を高めるために AnimatorController を回避します。

効果の追加

StateVisualizer を使用したアニメーションの作成

StateVisualizer では AnimatorController が使用されないため、既定では編集時にアニメーションをプレビューできません。 これを解決するには、処理中の関連アニメーションを含む一時的な AnimatorController を作成し、Animator で参照します。 ただし、これらは実行時には不要であり、削除しないとパフォーマンスに悪影響を与える可能性があることに注意してください。

MRTK には、コンポーネントへのアニメーション効果を作成するために使用する "AuthoringControllers" のサンプルが同梱されています。 ニーズに合わせて自由に複製してください。

パフォーマンス

StateVisualizer は、Animator と Unity のアニメーションを使用していますが、最適なパフォーマンスを得られるように構築されています。これは、他のコンテキストでは大規模なコストがかかる可能性があります。 これらの問題を解決するために、StateVisualizer は Animator をインテリジェントにカリングし、Animator の実行時間を積極的に最小限に抑えます。 さらに、Playables API のパフォーマンスは、AnimatorController ステート マシンよりもはるかに優れています。 AnimatorController を使用しないことで、StateVisualizer システムのシンプルさと大規模なパフォーマンスの両方に大きく貢献します。

現在、StateVisualizer は、イベント リスナーを利用して必要時にのみ反応する代わりに、Interactable の状態をポーリングします。 StateVisualizer のこの部分は現在開発中であり、パフォーマンスをさらに高めるためにイベント リスナーにリファクタリングされる可能性があります。

効果

効果 説明
AnimationEffect

AnimationEffect インスペクター ビュー
OneShot モードでは、状態がアクティブになると 1 つのアニメーションが前方に再生され、状態が非アクティブになると同じアニメーションが後方に再生されます。 PlaybackTimeMatchesValue モードでは、アニメーションの再生時間が状態の小数部の値によって直接制御されます (たとえば、Select 状態の場合は Selectedness)。
TwoWayAnimationEffect

TwoWayAnimationEffect インスペクター ビュー
AnimationEffectOneShot モードに似ていますが、"方向" ごとに 1 つずつ、2 つの別々のアニメーションを使用します。
GraphicTintEffect

GraphicTintEffect インスペクター ビュー
Graphic コンポーネント一覧の色を、特定の色にします。 この効果は、AnimationEffect と同じ PlaybackMode オプションを提供し、同様の結果をもたらします (OneShot は状態の変更時に完全な遷移を実行し、PlaybackTimeMatchesValue は遷移の進行状況を状態の小数部の値に一致させます)。

  • [Override] (オーバーライド) では、ターゲットが特定の色に設定されます。
  • [Additive] (加法) では、既存の色に加算的に色をブレンドします。
  • [Multiply] (乗算) では、新しい色を既存の色に乗算します。

    これらのブレンド操作は、StateVisualizer グラフで現在実行されている他の色合いやアニメーションの上にもブレンドされます。 Tintable の初期色が異なっていると、このティント効果が正しくブレンドされない場合があるので注意してください。 基本色が異なる要素には、個別のティント効果を使用します。
  • SpriteTintEffect

    SpriteTintEffect インスペクター ビュー
    GraphicTintEffect と同じ操作を SpriteRenderer に対して行います。
    SpriteSwapEffect

    SpriteSwapEffect インスペクター ビュー
    ターゲット Image を、現在の状態がアクティブであるか非アクティブであるかによって、ActiveSpriteInactiveSprite に設定します。 トグルに便利です。
    SetTargetsActiveEffect

    SetTargetsActiveEffect インスペクター ビュー
    状態がアクティブであるか非アクティブであるかによって、GameObject の一覧を有効または無効にします。 Invert では逆の動作になります。
    PlayableAssetEffect

    PlayableAssetEffect インスペクター ビュー
    StateVisualAsset は、再利用可能な Playable アセットを含む ScriptableObject です。 この効果により、その再生可能なアセットが StateVisualizer グラフに接続されます。 (この機能は実験的なものなので、変更される可能性があります。)

    カスタム効果

    上記のカスタム効果タイプでカバーされていないほとんどの効果は、通常 AnimationEffect として作成できます。 ただし、アニメーションベース以外の新しいカスタム効果を作成する場合は、IEffect インターフェイスを実装するか、既存の効果の 1 つをサブクラス化できます。 詳細については、IEffect API リファレンスを参照してください。

    カスタム状態

    StateVisualizer は、今後カスタム状態をサポートする予定です。 しばらくお待ちください。