概要
- WindowsパソコンにPS5コントローラーを接続して振動させる方法を解説します。
UnrealEditor、パッケージ化したゲームの両方で振動可能です。
(1)iniファイルの設定
- 「UnrealEngineProject → Configフォルダ → DefaultEngine.ini → [/Script/CriWareRuntime.CriWarePluginSettings] → Hardware4」に「DualSense Wireless Controller」と記述します。
(2)UnrealEditor 上での設定
「Windows上でのPS5コントローラー振動実装における仕様と注意」に同意する
- まず下記「Windows上でのPS5コントローラー振動実装における仕様と注意」をご確認ください。
- (1)PS5コントローラー接続時のデバイス名に「DualSense Wireless Controller」という文字列が含まれていることを前提としています。
- (2)CRIプラグイン初期化時点で既にPS5コントローラーが接続済みとなっていることを前提としています。
- (3)本マニュアル通りの実装を行い、1または2の条件を満たさずにゲームを起動した場合、CRIプラグイン初期化時点でE2023120400エラーおよびW2017060605警告が発生し、ゲームを再起動しない限りPS5コントローラーが振動することはありません。
- (4)本マニュアルはPS5コントローラーが1個のみ接続されているシチュエーションを前提としています。
- (5)コントローラーを抜き差しした場合、内部で自動復旧が発生しコントローラーが再び振動するようになります。(ただし復旧までに10秒程度の時間がかかります)
- 上記のうち(1)~(4)への対策については弊社テクニカルサポートサイトからお問い合わせください。
- UnrealEditor を起動し「プロジェクト設定 → CriWare → Atom → 詳細設定 → I understand about 'DualSense on Windows Implementation' and accept it」チェックボックスにチェックを入れてください。
AsrRackConfig設定
- 1. UnrealEditor を起動し「プロジェクト設定 → CriWare → Atom → AsrRackConfig」のアレイを一つ追加する。
- 2. SoundRendererType を VibrationHardware に設定する。
- 3. このとき「Element ID」をメモしておく。
- 4. もしAtomCraft側で振動トラックを設定するアプローチの場合は「Use Output Port」にチェックを入れる。
OutputPort DataTable アセットの作成と設定(必要に応じて)
- AtomCraft側で振動トラックを設定するアプローチの場合は OutputPort DataTable アセットの作成と設定が必要です。
- 1. UnrealEditor を起動し 「コンテンツブラウザ上の何もない場所を右クリック → Miscellaneous → Data Table」をクリックする。
- 2. 「AtomOutputPortDataTable」を選択して「OK」を押す。(DataTableアセットが作成される)
- 3. 作成されたDataTableアセットを開き「Add」ボタンを押す。
- 4. 「Output Port Name」に「AtomCraft側で作成した振動出力ポートの名前」を入力し、「Asr Rack Id」に「先ほどメモした Element ID」を入力する。
- 5. 「プロジェクト設定 → CriWare → Atom → Atom OutputPort Data Table」に先ほどの DataTable アセットを設定する。
UnrealEditor 上での設定が完了したら
- UnrealEditor 上での設定が完了したら UnrealEditor を再起動します。
(3)ランタイム側の処理
AtomCraft側で振動トラックを設定するアプローチの場合
- 特別な処理を行う必要はありません。
単純にキューを再生すれば振動トラックの波形がPS5コントローラーに振動として送られます。
ランタイム側で振動を設定するアプローチの場合
初期化処理
- 大まかな流れは次の通りです。
- 1. 振動用出力ポートを作成する。
- 2. 振動用出力ポートと振動用AsrRackID(Element ID)を紐づける。
- 実装例(UEngineSubsystem上で実装)
- PS5Manager.h
#pragma once
#include "CoreMinimal.h"
#include "Subsystems/EngineSubsystem.h"
#include "CriWareApi.h"
#include "PS5Manager.generated.h"
class UAtomOutputPortHandle;
UCLASS()
class CRIUE4SAMPLE_API UPS5Manager : public UEngineSubsystem
{
GENERATED_BODY()
public:
UPS5Manager();
virtual void Initialize(FSubsystemCollectionBase& Collection) override;
virtual void Deinitialize() override;
UFUNCTION(BlueprintCallable, Category="PS5Manager")
UAtomOutputPortHandle* GetVibOutputPortHandle();
private:
CriAtomExOutputPortHn OutputPortHn;
};
- PS5Manager.cpp
#include "Common/PS5Manager.h"
#include "CriWareApi.h"
#include "AtomOutputPort.h"
UPS5Manager::UPS5Manager()
: UEngineSubsystem()
, OutputPortHn(NULL)
{
}
void UPS5Manager::Initialize(FSubsystemCollectionBase& Collection)
{
if (FCriWareApi::criAtomEx_IsInitialized() != CRI_TRUE) {
UE_LOG(LogTemp, Error, TEXT("CRI Plugin is not initialized. Please initialize CRI Plugin before PS5Manager initialization."));
return;
}
CriAtomExOutputPortConfig Config;
criAtomExOutputPort_SetDefaultConfig(&Config, "Vib_by_Runtime");
Config.type = CRIATOMEX_OUTPUT_PORT_TYPE_VIBRATION;
OutputPortHn = FCriWareApi::criAtomExOutputPort_Create(&Config, NULL, 0);
if (OutputPortHn == NULL) {
UE_LOG(LogTemp, Error, TEXT("Failed to create OutputPort handle."));
return;
}
const CriAtomExAsrRackId Element_ID_for_vib = static_cast<CriAtomExAsrRackId>(1);
FCriWareApi::criAtomExOutputPort_SetAsrRackId(OutputPortHn, Element_ID_for_vib);
}
void UPS5Manager::Deinitialize()
{
if (FCriWareApi::criAtomEx_IsInitialized() != CRI_TRUE) {
return;
}
if (OutputPortHn == NULL) {
return;
}
FCriWareApi::criAtomExOutputPort_Destroy(OutputPortHn);
OutputPortHn = NULL;
}
UAtomOutputPortHandle* UPS5Manager::GetVibOutputPortHandle()
{
UAtomOutputPortHandle* Handle_BP = NewObject<UAtomOutputPortHandle>();
if (IsValid(Handle_BP)) {
Handle_BP->SetHandle(OutputPortHn);
}
return Handle_BP;
}
再生処理
C++
- UAtomComponent::AddOutputPortByHandle 関数を実行してから UAtomComponent::Play 関数を実行します。
プレイしたキューの全ての波形がPS5コントローラーに振動として送られます。
#include "AtomComponent.h"
#include "AtomOutputPort.h"
void SampleFunction(UAtomComponent * AtomComp, UAtomOutputPortHandle * OutputPortHandle)
{
AtomComp->AddOutputPortByHandle(OutputPortHandle);
AtomComp->Play();
}
- 先述のUPS5Managerサンプルを使用している場合は次のようにします。
#include "AtomComponent.h"
#include "AtomOutputPort.h"
void SampleFunction(UAtomComponent * AtomComp)
{
UPS5Manager* MySubsystem = GEngine->GetEngineSubsystem<UPS5Manager>();
AtomComp->AddOutputPortByHandle(MySubsystem->GetVibOutputPortHandle());
AtomComp->Play();
}
BP
- AtomComponentの「Add Output Port by Handle」ノードを実行してからPlayノードを実行します。
プレイしたキューの全ての波形がPS5コントローラーに振動として送られます。
- 先述のUPS5Managerサンプルを使用している場合は次のようにします。