要約Windows環境でコントローラーが暴走するのはデバイスマネージャー上の物理デバイスまたは論理デバイスが増えたり減ったりした瞬間に起こる。
プレイ中にデバイスが増えたり減ったりしないように物理デバイスと論理デバイスを整理しよう。
経緯パッチ3.0蒼天のイシュガルドぐらいのころから、コントローラーが数秒動かなくなるという報告をする人がちらほら現れました。プレイヤーの古い日記やフォーラムを検索してみると2015年頃からそのような報告が見つかることがわかります。当時の最終的な結論としては
Microsoft Device Association Root Enumeratorを無効化するというものでした。
しかしながら2019年頃から
Microsoft Device Association Root Enumeratorを無効化してもコントローラーが暴走するという事象がみられるようになってきました。この新しい問題に対する対処方法が広く周知されることがないまま現在に至っているように思われましたので、ここに情報を網羅的にまとめていきたいと思います。
※パッチ6.1で「暴走する(直前の入力が繰り返される)」から「動かせなくなる」に症状が変わりました原因原因はWindows版FF14クライアントのバグです。この問題はPS4,PS5版やFF14以外のゲームでは発生しません。もしPS4,PS5版やどんなゲームでも問題が起こるという方は今回の解決策の対象ではありません。
Windows版FF14クライアントはゲームの起動中に新しいコントローラーが接続された場合にすぐ使えるように、デバイスの増減を監視しています。この処理に問題がありコントローラー以外のデバイスが増減した場合にも、コントローラーが増えたときと同じように初期化処理を行うため、その初期化処理の間はコントローラーが使えなくなるという仕組みです。
上記のような理由のため、根本的な解決のためには開発サイドでデバイス処理部分の実装を変更する必要があります。しかしおよそ6年の間修正ができていないことを考えると、開発サイドでの修正を待っているわけにはいきません。
対策原因がわかれば対策がわかってきます。まずはゲーム中に増減するデバイスを見つけることから始めましょう。
1.デバイスを見つけるまずはこちらの記事をご覧ください
https://jp.finalfantasyxiv.com/lodestone/character/27844312/blog/4483208/こちらの記事を参考に少し改良したものを以下に掲載します。
スクリプトはこちら
手順1.スクリプトをコピーしてメモ帳に貼り付け、ファイル名を
script.ps1として保存します。その際に拡張子が.txtではなく.ps1となるように気をつけます
2.
script.ps1を右クリックして
PowerShell で実行を選びます
3.起動したWindows PowerShellのウィンドウをそのままにして、通常通りゲームをプレイします
4.コントローラーに不具合が起こったらWindows PowerShellのウィンドウを確認します
これで問題となるデバイス名とデバイスIDがわかります。
デバイスの見分け方Windowsでデバイスマネージャーを開き、
表示(V)→
非表示のデバイスの表示(W)を選びます
これですべてのデバイスが表示されますので、デバイス名を参考に該当のデバイスを探します。
該当のデバイスが見つかったら、同じデバイス名のものが複数ある場合に備えてデバイスIDを確認します。
該当のデバイスを右クリック→
プロパティ→
詳細→
デバイス インスタンス パスを確認します
2.デバイス別の対処プリンタ スキャナ オーディオプレーヤー テレビ ビデオレコーダー ルーター NAS等DLNAという家庭内LANを使って画像や動画を共有する仕組みが有効になっている場合にこれらのデバイスが表示されることがあります。
これは
Microsoft Device Association Root Enumeratorを無効化するとDLNAでのデバイス検出をしなくなるため、これが解決策となります。
マウス キーボード コントローラ オーディオデバイス 通信デバイス USBデバイス等そのデバイスが自動的に節電モード等になった際にPCとの接続が切れたりつながったりしています。使用しないデバイスは取り外す・電源を切る等してPCにデバイスの増減として認識されないようにしましょう。
XvdXVDボリュームとはXbox One互換の仮想ディスクです。この機能は
Microsoft Gaming Servicesによって使われています。そのため
Microsoft Gaming ServicesをアンインストールすることでXVDボリュームがデバイス増減の原因とならないようにすることができます。ただし
Microsoft Gaming ServicesをアンインストールするとMicrosoft Storeから購入したゲームやXbox関連アプリの起動ができなくなります。
アンインストールにはMicrosoft公式で説明されている方法を使用します
https://support.xbox.com/ja-JP/help/games-apps/troubleshooting/troubleshoot-games-windows-101.タスク バーの[検索] アイコンを選択し、「powershell」と入力し、[Windows PowerShell] を右クリックして、[管理者として実行] を選択します。
2.Windows PowerShell で、次のコマンドを入力して Enter キーを押します:
get-appxpackage Microsoft.GamingServices | remove-AppxPackage -allusersWindowsの設定→アプリと機能 から
ゲーム サービスというアプリが消えることでアンインストールされたことがわかります。
なおMicrosoft Storeから購入したゲームをプレイしたい等の理由でアンインストールが難しい場合、サービスを停止することでも似たような状況にすることができます。ただし停止したサービスがその後自動的に起動する場合があるため、サービスが自動的に起動していないか定期的に確認する必要があります。
1.Windows 管理ツール→サービス を開く
2.2つある
GamingServicesを両方右クリックで停止する
サービスが自動的に起動しないようにするには、プログラムを格納しているフォルダ名を変更します。サービスを起動したいときは元に戻しましょう。
変更前:C:\Program Files\WindowsApps\Microsoft.GamingServices_3.58.14001.0_x64__8wekyb3d8bbwe
変更後:C:\Program Files\WindowsApps\Microsoft.GamingServices_3.58.14001.0_x64__8wekyb3d8bbwe_退避
Microsoft Gaming Servicesが自動更新されると新たなバージョン名でフォルダが作成されるため、自動更新の度にこの退避処理がうまくいっているか確認する必要があります。
汎用ボリューム シャドウ コピーWindowsの復元ポイントを表す仮想デバイスです。標準では1週間に1回Windowsの自動メンテナンスで作成されます。復元ポイントを無効にすることは万が一の不具合の際に元に戻す方法がなくなることになるので推奨されません。自動メンテナンスの時刻をゲームプレイ時刻からずらすことで回避可能です。
1.
コントロールパネル→
システムとセキュリティ→
セキュリティとメンテナンスを開く
2.
メンテナンス(M)→
自動メンテナンス→
メンテナンス設定の変更から、メンテナンス時刻を設定する
デメリットを承知で復元ポイントの自動作成を無効にする場合は下記の通りです。
1.
設定→
システム→
詳細情報→
システムの保護を開く
2.保護が有効になっているドライブを選び、
構成→
システムの保護を無効にするを選ぶ
Microsoft Streaming XXXX ProxyZoom、Discord、Skype、Google Meet、OBS Studio等、主にマイクやカメラを使うソフトを起動したときに自動的に生成される仮想デバイスです。これらのソフトを使わないようにすることは現実的ではないため、この機能を無効にすることは推奨されません。ソフトウェアの起動・終了時にのみ発生するデバイスの変化であり、ゲームプレイの最中に発生することは通常ないので、実害はないと考えて大丈夫です。
おわりにいかがだったでしょうか。2019年に問題が再発した理由は
Microsoft Gaming ServicesがWindows 10 May 2019 Updateで導入されたからです。今後もWindowsはUpdateが続くため、またさらなる変化が起こる可能性もあります。もし問題が再発してしまったとしても、調査の方法がわかってしまった今となっては、問題を再度解決することも容易くできるでしょう。
しかし真なる解決のためにはこの情報を多くの人が発信し、改善を求める声を開発に届けなくてはなりません。Windows版であるにも関わらずFF14として公式にDualShock4に対応させることができる技術をもっている開発チームですから、この問題が開発チームで再現さえできてしまえば修正はそう難しいことではないと思います。ぜひ自身や周りの方も含めてこの問題で困っている人がいたら、こちらのフォーラムを参考により多くの情報を開発チームに伝えてください。
https://forum.square-enix.com/ffxiv/threads/453441検索用キーワード
# Device Manager
# 0 Other Devices
# 1 Error Devices (Yellow Bang)
# 2 Camera Number
function GetDevStatus {
$Device_other = @()
$Device_yellowbang = @()
$CameraNum=0
$All_List = Get-CimInstance -Class Win32_PNPEntity
foreach ($i in $All_List) {
if ($Null -ne $i.Name -and $Null -eq $i.PNPClass) {
$Device_other += ($i.Name)
}
if ($i.Status -eq "Error") {
$Device_yellowbang += ($i.Name)
}
if ($i.PNPClass -eq "Camera"){
$CameraNum+=1
}
}
return $Device_other, $Device_yellowbang,$CameraNum
}
function CatchChange {
Write-Host("************Listening Device Change************")
$device=Get-CimInstance -Class Win32_PNPEntity
$device_num=$device.Length
while ($device_num -eq((Get-CimInstance -Class Win32_PNPEntity).Length)){
}
if ($device_num -gt((Get-CimInstance -Class Win32_PNPEntity).Length)){
Write-Host("Remove Device")
}
else{
Write-Host("Add Device")
}
$device_Change=Get-CimInstance -Class Win32_PNPEntity
$device_Compare=Compare-Object $device $device_Change
$time=Get-Date
Write-Host($time)
$device_Compare.InputObject | % {Write-Host $_.Name $_.DeviceID}
}
# CatchChange
$a = GetDevStatus
if ($Null -eq $a) {
Write-Host("No Error")
}
else {
Write-Host("************Other Devices************")
$a[0]
Write-Host("")
Write-Host("************YellowBang Devices************")
$a[1]
Write-Host("")
Write-Host("************Camera Num************")
$a[2]
}
while ($True){
CatchChange
}