聲音節點的基礎類別叫做SoundNode,它有一個陣列存放下一層子節點。多次播放同一個SoundCue並不會產生多份SoundNode來播放,所以像SoundNodeLooping這種需要額外記錄目前播放次數的情況,會把額外資料放在AudioComponent::SoundNodeData裡,它是一個位元陣列,由 AudioComponent::SoundNodeOffsetMap記錄不同SoundNode資料在該位元陣列的起始位置。為了方便寫碼,UE提供以下三個巨集:
- RETRIEVE_SOUNDNODE_PAYLOAD(size):用來宣告此SoundNode使用的資料大小。
- DECLARE_SOUNDNODE_ELEMENT(type, name):用來宣告在位元陣列裡的變數。
- DECLARE_SOUNDNODE_ELEMENT_PTR(type, name):用來宣告在位元陣列裡的指標變數。
範例
以下程式碼展示如何自訂一個切換型的聲音節點:
class MySoundNodeSwitch extends SoundNode native( Sound ) hidecategories( Object ) editinlinenew; var() int ActiveChildIndex; cpptext { virtual void ParsetNodes( UAudioDevice* AudioDevice, USoundNode* Parent, INT ChildIndex, class UAudioComponent* AudioComponent, TArray<FWaveInstance*>& WaveInstances ) { if( ChildNodes.IsValidIndex(ActiveChildIndex) && ChildNodes(ActiveChildIndex) ) { ChildNodes(ActiveChildIndex)->ParseNodes( AudioDevice, this, ActiveChildIndex, AudioComponent, WaveInstances ); } } virtual INT GetMaxChildNodes() { return -1; } virtual INT RemoveChildNodes( INT Index ) { Super::RemoveChildNodes( Index ); if(! ChildNodes.IsValidIndex(ActiveChildIndex)) { ActiveChildIndex = 0; } } virtual FString GetUniqueString() { FString Unique = FString::Printf( TEXT("Switch %d/" ), ActiveChildIndex ); return Unique; } }
沒有留言:
張貼留言