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