3D & 2D描画
このモジュールは、ラインレンダラーを使用して3D描画を作成するための3Dポイントを同期する方法を示しています。
3D描画
原理
3D描画は、描画が完了した後に掴んで移動できる共通のハンドルを持つラインレンダラーのグループで構成されています。
ラインレンダラーはローカルベースの位置決めが可能で、ハンドルと一緒に移動します。
描画は複数のラインで構成されています。
同期データ
Draw
コンポーネントにはNetworkArray
というネットワーク化されたプロパティが含まれており、各エントリーはDrawPoint
です。DrawPoint
はVector3とfloatを持っており、その意味はfloatの値によって異なります。
- 正の値は通常のポイントを表します。Vector3は現在のラインに追加されるポイントのローカル位置を含みます。
NEW_LINE_PRESSURE
(-1) の値はラインの変更を表します。Vector3は終了したラインの色(r/g/b)を含みます。次のポイントのために新しいラインレンダラーが作成されます。
制限
ネットワーク配列が満杯になると、別のDraw
が作成され、次のDraw
は最初のDrawに従うことが保証され、掴まれた場合にはその動きを同期します。これにより、単一の描画のように見えます。
このプロトタイピングコードでは、すべてのデータがFusionのネットワーク化されたプロパティに保存されています。実際のシナリオでは、持続性に関しても、リアルタイム同期にはFusionを使用し、長期データ持続性にはサードパーティのストレージサービスを使用する必要があります。
描画
3DペンはDrawer
コンポーネントを保持しており、これがDraw
コンポーネントを含む描画プレハブを生成します。Draw
コンポーネントは、描画されたすべてのポイントがFusion上で同期されることを保証します。
描画はボタンを使用することでトリガーされます(VRコントローラーの場合はトリガー、デスクトップの場合はスペース)。
2D 描画
原理
2D描画は、専用のカメラで記録された、ユーザーには見えない(インビジブルな)3D描画です。そのレンダリング結果はボードのテクスチャに投影されます。
パフォーマンスを考慮して、このカメラはボードの近くでペンが使用されているときや、それらのペンで作成された描画が移動されているときにのみ有効になります。
描画
描画はボードの表面への接触によってトリガーされ、その接触の深さが描画の幅を決定します。
備考: ブロッキングチップモジュールのコードは、このボード検出に類似しています。今後のバージョンでは、これらはおそらく統合されるでしょう。*
カラー選択
ColorSelection
コンポーネントは、ペンの色の変更を同期するためにDrawerに追加することができます。
CheckColorModification()
メソッドは、ローカルユーザーがジョイスティックを使用してペンの色を変更したかどうかを確認するために、FixedUpdateNetworkの間に呼び出されます。
C#
public override void FixedUpdateNetwork()
{
if (Object == null || Object.HasStateAuthority == false) return;
CheckColorModification();
}
この場合、ChangePenColor()
はネットワーク化された変数PenColor
を更新します。そのため、OnColorChanged()
が全てのプレイヤーで呼び出されます。
C#
[Networked(OnChanged = nameof(OnColorChanged))]
public Color PenColor { get; set; }
static void OnColorChanged(Changed<ColorSelection> changed)
{
changed.Behaviour.OnColorChanged();
}
void OnColorChanged()
{
UpdatePenMaterials();
}
その後、UpdatePenMaterials()
がペンのマテリアルを更新し、UpdateDrawColor()
が前の描画を終了し、新しい色で新しい描画を開始します。
デモ
デモはAssets\Photon\FusionAddons\Drawing\Demo\Scenes\
フォルダにあります。
シーンには、いくつかのボードを持つ2Dペンが含まれています:
最初のシンプルな四角いボードには、ペンが表面を越えないようにするための
BlockingSurface
コンポーネントが付いています。ボックスコライダーのIsTrigger
が true に設定されていることを確認してください。
子カメラはパースペクティブに設定されています。
また、ボードカメラのCullingMask
に3Dラインやボードの背景(もしあれば)で使用されるレイヤーが含まれていることを確認してください。
同様に、プレイヤーのリグのカメラにはボードの背景が含まれないようにするべきです(これはカメラのレンダーテクスチャのおかげで表示されます)。2つ目のシンプルなボードは、幅が2倍です。
子カメラはorthographic(オーソグラフィック)に設定されています。
カメラの出力テクスチャは、四角いボードに対して幅が2倍の解像度のレンダーテクスチャに設定する必要があります。3つ目のボードには、背景テクスチャを含むビジュアルがあります。前述のように、背景テクスチャのゲームオブジェクトのレイヤーはプレイヤーのリグのカメラには含めないべきですが、ボードのカメラのカリングマスクには含める必要があります。このボードには、色の選択機能を持つ3Dペンが含まれています。
ペンを放すと、ピンが表示され、プレイヤーがラインを移動できるようになります。
シーンには2つの3Dペンが含まれています。ペンを放すとハンドルが表示され、プレイヤーが3Dラインを移動できるようになります。
ダウンロード
こちらのアドオン最新バージョンはaddon projectに含まれています。
サポートしているトポロジ
- shared mode
Changelog
- Version 1.0.3: Fix because of feedback namespace modification
- Version 1.0.2: Add LargeBoard with visual prefab
- Version 1.0.1: Add demo scene + prefabs update + add namespace
- Version 1.0.0: First release