メインコンテンツまでスキップ

入力したテキストを同期する

通常、IwashiIME を使用して InputField に入力した文字は ローカル(自分の画面のみ) に反映され、他のプレイヤーには見えません。
入力した内容を他のプレイヤーとも共有したい場合(チャットや掲示板など)は、UdonSharp を使用して変数の同期を行う必要があります。

ここでは、シンプルな「入力されたテキストを全員に同期して、Text(TMP)に表示する」方法を解説します。

UdonSharp スクリプトの作成​

テキストを同期するための UdonSharp スクリプトを作成します。 以下のコードをコピーして、SyncText.cs などの名前で保存してください。

using UdonSharp;
using UnityEngine;
using TMPro;
using VRC.SDKBase;

[UdonBehaviourSyncMode(BehaviourSyncMode.Manual)]
public class SyncText : UdonSharpBehaviour
{
[Header("同期された文字を表示するText")]
[SerializeField] private TMP_Text _targetText;

[Header("入力を行うInputField")]
[SerializeField] private TMP_InputField _sourceInputField;

// 同期する文字列変数
[UdonSynced] private string _syncedText = "";

private void Start()
{
// 初期化時に現在同期されている値を反映
if (_targetText != null)
{
_targetText.text = _syncedText;
}
}

// InputFieldで送信された時に呼び出すメソッド
public void _OnSendSubmit()
{
if (_sourceInputField == null) return;

// オーナー権限を取得
if (!Networking.IsOwner(gameObject))
{
Networking.SetOwner(Networking.LocalPlayer, gameObject);
}

// 変数を更新
_syncedText = _sourceInputField.text;

// ローカルの表示も更新
if (_targetText != null)
{
_targetText.text = _syncedText;
}

// 入力欄をクリアする
_sourceInputField.text = "";

// 同期をリクエスト
RequestSerialization();
}

// 同期データを受け取ったときに呼ばれるイベント
public override void OnDeserialization()
{
if (_targetText != null)
{
// 受け取ったテキストを表示に反映
_targetText.text = _syncedText;
}
}
}
ポイント
  • [UdonSynced]: この属性がついた変数の値がネットワーク越しに同期されます。
  • RequestSerialization(): 変数の値を更新した後にこれを呼ぶことで、他のプレイヤーへ送信されます。
  • OnDeserialization(): 他のプレイヤーが更新した値を受け取ったタイミングで実行されます。ここで UI を更新します。

シーンへのセットアップ​

作成したスクリプトをオブジェクトに設定します。

1. スクリプトのアタッチ​

任意の GameObject(管理しやすい空のオブジェクト等でOK)に、作成した SyncText スクリプトをアタッチします。

Inspector で以下の2つを割り当ててください。

  • Target Text: 同期された文字を表示したい TMP_Text
  • Source Input Field: 文字入力を行う TMP_InputField

2. イベントの登録​

InputField への入力アクションを検知してスクリプトを動かす設定をします。

  1. Source Input Field に指定した TMP_InputField コンポーネントの On End Edit (String) イベントを探します。
  2. + ボタンを押してイベントを追加します。
  3. Object 欄に、先ほどスクリプトをつけたオブジェクトを割り当てます。
  4. Function のプルダウンから UdonBehaviour SendCustomEvent (string) を選択します。
  5. 文字列入力欄に、呼び出したいメソッド名である _OnSendSubmit を入力します。


動作確認​

VRChat でワールドをビルド&アップロード(または Build & Test)して確認します。
2つのクライアント(自分と他人、または2プロセス起動) でワールドに入り、片方が文字を入力して OKボタン を押した際、もう片方の画面の Text にも同じ文字が表示されれば成功です。

IwashiIME との連携

IwashiIME を経由して入力した場合も、最終的には InputField の文字が書き換わり送信イベントが走るため、この On End Edit イベントが発火して同期処理が正しく行われます。 特別な設定は必要ありません。