💬

[VRChat / Unity] Unity+OSC を利用してChatboxに日本語を表示する

2023/04/02に公開

はじめに

VRChatのChatboxに、Unity+OSC を利用して日本語を表示したかったのですが、日本語が文字化けするという問題がありました。
問題の経緯と対応内容について情報まとめます。

環境

OS・ツールなど バージョン 備考
Windows OS10 -
Unity 2021.3.17f.1 -
OscCoreライブラリ v1.1.0 -
uOSCライブラリ v2.2.0 -

結論

以下の「uOSC」というライブラリを利用することで、日本語の文字を手軽にVRChatへ表示することができた。

https://tips.hecomi.com/entry/2021/11/29/234527
https://github.com/hecomi/uOSC

  • OSC送信時の例(日本語が正常に表示されたパターン)
    上段: UnityのGameウィンドウ、下段:VRChat
    Unity送信例
    Chatbox成功例

  • 処理例: コンポーネント設定
    uOSC_コンポーネント設定例

  • 処理例:ソース

uOSCSample.cs
using UnityEngine;
using UnityEngine.UI;
using TMPro;

// uOSCライブラリ用
using uOSC;

public class OscSampleController : MonoBehaviour
{
    // UI要素はInspectorから設定する
    [SerializeField] TMP_InputField _inputFld;
    [SerializeField] Button _sendBtn;
    
    // OSC送信用の変数定義
    private uOscClient _client = new uOscClient();

    void Start()
    {
        _client = this.GetComponent<uOscClient>();

        _sendBtn.onClick.AddListener(()=> {
            this.SendBtnClick();
        });
    }

    /// <summary>
    /// 送信ボタン 押下時処理
    /// </summary>
    public void SendBtnClick() {

        if (string.IsNullOrEmpty(_inputFld.text)) {
            return;
        }

        // Chatboxに文字列を送信
        _client.Send("/chatbox/input", _inputFld.text, false);
    }
}

問題の詳細

経緯

もともとは、VRChat公式から推奨されている「OSC Core」というライブラリを利用予定だった。
ただし、VRChatのChatboxに日本語を送信したところ文字化けが発生した。

https://github.com/vrchat/osccore/tree/all-in-one

  • OSC送信時の例(日本語が文字化けしたパターン)
    ※「あいうえお」と送信したはずが「BDFHJ」と文字化けする。文字コードが正しく反映されていない様子。
    上段: UnityのGameウィンドウ、下段:VRChat
    Unity送信例
    Chatbox失敗例
OSC送信処理例(OscCoreライブラリ利用)
  • コンポーネント設定
    OSCCOre_コンポーネント設定例

  • ソース

OscCoreSample.cs
using UnityEngine;
using UnityEngine.UI;
using TMPro;

using OscCore; // <= OSCCoreライブラリ用

public class OscSampleController : MonoBehaviour
{
    // UI要素はInspectorから設定する
    [SerializeField] TMP_InputField _inputFld;
    [SerializeField] Button _sendBtn;
    
    // OSC送信用の変数定義
    // NOTE: ローカルIPと、VRChatの受信用ポート番号を指定
    private OscClient _client = new OscClient("127.0.0.1", 9000);

    void Start()
    {
        _sendBtn.onClick.AddListener(()=> {
            this.SendBtnClick();
        });
    }

    /// <summary>
    /// 送信ボタン 押下時処理
    /// </summary>
    public void SendBtnClick() {

        if (string.IsNullOrEmpty(_inputFld.text)) {
            return;
        }

        // Chatboxに文字列を送信
        _client.Send("/chatbox/input", _inputFld.text);
    }
}

補足

VRChat v2022.2.2p3のリリースノートには以下記載があり、ChatboxのエンドポイントはASCIIコードしか対応していない旨の内容となっていた。
ただし実際は、「TouchOSC」ツールで日本語をOSC送信した際も問題なく表示できたので、今のVRChatのバージョンはUTF-8も対応している認識。

https://docs.vrchat.com/docs/vrchat-202222p3

・There are two OSC endpoints to send chat via the chat textbox:
 ・/chatbox/input s b Input text into the chatbox. If b is True, send the text in s immediately, bypassing the keyboard. If b is False, open the keyboard and populate it with the provided text.
 ・/chatbox/typing b Toggle the typing indicator on or off.
 ・Right now the chatbox's OSC input endpoint only supports ASCII characters. It will support UTF-8 later. The chatbox itself supports UTF right now.

参考URL

Discussion