LoginSignup
3
1

CPU使用率をOSC通信でVRChatに送って、アバターの色を変化させてみた

Last updated at Posted at 2024-01-14

はじめに

こんにちは。
ジョジョ好きなXRクリエイターの もふるね です。

今回は【知識0から】VRChatを別タブで操作できるアプリ自作してみた!【OSC / フォームアプリケーション】の続きです。

VRChatのアバターパラメーターをOSCでいじることができるみたい。
OSCアプリ作ったけど、VRゴーグル付けたまま操作はし辛いなぁ。
自分で操作せずとも値が変動するものがあれば・・・
あっ💡
CPU使用率!

結果

CPU使用率を取得する

どうやったら取得できるんだろう?
調べると以下の記事がヒット。
.NET/CPU使用率を取得する
C# で CPU 使用率を取得する

どうやら、「System.Diagnostics」をインポートするとCPU使用率とかメモリー使用量を扱えるようになるらしい。
まずはその処理を追加します。

using System.Diagnostics;

次に、CPU使用率の記録用のオブジェクトを作成します。

private PerformanceCounter cpuCounter;

そしてそのオブジェクトを初期化して

cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");

以上を行うと、CPU使用率をcpuCounter.NextValue()で得ることができるようになります。

VRChatアバターに色変化オブジェクトを追加する

大体は以下の記事通りに作ると良いです。
【VRChat】アバターの色を段階的に変更する方法(Fx-Float)

簡単にまとめると

  • アバター直下に球体オブジェクトを追加
  • 新しくマテリアルを作って球体に付与
  • 新しくアニメーションを作ってマテリアルの色を0フレーム:緑,100フレーム:赤にする
  • アバターパラメーターに「cpuValue」を追加、TypeはFloat
  • FXレイヤーでパラメーターに「cpuValue」を追加
  • FXレイヤーで新規レイヤーを追加
  • 新規レイヤーにアニメーションをドラッグ&ドロップ
  • Write Defaultsのチェックを消し、Motion Timeにチェックを付けてcpuValueを設定

VRChatのアバターパラメーターをOSCで送信する

以下のコードで送信できます。

oscSender.Send(new OscMessage("/avatar/parameters/[パラメータ名]", [送りたい数値]));

パラメータ名は、UnityでVRChatアバターを作る際に追加したパラメーターと同名にします。
送りたい数値は、Bool,Int,Float型で送れます。

osccpu01.jpg

プログラム

以上のことをコードにまとめます。
並列処理をするためにSystem.Threadingを読み込んでいます。

Form1.cs
//パフォーマンスカウンターを扱えるようにする
using System.Diagnostics;
//並列処理をできるようにする
using System.Threading;

CPU使用率は0から100の値が取得できます。
今回作ったVRChatのアバターパラメーターはFloatで0から1の値に対応しています。
そのため、CPU使用率を100で割った値をOSCで送信します。

アプリを終了しようとして閉じた際に、cpuPerformanceCountメソッドが処理途中で、UIスレッドの処理を実行しようとして失敗しエラーを吐いていました。
なので、以下のコードを追加してメソッドが終了するまで待機するようにしました。
Task.WaitAll(Task.Run(() => cpuPerformanceCount()));

Form1.cs
//CPU使用率の送信をするか否か
private bool cpuPerformanceSwitch = true;
//CPU使用率の記録用のオブジェクト作成
private PerformanceCounter cpuCounter;

public Form1()
{
    InitializeComponent();

    int sendPort = 9000;
    // OSCのセンダーをポート[sendPort]で作る
    oscSender = new OscSender(sendAddress, 0, sendPort);
    // 接続
    oscSender.Connect();

    // cpuPerformanceCountメソッドを開始
    Task.Run(() => cpuPerformanceCount());
}

//CPU使用率をOSC信号で送るメソッド
private void cpuPerformanceCount()
{
    //CPU使用率の記録用のオブジェクト初期化
    cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
    //0.5秒毎にCPU使用率をVRChatに送信する
    while (cpuPerformanceSwitch == true)
    {
        //CPU使用率を変数に代入
        float cpuValue_f = cpuCounter.NextValue();
        int cpuValue_i = (int)Math.Floor(cpuValue_f);
        float cpuValue_vrc = (float)cpuValue_i / 100f;

        //OSC送信
        oscSender.Send(new OscMessage("/avatar/parameters/cpuValue", cpuValue_vrc));

        // UIスレッドで処理を実行
        this.Invoke((MethodInvoker)delegate
        {
            label2.Text = $"CPU : {cpuValue_i}%";
        });
        Console.WriteLine($"CPU : {cpuValue_i}%, cpuValue : {cpuValue_vrc}");
        Thread.Sleep(500);
    }
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    //CPU使用率の送信を止める
    cpuPerformanceSwitch = false;
    //cpuPerformanceCountメソッドが終了するまで待機
    Task.WaitAll(Task.Run(() => cpuPerformanceCount()));

    //アプリケーションが終了する前にOSCセンダーを閉じる
    oscSender.Close();
}

色変化できないときの対処法

いろいろVRChatで試しているときに、OSC信号は送れてるのにアバターパラメーターが変動しない現象が起こりました。
調べてみるとこんな記事が
VRChat : OSC についての知見とメモ

どうやら、OSCを有効化したままアバターを着替えると、以下のファイルが生成されるようです。
C:\Users\[PCのユーザ名]\AppData\LocalLow\VRChat\VRChat\OSC\[ユーザーID]\Avatars\[アバターID].json
そしてこのファイルは今後一切更新されないにも関わらず、VRChatはこのファイルを参照して使用するようです。
私は、このファイルを削除することでこの厄介な現象に対処しました。

振り返り

VRChat中にPCが重い時に、周りの人が察してくれるようになるね!

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1