[Yjs入門 × R3F] 3Dの位置・回転をリアルタイムで共有する

皆様こんにちは。
AMDlab Webエンジニアの塚田です。

今回はyjsというライブラリについて学習してみました。

Yjsとは

Yjs は Conflict-free Replicated Data Type(CRDT)を実装したコラボレーション用ライブラリです。各クライアントはローカルで自由に編集でき、ネットワーク越しにマージしても衝突が自動的に解決されます。オフラインからの復帰や遅延・順序の乱れにも強く、共同編集やマルチユーザーUIに最適です。
さらに、通信層は独立しており、WebSocket や WebRTC、IndexedDB などのプロバイダを組み合わせて使えるため、小規模なP2Pアプリから大規模なクラウドアプリまで幅広く対応できます。代表的な活用例として、Google Docs のような文書エディタやホワイトボード、リアルタイムチャットが挙げられます。

 

本記事ではWebRTC(y-webrtc)を使い、React Three Fiber上のキューブの位置と回転を複数端末で同時に操作できる簡単な例を題材に、Yjsの使い方を紹介します。

Yjs公式サイト
https://yjs.dev/

 

今回作成したコードについてはGitHubにアップしています。
https://github.com/AMDlab/techblog-yjs-r3f-sample

注: React Three Fiber 等の詳細な説明は割愛し、Yjs の実装を中心に説明します。

Yjs の実装(共有ストアとAPI)


  • 伝送レイヤ: y-webrtc の WebrtcProvider で同一ルームのピア同士を接続(今回は ROOM_NAME を r3f-yjs-demo に固定)
  • 共有データ構造: yCube = ydoc.getMap("cube")  にキューブの状態(位置・回転)を格納
  • ヘルパ: getCubePosition / setCubePosition(位置)、getCubeRotation / setCubeRotation(回転)

シーン側の実装(変更監視・ドラッグ・ボタン回転)


  • yCube.observe で変更監視
  • 位置はドラッグで更新して setCubePosition へ書き込み、他クライアントへ同期。
  • 回転は画面左上のボタンで「カメラ基準(画面座標系)」に10度刻みで更新し、setCubeRotation に反映、他クライアントへ同期。

結果

同一クライアントではありますが、別タブで同期されることを確認しました。

回転

移動

終わりに

今回の記事では、Yjs を使ったシンプルな WebRTC(P2P)による位置、回転の共有の仕組みを紹介しました。
今後は WebSocket などを利用したより実践的なものを作成しようと思っています。


AMDlabでは、開発に力を貸していただけるエンジニアさんを大募集しております。
少しでもご興味をお持ちいただけましたら、カジュアルにお話するだけでも大丈夫ですのでお気軽にご連絡ください!
中途求人ページ: https://www.amd-lab.com/recruit-list/mid-career

カジュアル面談がエントリーフォームからできるようになりました。
採用種別を「カジュアル面談(オンライン)」にして必要事項を記載の上送信してください!
エントリーフォーム: https://www.amd-lab.com/entry

AMDlabのSNSアカウントです!ぜひフォローお願いします✨

■ X(旧Twitter):https://x.com/amdlabinc
■ Instagram:https://www.instagram.com/amdlabinc/
■ Facebook:https://www.facebook.com/amdlab.lnc/

 

ARTICLES