メインコンテンツまでスキップ

SoundTrace SDK for Unity

SoundTrace Unity SDK は、Unity のメッシュ、Renderer のマテリアルスロット、音源、リスナーを STCoreV2 に接続するリアルタイム空間オーディオプラグインです。

このページは、現在の Unity SDK の公開コンポーネントと Inspector の仕様に基づいています。

要件とプラットフォーム

項目現在のパッケージ基準
Unity2022.3 LTS 以降
バンドル済みネイティブプラグインmacOS、Windows x64、iOS、Android
Linux現在のパッケージにはバイナリがないため、Linux ホストで別途ビルドが必要
Unity WebGL未対応。Unity WebGL では OnAudioFilterRead ベースの DSP 処理を使用できません

Use GPU Backend は、reflection と reverb propagation に WebGPU compute provider を 要求します。diffraction は CPU で計算します。実際に有効になるかどうかはネイティブ プラグインとデバイスによって決まり、GPU の初期化に失敗した場合は CPU propagation を使用します。

インストール

SoundTrace Unity SDK パッケージとインストール手順は、契約済みの評価・ライセンス 配布チャネルから提供されます。受領した配布物に含まれる手順に従ってください。

サンプルは Package Manager で SoundTrace SDK を選択し、Samples > Demo Assets > Import から インポートします。

Unity Audio 設定

  1. Edit > Project Settings > Audio を開きます。
  2. Default Speaker ModeStereo に設定します。
  3. DSP Buffer SizeBest latency に設定します。

Unity Audio 設定

この設定が異なる場合、Manager と Listener の Inspector に警告が表示されます。

Audio Asset Import 設定

モノラルのサウンドソースの使用を前提とし、オーディオクリップは PCM フォーマットに設定します。

Audio Asset Import 設定

最短セットアップ

  1. 空の GameObject に SoundTraceManager を追加します。
  2. Main Camera に SoundTraceListener を追加します。
  3. 音源 GameObject に SoundTraceSource を追加し、同じ GameObject の AudioSource に clip を設定します。
  4. 音響 geometry として使用する Mesh GameObject に SoundTraceObject を追加します。
  5. 必要に応じて、Manager と同じ GameObject に SoundTracePathVisualizer を追加します。
  6. Play Mode で Console エラー、音声、path を確認します。

同時にロードされている scene 全体で、有効な Manager と Path Visualizer はそれぞれ 1 つだけ 使用できます。複数の Listener を登録できますが、Source のレンダリングには最初に登録された PrimaryListener が使用されます。

コンポーネント概要

コンポーネント役割必須依存関係
SoundTraceManagerランタイム、scene、マテリアル登録、propagation backend の管理ランタイムごとに 1 つ
SoundTraceListenerListener transform、ray 品質、出力/HRTF 設定有効な Manager
SoundTraceSourceAudioSource 出力の空間化、path ごとの設定同じ GameObject の AudioSource、有効な Listener
SoundTraceObjectMesh と submesh のマテリアルを音響 scene に登録MeshFilterMeshRenderer
SoundTracePathVisualizer有効な path と hit triangle のデバッグ表示Manager と同じ GameObject

SoundTraceManager

SoundTraceManager Inspector

Inspector

フィールドデフォルト値動作
bool propagateOnStarttrueStart() で初期 scene graph と transform を同期した後、最初の propagation を要求します。
bool loadDefaultMaterialsOnEnabletrueOnEnable() でバンドル済み Material Preset Library をネイティブ material table に登録します。
int propagationThreadCount-1サウンドエンジン内部の propagation job 実行スレッド数を指定します。ネイティブで -1std::thread::hardware_concurrency() が返す論理スレッド数を基準に自動設定され、01 はシングルスレッドで動作します。2 以上は呼び出しスレッドを含め、指定した数を使用します。
bool useGpuBackendfalsepropagation を job マルチスレッドではなく GPU compute shader で計算します。
int pathCacheSize256生成される path の cache buffer size で、最小値は 0、最大値は 1024 です。値を大きくすると空間オーディオの効果が向上しますが、計算量も増加します。デバイス性能に応じて、デフォルト値の 256 より低い値から始めることを推奨します。

公開プロパティ

プロパティ型 / アクセス正確な意味
Instancestatic SoundTraceManager / get; private set;同時にロードされているすべての scene で使用するシングルトン Manager です。有効な Manager がない場合は null です。
DefaultMaterialsLoadedint / get; private set;OnEnable() で自動登録されたバンドル済みマテリアル数です。自動ロードが無効、または asset がない場合は 0 です。
SceneSoundScene / get; private set;Manager が所有する低レベル scene です。無効状態、または初期化失敗後は null です。
PrimaryListenerSoundTraceListener / getSource のレンダリングに使用される、最初に登録された Listener です。登録済み Listener がなければ null です。
ListenerCountint / getManager に現在登録されている Listener の数です。
SourceCountint / getManager に現在登録されている Source の数です。
ObjectCountint / getManager に現在登録されている Object の数です。
LastValidPathCountint / get; private set;最後に完了した propagation 結果の有効 path 数です。propagation を実行できない場合は 0 です。
LastNativeErrorstring / get; private set;直近の scene graph または propagation エラーです。エラーがない場合は空文字列です。
PropagationThreadCountint / getpropagation job の実行スレッド数です。-1 は最大値を意味します。
IsGpuPropagatebool / get; private set;exaPropagatorInitGpu() が成功し、GPU propagation provider が有効になったかを表します。
GpuBackendStatusstring / get; private set;GPU Backend の初期化結果です:GPU active または CPU fallback (<ExaResult>): <error>
PathCacheSizeint / get生成される path の cache buffer size です。

公開メソッド

メソッド動作
public void ResetMotionState()teleport、respawn、scene 遷移の直後に、登録済みのすべての Listener と Source の motion history を初期化します。

SoundTraceListener

SoundTraceListener Inspector

通常は Main Camera に追加します。

Inspector

フィールドデフォルト値範囲/選択肢
Quality PresetFastCustom, Fast, Middle, Quality
Ray Resolution161..32。水平/垂直に同じ値を適用
Ray Depth41..16
Output ModeHeadsetHeadset, Speaker
HRTFHRIR Interpolated以下の 3 モード

FastMiddleQuality を選択すると、ray 値と関連する render 品質値がまとめて 適用され、Inspector の ray フィールドは無効になります。値を直接編集するには、先に Custom を選択してください。プリセットから Custom に戻すと、最後に適用された値が保持されます。

プリセットRay ResolutionRay Depth推奨開始点
Custom保存された値保存された値手動チューニング
Fast164モバイル、多数の音源
Middle248一般的なゲームとデスクトップ
Quality3212音響の比重が大きく、その他の処理負荷が小さいアプリ

HRTF と出力モード

モード必要な asset説明
Band8なし外部 HRTF table を読み込まない軽量モード
HrirKU100_convolution.bytesHRIR モード
HRIR InterpolatedKU100_convolution.bytesHRIR モードに補間計算を適用し、方向感を向上させます。

Asset は Runtime/Resources/SoundTrace/HRTF/ から読み込まれます。必要な asset が存在しない、 または空の場合、Listener の初期化は失敗し、別のモードへ自動的に切り替わることはありません。

SoundTraceSource

SoundTraceSource Inspector

SoundTraceSource は、同じ GameObject の AudioSource 出力を処理します。有効化時に、 SoundTrace が空間化と Doppler を担当するように AudioSource.spatialBlendAudioSource.dopplerLevel0 に設定します。

Inspector

フィールドデフォルト値動作
Intensity1Source の放射強度です。範囲は 0..10 です。
Ray Resolution24Reverb ray の水平・垂直解像度に同じ値を適用します。範囲は 1..32 です。
Reverb Ray Depth4Reverb ray の最大反射深度です。範囲は 1..16 です。
Enable DirecttrueDirect path を有効にします。
Enable ReflectiontrueReflection path を有効にします。
Enable DiffractiontrueDiffraction path を有効にします。
Enable ReverbtrueReverb path を有効にします。
Enable TransmissiontrueTransmission path を有効にします。
Direct Attenuation1.0Direct path の距離減衰です。値が大きいほど、同じ距離で音が小さく聞こえます。範囲は 0.5..1.5 です。
Reflection Attenuation1.0Reflection path の距離減衰です。値が大きいほど、同じ距離で音が小さく聞こえます。範囲は 0.5..1.5 です。
Diffraction Attenuation1.0Diffraction path の距離減衰です。値が大きいほど、同じ距離で音が小さく聞こえます。範囲は 0.5..1.5 です。
Reverb Attenuation1.0Reverb path の距離減衰です。値が大きいほど、同じ距離で音が小さく聞こえます。範囲は 0.5..1.5 です。
Transmission Attenuation1.0Transmission path の距離減衰です。値が大きいほど、同じ距離で音が小さく聞こえます。範囲は 0.5..1.5 です。
Max Delay Seconds1.0 sSource renderer が保持する propagation delay の最大値です。長くするほどメモリ使用量が増加します。範囲は 0.01..5 s です。
Path Fade Time Seconds0.066 sPath が renderer に入る、または消える際の fade 時間です。範囲は 0.001..0.5 s です。
Path Hold Time Seconds0.120 s消えた non-direct path が fade を開始するまで保持する時間です。0 は hold を無効にします。
Max Delay Rate0.1sample ごとに許可する delay 変化量の上限です。範囲は 0.001..0.999 です。
BypassfalseSoundTrace spatial rendering をスキップし、元の AudioSource 出力をそのまま渡します。

Distance Attenuation の値が大きいほど、該当 path の距離減衰が速くなります。Show Gizmo は Direct、Reflection、Diffraction、Reverb、Transmission ごとの到達範囲を Scene View に 個別表示します。

Render Tuning は source-listener の組に適用されます。Path Hold = 0 は hold を無効にします。

公開メソッド

メソッド動作
SetBypass(bool enabled)true の場合は SoundTrace spatial rendering をスキップし、元の AudioSource 出力をそのまま渡します。false の場合は SoundTrace rendering を再び適用します。
ResetMotionState()現在の Transform を motion の基準点として再設定し、速度を 0 として反映することで、teleport や respawn 後の Doppler spike を防ぎます。

複数の AudioSource の再生タイミングを合わせる場合は、同じ AudioSettings.dspTime を基準に PlayScheduled() を呼び出してください。

SoundTraceObject

SoundTraceObject Inspector

SoundTraceObject は、MeshFilter.sharedMesh と Renderer の submesh マテリアルスロットを登録します。 Build でメッシュデータを読み取る必要があるため、Import Settings の Read/Write Enabled を有効にしてください。

Geometry と BVH

Scene View に表示した BVH

フィールドデフォルト値説明
BVH TypeLBVH_SIMD8HKDTree, LBVH, LBVH_SIMD4, LBVH_SIMD8, LBVH_SIMD16
BVH Max Depth121..32
Primitives Per Leaf161..128
Update ModeStaticStatic, Dynamic, Refit, Rebuild

BVH Type

BVH Type説明
HKDTreeKD 分割ベースの traversal です。Refit に対応していますが、Refit 後は BVH-style fallback traversal に切り替わります。GPU backend には対応していません。
LBVHMorton code ベースで、HKDTree より rebuild が速く、Refit に対応しています。低レベル API で vertex をアップロードしてから Refit することで、SkinnedMesh や procedural mesh の変形に適用できます。scalar 形式は GPU backend に対応していません。
LBVH_SIMD4LBVH leaf intersection を 4 個単位の SIMD batch で並列処理します。Refit 対応および GPU Backend 対応。
LBVH_SIMD8LBVH leaf intersection を 8 個単位の SIMD batch で並列処理する現在のデフォルト値です。Refit 対応および GPU Backend 対応。
LBVH_SIMD16LBVH leaf intersection を 16 個単位の SIMD batch で並列処理します。Refit 対応および GPU Backend 対応。

GPU を要求した scene で HKDTree または scalar LBVH を選択すると、Inspector に警告が表示されます。

Update Mode

Update ModeSTCoreV2 update policy意味
StaticEXA_OBJECT_UPDATE_STATIC (0)実行時の TLAS/BLAS 更新を行いません。動かない level geometry に使用します。
RefitEXA_OBJECT_UPDATE_REFIT (1)Deformation 用のポリシーです。mesh BLAS を refit し、TLAS bounds を更新します。topology が変わらない skinned・procedural mesh が対象です。
RebuildEXA_OBJECT_UPDATE_REBUILD (2)Topology が変わる geometry に使用し、BVH を再ビルドします。
DynamicEXA_OBJECT_UPDATE_DYNAMIC (3)Transform のみ変化する場合に TLAS instance だけを更新します。

Refit と vertex アップロード

Refit は STCoreV2 における vertex 変形(skinned animation)のための update policy です。 ただし core は vertex をいつアップロードするかを自分では決めません。mesh の更新は exaMeshUpdateVerticesexaMeshRefit の 2-call protocol であり、object の Refit は その結果を BLAS と TLAS bounds に反映させるためのポリシースイッチです。つまり vertex をアップロードするのは host SDK 側です。

現在 Unity の SoundTraceObject MonoBehaviour は Transform だけを自動同期し、vertex の アップロードは呼び出しません。MeshFilter/MeshRenderer を要求するため SkinnedMeshRenderer を直接バインドせず、mesh geometry は OnEnable 時に一度だけ スナップショットされます。したがって Unity で skinned・procedural の変形を音に反映するには、 Update ModeRefit にしたうえで、以下のように MeshCore から vertex を自分で アップロードしてください。UE プラグインの SoundTracingObjectComponent は、この アップロードを skeletal mesh に対して自動的に実行します。

using Exarion.SoundTrace;
using Exarion.SoundTrace.Core;
using Exarion.SoundTrace.Native;
using UnityEngine;

[RequireComponent(typeof(SoundTraceObject))]
public sealed class SoundTraceSkinnedRefit : MonoBehaviour
{
[SerializeField] private SkinnedMeshRenderer skin;

private SoundTraceObject _object;
private Mesh _baked;
private ExaVec3f[] _vertices;

private void Awake()
{
_object = GetComponent<SoundTraceObject>();
_baked = new Mesh();
}

private void LateUpdate()
{
SoundMeshCore mesh = _object.MeshCore;
if (mesh == null || !mesh.IsValid)
return;

// 1) 現在の pose を bake して vertex を読み取ります。Unity Mesh API なので main thread です。
skin.BakeMesh(_baked);
Vector3[] baked = _baked.vertices;
if (_vertices == null || _vertices.Length != baked.Length)
_vertices = new ExaVec3f[baked.Length];
for (int i = 0; i < baked.Length; ++i)
_vertices[i] = new ExaVec3f(baked[i].x, baked[i].y, baked[i].z);

// 2) アップロードと refit は control thread で 2-call protocol として実行します。
ExaVec3f[] vertices = _vertices;
SoundTraceControlThread.Invoke(() =>
{
if (mesh.UpdateVertices(vertices))
mesh.Refit();
});
}

private void OnDestroy()
{
if (_baked != null)
Destroy(_baked);
}
}

注意点です。

  • vertex 数は build 時と 完全に一致している必要があります。exaMeshUpdateVertices は 不一致を EXA_ERR_INVALID_ARG として拒否します。MeshFilter.sharedMeshSkinnedMeshRenderer の bind pose mesh を設定して数を合わせてください。
  • vertex は mesh local 座標系のままアップロードします。object の position・rotation・scale は SoundTraceObject が別途同期するため、BakeMesh も scale を適用しない形で使用してください。
  • native mesh は SoundTraceMeshCache が Mesh asset・material slot・BVH 設定をキーとして refcount 共有します。同じ組み合わせを使う object が複数ある場合、1 つを refit すると すべてが同じ変形を受けます。個別に変形させたい場合は object ごとに別の Mesh instance を 使用してください。
  • SoundTraceControlThread.Invoke は blocking 呼び出しです。毎フレーム多数の object に対して 呼び出すと、main thread が control thread の propagation frame の後ろで待機します。refit 対象は少数の object に限定してください。
  • BVH Type は refit 可能な LBVH 系を使用してください。HKDTree も refit されますが、その後 traversal が BVH-style fallback に切り替わります。
  • triangle index が変わる topology 変更は refit では扱えません。MeshCore.SetData(...) で 再ビルドし、Update ModeRebuild にしてください。

公開メソッド

Auto Set は Renderer material の名前をバンドル済み preset と照合します。Imported model の root に mesh がなく、child が geometry を所有している場合は Add To Child Meshes を使用してください。

メソッド動作
AutoSetMaterialSlots()すべての submesh を走査し、Renderer material 名をバンドル済み preset と自動照合してスロット構成を更新します。
GetMaterialPresetIndex(int slotIndex)指定したスロットの preset index を返します。スロットがない場合、または index が無効な場合は 0 を返します。
GetPresetName(int slotIndex)指定したスロットに適用された preset の表示名を返します。preset が見つからない場合は Concrete を返します。
SetMaterialPresetIndex(int slotIndex, int presetIndex)1 つのスロットの preset を変更します。presetIndex は最小 0 に補正され、スロット index が無効な場合は false を返します。
SetMaterialPresetForAllSlots(int presetIndex)すべてのスロットに同じ preset を適用します。presetIndex は最小 0 に補正され、適用するスロットがない場合は false を返します。
GetNativeMaterialIndices()submesh ごとの preset index を native mesh 登録用の配列形式で返します。空または不足しているスロットには 0 を使用します。
GetTriangleCount()すべての submesh の index 数を合計し、triangle 数を返します。mesh がない場合は 0 です。
static IsGpuCompatibleBvhType(BvhType value)LBVH_SIMD4LBVH_SIMD8LBVH_SIMD16 の場合に true を返します。

サウンドマテリアルと Transmission

デフォルトの authoring asset は Runtime/Resources/SoundTrace/SoundTraceMaterialPresetLibrary.asset です。 SoundTrace > Material Preset Library では、次の操作を実行できます。

  • preset の追加、削除、並べ替え
  • soundMaterial.json の import/export、およびバンドル JSON の再インポート
  • Scattering と 8-band Reflection、Absorption、Transmission グラフの編集
  • Transmission Model の選択

Material Preset Library

周波数帯域の中心は 67.51252505001000200040008000 Hz です。マテリアルの順序と table index は一致させる必要があります。

帯域別のマテリアルグラフ編集

Transmission Model

モデル入力Geometry の条件
Surface各帯域で表面を通過した後に残る伝送エネルギー係数 0..1開いた面と薄い surface で使用可能
Solid Distance各帯域で伝送エネルギーが -30 dB になるマテリアル基準距離 (m)、0 以上閉じたボリュームと一貫した面の向きが必要

Solid Distance の入力は object の実際の厚さではありません。ランタイムは geometry 内部の実際の 通過距離に応じて減衰を適用します。モードを変更しても 8 個の値は自動計算されないため、 検証済みの値をすべて入力し、デフォルトの 0 のままにしないでください。

JSON に transmissionDistanceToMinus30DbMeters が存在しない場合は Surface、有限かつ 0 以上の値が正確に 8 個存在する場合は Solid Distance です。Surface として export する場合、 このフィールドは null や空配列ではなく省略されます。

SoundTracePathVisualizer

SoundTracePathVisualizer Inspector

Manager と同じ GameObject に 1 つだけ追加します。

Inspector フィールドデフォルト値説明
Enable Path Visualizationオンpath mesh を表示するかどうか
Refresh Interval Ms50可視化 mesh を再生成する最小間隔。音響 propagation の周期には影響しません
Max Visualized Paths1024表示する path の最大数
Path Width0.08線幅
Path Alpha Intensity0.5表示強度
Draw Hit TrianglesオフScene View に hit triangle を表示

Direct、Reflection、Diffraction、Reverb、Transmission を path 種別ごとの色で表示します。 このコンポーネントはデバッグ用です。性能測定時と release build では無効にしてください。

主要な公開メンバーは Instance、設定/カウントプロパティ、Render()Clear() です。

サンプル

ST_SampleScene01

ST_SampleScene01

基本的な room、source、listener、geometry、material preset、path visualization を確認します。

ST_SampleScene02

ST_SampleScene02

source/listener の移動、material preset の変更、Unity の元の audio と SoundTrace 出力の比較を 確認します。

ST_SampleScene03

ST_SampleScene03

広い空間の複数 source、wall occlusion、移動中の HRTF 方向感と room response を確認します。

トラブルシューティング

症状確認事項
音が出ないConsole の最初の Manager 初期化エラー、Stereo/Best latency、AudioSource clip、Manager/Listener の有無
Source/Listener/Object が Manager を要求するcascade エラーより先に記録された Failed to initialize SoundTraceManager の原因を確認
HRTF の初期化に失敗する選択したモードの Resources asset が存在するか、空ファイルではないかを確認
Geometry が反映されないRead/Write Enabled、MeshFilter/MeshRenderer、child mesh の位置、登録状態
実行中に変形した mesh が反映されないUpdate Mode だけでは vertex/topology はアップロードされません。別途、低レベルの geometry 更新経路が必要です
GPU が有効にならないGpuBackendStatus、Console に表示された fallback の理由、Object で SIMD BVH が選択されているかを確認
Teleport 後に pitch が跳ねるtransform の変更直後に ResetMotionState() を呼び出す
性能が不足するQuality → Middle → Fast の順で変更し、path cache buffer を減らしてから path visualizer を無効化して確認
複数の音源が comb filtering のように聞こえる同じ AudioSettings.dspTimePlayScheduled() を実行

次のドキュメント