3D & 2D drawing
このモジュールは、LineRenderer
で作られた3D描画を作成するための、3Dの点を同期する方法を説明します。
3D Drawing
基本原理
3D描画はLineRenderer
のグループで作成され、描画完了後に掴んだり動かしたりできる共通のハンドルを持ちます。
LineRenderer
はローカル座標で位置が決められ、ハンドルによって動かすことができます。
描画は複数の線で作られます。
データの同期はData Sync Helpersアドオンに基づいています。
データの同期
Draw
クラスは、Data Sync Helpersアドオンのリングバッファを使用して、描画データを保存します。正確には、RingBufferLosslessSyncBehaviour
を継承していて、リングバッファを通してすべてのデータが同期されるため、途中参加者でも完全な描画を受信することができるようになっています。
リングバッファはDrawPoint
を同期します。DrawPoint
はVector3
とfloat
を持ち、float
値によって意味が変わります。
- 正の値は通常の点を表します。
Vector3
は点のローカル座標になり、現在の線に追加されます。 NEW_LINE_PRESSURE
(-1)の値は線の変更を表します。Vector3
は線の始点の色(RGB)になり、新しいLineRenderer
が作成されます。
このプロトタイプコードでは、すべてのデータがFusionのネットワークプロパティに保存されるか、信頼性のある転送APIで同期されることに注意してください。実際のシナリオでは、永続性を持たせるため、Fusionはリアルタイムの同期に使用して、長期的な永続データにはサードパーティーのストレージサービスを使用してください。
描画
3DペンはDrawer
コンポーネントを持ち、Draw
コンポーネントを持つ描画プレハブをスポーンします。Draw
コンポーネントによって、すべての描画点はFusionで同期されます。
描画はボタンを使用してトリガーされます(VRコントローラーのトリガー・デスクトップのSpaceキー)。
2D drawing
基本原理
2D描画は(ユーザーには)見えない3D描画です。専用カメラに記録されて、描画結果はボードのテクスチャに反映されます。
パフォーマンスの目的で、ボードの近くペンが使用された時、または作成された描画が移動したした時のみカメラが有効になります。
描画
描画は、ボード表面に接触することでトリガーされます。接触の深度によって、線の太さが決まります。
備考:先端モジュールのコードは、ボード検知と似ています。将来的には共通化する予定です。
色の選択
ColorSelection
コンポーネントは、ペンの色の変更を同期するためにDrawer
に追加できます。
FixedUpdateNetwork
内でCheckColorModification()
メソッドを呼び出して、ローカルユーザーがジョイスティックを使用してペンの色を変更しているかをチェックします。
C#
public override void FixedUpdateNetwork()
{
if (Object == null || Object.HasStateAuthority == false) return;
CheckColorModification();
}
このケースでは、ChangePenColor()
でネットワーク変数PenColor
を更新します。そのため、すべてのプレイヤーで(変更検知によって)OnColorChanged()
が呼び出されます。
C#
[Networked]
public Color PenColor { get; set; }
public override void Render()
{
base.Render();
foreach(var changedVar in changeDetector.DetectChanges(this))
{
if (changedVar == nameof(PenColor))
{
OnColorChanged();
}
}
}
void OnColorChanged()
{
UpdatePenMaterials();
}
そして、UpdatePenMaterials()
でペンのマテリアルを更新し、UpdateDrawColor()
で現在の描画を終了して新しい色の描画を開始します。
依存関係
- DataSyncHelpers addon
- Blocking Contact addon
- Interactive Menu addon
- Feedback addon
デモ
デモシーンはAssets\Photon\FusionAddons\Drawing\Demo\Scenes\
フォルダーにあります。
シーンには2Dペンと複数のボードが含まれます。
最初のシンプルな四角ボードは、
BlockingSurface
コンポーネントによって表面からペンが外れないようになっています。BoxCollider
のIsTrigger
がtrue
に設定されていることを確認してください。
子カメラはPerspective
に設定されます。
ボードのカメラのCullingMask
に3D描画と(もしあれば)ボード背景が含まれることを確認してください。
同じように、プレイヤーリグのカメラにはボード背景を含まないようにしてください(カメラのレンダーテクスチャによって可視化されます)。2つ目のシンプルなボードは、その幅が倍です。
子カメラはOrthographic
に設定されます。
カメラの出力テクスチャは、四角ボードに対して幅が倍の解像度のレンダーテクスチャに設定する必要があります。3つ目のボードは、見た目に背景テクスチャを含みます。前述の通り、背景テクスチャのゲームオブジェクトのレイヤーは、プレイヤーリグのカメラに含めてはいけません(ボードのカメラの
CullingMask
には含める必要があります)。
このボードは、色選択機能を持つ3Dペンを含みます。
ペンを離すと、ピンが表示され、プレイヤーは線を動かせるようになります。
このシーンも2つの3Dペンを含みます。
ペンを離すと、ハンドルが表示され、プレイヤーは3Dの線を動かせるようになります。
ダウンロード
このアドオンの最新バージョンは、Industries アドオンのプロジェクトに含まれています。
対応するトポロジー
- 共有モード
更新履歴
- Version 2.0.8: Update ColorSelcection to implement IColorProvider interface
- Version 2.0.7: User layer tools to automatically set the proper layer for 2D projection
- Version 2.0.6:
- Fix to ensure compatibility with VisionOSHelpers add-on.
- Fix issue with force use.
- Version 2.0.5: ColorSelection KeyboardBindings are added at runtime
- Version 2.0.4: Drawer: Use virtual variables & add verification+ Draw: fix lastDrawingTipPosition
- Version 2.0.3: Fix because of feedback namespace modification
- Version 2.0.2: Add LargeBoard with visual prefab
- Version 2.0.1: Add demo scene + prefabs update + add namespace
- Version 2.0.0: First release