UE4 Sound Cueに自作のノードを追加する その2
前回に引き続き自作ノードを作っていきましょう。
今回から機能をつけていきます。
↓前回
前回はC++クラスを作成し、
Sound Cueにノードを出すところまでやりました。
C++を編集する
まずはソース全体を載せておきます。
SoundNodeTest.h
// Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "Sound/SoundNode.h" #include "SoundNodeTest.generated.h" UCLASS(hidecategories = Object, editinlinenew, MinimalAPI, meta = (DisplayName = "Volume")) class USoundNodeTest : public USoundNode { GENERATED_UCLASS_BODY() // float パラメータ // ボリュームの大きさ UPROPERTY(EditAnywhere, Category = Volume, meta=(ClampMin = "0.0")) float TestVolume; // bool パラメータ // ミュートかどうか UPROPERTY(EditAnywhere, Category = Volume) bool TestIsMute; virtual void ParseNodes(FAudioDevice* AudioDevice, const UPTRINT NodeWaveInstanceHash, FActiveSound& ActiveSound, const FSoundParseParameters& ParseParams, TArray<FWaveInstance*>& WaveInstances) override; #if WITH_EDITOR virtual FText GetInputPinName(int32 PinIndex) const override; #endif };
SoundNodeTest.cpp
// Fill out your copyright notice in the Description page of Project Settings. #include "Public/Sound/SoundNodeTest.h" #include "ActiveSound.h" #define LOCTEXT_NAMESPACE "SoundNodeTest" /** コンストラクタ */ USoundNodeTest::USoundNodeTest(const class FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { // パラメータの初期化 TestVolume = 1.f; TestIsMute = false; } void USoundNodeTest::ParseNodes(FAudioDevice* AudioDevice, const UPTRINT NodeWaveInstanceHash, FActiveSound& ActiveSound, const FSoundParseParameters& ParseParams, TArray<FWaveInstance*>& WaveInstances) { FSoundParseParameters UpdateParameters = ParseParams; if(TestIsMute == true) { UE_LOG(LogTemp, Log, TEXT("ミュート再生")); UpdateParameters.Volume = 0.0f; } else { UE_LOG(LogTemp, Log, TEXT("ボリューム : %f"), TestVolume); UpdateParameters.Volume = TestVolume; } Super::ParseNodes(AudioDevice, NodeWaveInstanceHash, ActiveSound, UpdateParameters, WaveInstances); } #ifdef WITH_EDITOR FText USoundNodeTest::GetInputPinName(int32 PinIndex) const { return LOCTEXT("InputPinLabel", "Input"); } #endif #undef LOCTEXT_NAMESPACE
SoundNodeTest.h から細かく見ていきます。
UCLASS(hidecategories = Object, editinlinenew, MinimalAPI, meta = (DisplayName = "Volume"))
UCLASSに引数を持たせています。
hidecategory
HideCategories | Unreal Engine
MiniMalAPI
※これだけドキュメントが見つからなかった...
簡単に説明すると" "で囲まれた文字列が、
ノードの名前になります。
前回まではC++ファイル名がそのままノードに
なっていたので、今回からVolumeという名前にしました。
次にこれですね。
GENERATED_UCLASS_BODY()
前回レガシーらしいと言いましたが、
GENERATED_BODY()
では動かなかったので、こちらにしています。
まだ違いを確認出来ていないので、
次回にでも説明できればと思います。
// float パラメータ // ボリュームの大きさ UPROPERTY(EditAnywhere, Category = Volume, meta=(ClampMin = "0.0")) float TestVolume; // bool パラメータ // ミュートかどうか UPROPERTY(EditAnywhere, Category = Volume) bool TestIsMute;
ノードに持たせるパラメータの宣言をしています。
UPROPERTYについてはこちらを参考にしてください。
主に、
・編集可能かどうか
・ノードのカテゴリは何か
・数値データの最低値はどこか
を設定しています。
virtual void ParseNodes(FAudioDevice* AudioDevice, const UPTRINT NodeWaveInstanceHash, FActiveSound& ActiveSound, const FSoundParseParameters& ParseParams, TArray<FWaveInstance*>& WaveInstances) override; #if WITH_EDITOR virtual FText GetInputPinName(int32 PinIndex) const override; #endif
関数を2つ宣言しています。
SoundNodeTest.cppも見ていきましょう。
/** コンストラクタ */ USoundNodeTest::USoundNodeTest(const class FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { // パラメータの初期化 TestVolume = 1.f; TestIsMute = false; }
コンストラクタです。
各パラメータの初期値をここで設定しています。
void USoundNodeTest::ParseNodes(FAudioDevice* AudioDevice, const UPTRINT NodeWaveInstanceHash, FActiveSound& ActiveSound, const FSoundParseParameters& ParseParams, TArray<FWaveInstance*>& WaveInstances) { FSoundParseParameters UpdateParameters = ParseParams; if(TestIsMute == true) { UE_LOG(LogTemp, Log, TEXT("ミュート再生")); UpdateParameters.Volume = 0.0f; } else { UE_LOG(LogTemp, Log, TEXT("ボリューム : %f"), TestVolume); UpdateParameters.Volume = TestVolume; } Super::ParseNodes(AudioDevice, NodeWaveInstanceHash, ActiveSound, UpdateParameters, WaveInstances); }
一つ目の関数です。
ノードが上手く繋がっていれば、ここに入ってきます。
ActiveSound.hの中にある構造体
FSoundParseParametersを変数格納し、
引数のParseParamsを代入します。
次にTestIsMuteパラメータにチェックが入っているかを確認し、
入っていればVolumeを0にします。
逆に入っていなければ、TestVolumeパラメータの値を代入します。
最後にSuper(USoundNodeクラス)のParseNodesを呼び出します。
今回更新しているのは第3引数に渡したUpdateParametersだけですね。
二つ目の関数です。
FText USoundNodeTest::GetInputPinName(int32 PinIndex) const { return LOCTEXT("InputPinLabel", "Input"); }
ノードのInput側のピンに名前をつけています。
今回はインプットピンが一つしかないので、
何の意味もありませんが、Inputという名前をつけてみました。
Inputピンに名前つけれた。
— MozPaca (@MozPaca398) 2017年10月17日
Inputが1つならほぼ無意味だけど... pic.twitter.com/Qun6lUaogy
ひとまずC++はこんなところです。
ビルドをしてUE4エディタを立ち上げましょう。
Waveファイルをインポートする
特に意味はありませんが、Waveファイルを
格納するためのフォルダを作成しましょう。
コンテンツブラウザから右クリック
New Folderを選択します。
名前はこんな感じにしました。
作成したフォルダの中に
Waveファイルをインポートします。
※魔王魂からダウンロードしました。
Sound Cueを編集する
前回作成した「Cue_Test」ファイルを
ダブルクリックで開きます。
エディタにインポートしたWaveファイルを
ドラッグアンドドロップで持って行きます。
インポートしたWaveファイルをパラメータとして持つ
Wave Playerノードが出ました。
次に自作ノードのVolumeを出します。
そしてこのように繋げましょう。
完成しました。
確認してみる
Volumeのパラメータを変更しながら、
再生してみましょう。
Volumeが0になるとサウンドがストップするので、
そこだけ注意してください。