Simple Pen システムは2つのプログラムで構成されています。1つはペン用、もう1つは描画される各線用です。
ペンと線の連携の仕組み
Pen
ペンには VRCPickup および VRCObjectSync コンポーネントが搭載されており、基本的な拾い上げと同期機能を提供しています。プログラム自体はこれらのコンポーネントと相性が良いため、Continuous sync を使用しています。
Lines
各線オブジェクトには LineRenderer と Manual Sync を設定したプログラムが組み込まれています。これは、ペンほど頻繁に更新する必要がないためです。線には Vector3 配列である points 変数があります。この変数は、インスタンス内の全員に対して線のデータを同期するための主要な手段となります。
描画の開始
誰かがペンを使用すると、そのペンの OnPickupUseDown が呼び出されます。これにより、プログラム内で以下の動作が発生します。
- プールから新しい Line が取得され、変数に保存されます。
- ペンを持っているプレイヤーが、その Line の Owner に設定されます。
- isDrawing が true に設定されます。
- Line がリセットされ、ペンの先端位置に2つのポイントが配置されます。
- 次に使用する Line を追跡するための変数がインクリメントされます。
描画の継続
毎フレーム、ペンに対して Update イベントが呼び出され、以下のロジックが実行されます。
- isDrawing が true の場合、処理を継続します。
- ペンが minMoveDistance 以上移動した場合、処理を継続します。
- penTip の位置に、新しいポイントを LineRenderer に追加します。
- currentIndex を pointsPerUpdate と比較し、送信するポイントが十分に蓄積されたかを確認します。
- データの更新準備ができたら、ターゲットとなる線の UdonBehaviour に対して OnUpdate を呼び出します。
線側でこの OnUpdate メソッドが呼び出されると、プログラムは線上のポイントの現在位置を取得し、同期される points 変数を更新した上で、RequestSerialization を呼び出します。これは、Manual 同期された UdonBehaviour が VRChat に対して蓄積されたデータを送信するよう伝える方法です。このメソッドは線のオーナー側でのみ呼び出されます。その他のプレイヤーはデータを受信し、それぞれの OnDeserialization メソッドが呼び出されます。線側でこのメソッドがトリガーされると、プログラムは points 配列から位置情報を読み取り、それを使用して自身の線の位置を更新します。
描画の終了
ユーザーが Use ボタンを離すと、ペンに対して OnPickupUseUp イベントが呼び出されます。このイベントは単に isDrawing を false に設定し、対象となる線の UdonBehaviour に対して OnFinish を呼び出します。これにより、points データが全員に対して最新の状態であることを確認するために、OnUpdate メソッドがもう一度送信されます。
最終更新: