UE4初心者が頑張ってるブログ

Unreal Engine4を使用した開発メモ、及びそれに関連することについて不定期に書いています。

UE4 Sound Cueに自作のノードを追加する その2

前回に引き続き自作ノードを作っていきましょう。

今回から機能をつけていきます。

 

↓前回

mozpaca.hatenablog.com

 

前回は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

 

editinlinenew

EditInlineNew | Unreal Engine

 

MiniMalAPI

MinimalAPI | Unreal Engine

 

meta = (DisplayName = "Volume")

※これだけドキュメントが見つからなかった...
簡単に説明すると" "で囲まれた文字列が、

ノードの名前になります。

 

前回までは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についてはこちらを参考にしてください。

UPROPERTY - Epic Wiki

 

主に、

・編集可能かどうか

・ノードのカテゴリは何か

・数値データの最低値はどこか

を設定しています。 

 

    
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という名前をつけてみました。

 

 

ひとまずC++はこんなところです。

 

ビルドをしてUE4エディタを立ち上げましょう。

 

Waveファイルをインポートする

特に意味はありませんが、Waveファイルを

格納するためのフォルダを作成しましょう。

 

コンテンツブラウザから右クリック

New Folderを選択します。

f:id:MozPaca:20171017181908j:plain

 

名前はこんな感じにしました。

f:id:MozPaca:20171017181920j:plain

 

作成したフォルダの中に

Waveファイルをインポートします。

f:id:MozPaca:20171017181941j:plain

※魔王魂からダウンロードしました。

 

Sound Cueを編集する

前回作成した「Cue_Test」ファイルを

ダブルクリックで開きます。

f:id:MozPaca:20171017182237j:plain

 

エディタにインポートしたWaveファイルを

ドラッグアンドドロップで持って行きます。

f:id:MozPaca:20171017182316j:plain

 

インポートしたWaveファイルをパラメータとして持つ

Wave Playerノードが出ました。

f:id:MozPaca:20171017182500j:plain

 

次に自作ノードのVolumeを出します。

f:id:MozPaca:20171017183144j:plain

 

そしてこのように繋げましょう。

f:id:MozPaca:20171017183217j:plain

 

完成しました。

 

確認してみる

Volumeのパラメータを変更しながら、

再生してみましょう。

f:id:MozPaca:20171017183350j:plain

 

Volumeが0になるとサウンドがストップするので、

そこだけ注意してください。

 

www.youtube.com