リリースバージョン: ver.0.3.18
CollabSync は、Unity Editor 上で「今だれが何を触っているか」を共有し、競合を減らすための共同編集サポートツールです。 オンライン状況、編集対象、ロック、メモ、作業履歴、管理者権限を 1 つの UI で扱えます。
対応している共有方式は次の 3 つです。
Firebase Realtime DatabaseSupabaseLocal JSON
推奨は cloud backend です。 Root Admin が一度だけ接続先を設定し、各メンバーは自分の PC でサインインして使います。
- 特徴
- まず知っておくこと
- 1. インストール
- 2. 共有方式の選び方
- 3. 初回セットアップ
- 4. ふだんの使い方
- 5. ロックの考え方
- 6. 権限
- 7. Settings / Doctor / Sandbox
- 8. よくある質問
- 9. JSON 構造の例
- 10. トラブルシューティング
- リリースノート
- ライセンス
- Unity メニュー
Tools > CollabSyncから使えます。 Firebase/Supabase/Local JSONを同じ UI で切り替えられます。- 自動ロックと手動ロックの両方に対応しています。
- メモは Markdown 表示、既読、ピン留め、対象への紐付けに対応しています。
Local JSONは各 PC のローカルパス設定で扱い、Git 管理対象の project フォルダ内パスは拒否します。- cloud provider の key は Root Admin 以外には実値を見せません。
User IDベースで管理するため、表示名を変えても別ユーザー扱いになりません。Doctorで接続、認証、保存先、共有状態の診断ができます。Sandboxで複数ユーザーの見え方を Unity 内で確認できます。
- 迷ったら
Firebase Realtime DatabaseかSupabaseを使ってください。Local JSONは共有フォルダ運用向けです。 - cloud backend では、Root Admin が接続先を保存したあと、各メンバーは自分の
email / passwordまたはGoogleでサインインします。 - cloud 設定を変えたあとは
Apply Cloud Settingsを押し、必要ならサインインし直してからReconnectを押します。 Reconnectは「最後に保存した設定」で再接続します。入力中の値はApplyするまで使われません。FirebaseのState Rootを変える場合、Realtime Database rules 側のパスも同じ名前に合わせる必要があります。Local JSONのJSON Pathは project 共通設定ではなく、各 PC のローカル設定です。GitHub で共有されません。Sandboxは Root Admin 専用です。Sandbox panel の操作は実 backend に書き込まれるため、本番データで試す場合は注意してください。
- Unity 2021.3 以降
- macOS または Windows
- cloud backend を使う場合はインターネット接続
Local JSONを使う場合は全員がアクセスできる共有フォルダ
- Unity で
Window > Package Managerを開きます。 - 左上の
+を押します。 Add package from git URL...を選びます。- 次の URL を入力します。
https://github.com/IGNORANZ-PROJECT/CollabSync.git
- 追加後、再コンパイルが終わるのを待ちます。
Tools > CollabSyncが表示されることを確認します。
Editor と Runtime を Unity project 内へ置きます。
Assets/
└─ IGNORANZ-PROJECT/
└─ CollabSync/
├─ Editor/
└─ Runtime/
注意:
Git URL導入と手動配置を同時に行わないでください。CollabSync-mainのような展開フォルダ名でも、中にあるEditorとRuntimeを使えば問題ありません。
- macOS: 画面上部メニューバーの
Tools > CollabSync - Windows: Unity ウィンドウ上部の
Tools > CollabSync
Unity project の Packages/com.ignoranz.collabsync へ repo 内容を埋め込む script も入っています。
./scripts/embed-collabsync-into-unity-project.sh <UnityProjectPath>この script は Packages/manifest.json の dependency を file:com.ignoranz.collabsync に切り替えます。
| 方式 | 向いている用途 | 設定者 | 各メンバーが行うこと |
|---|---|---|---|
Firebase Realtime Database |
まず動かしたい、構成を単純にしたい | Root Admin | サインイン |
Supabase |
SQL / RLS を使いたい | Root Admin | サインイン |
Local JSON |
OneDrive / NAS / 共有フォルダ運用 | 各メンバー | 同じ共有ファイルを指すローカルパス設定 |
必要な設定:
Database URLWeb API KeyState Root
推奨 rules 例:
{
"rules": {
"collabsync": {
"$project": {
".read": "auth != null",
".write": "auth != null"
}
}
}
}重要:
- 上の rules は
State Root = collabsync前提です。 State Rootをholo_boardに変えるなら、rules 側のcollabsyncもholo_boardに変えてください。- 認証は
Email/PasswordまたはGoogleを有効にしてください。
必要な設定:
Supabase URLAnon KeyTable
最低限必要な table 例:
create table if not exists public.collabsync_state (
project_id text primary key,
version bigint not null default 1,
updated_at bigint not null default 0,
payload jsonb not null default '{}'::jsonb
);RLS 例:
alter table public.collabsync_state enable row level security;
create policy "collabsync read"
on public.collabsync_state
for select
to authenticated
using (true);
create policy "collabsync insert"
on public.collabsync_state
for insert
to authenticated
with check (true);
create policy "collabsync update"
on public.collabsync_state
for update
to authenticated
using (true)
with check (true);Local JSON は共有フォルダを使う方式です。
重要:
- URL ではなく、各 PC から見える実ファイルパスを指定します。
- 全員が「同じ内容に同期される同じ共有ファイル」を指す必要があります。
JSON Pathは各 PC のローカル設定なので、CollabSync の更新や GitHub の commit に入りません。Assets/Packages/ProjectSettings/など Git 管理対象の project 内パスは拒否されます。
保存の仕組み:
.jsonの横に*.collabsync-store/を作り、record 単位で分散保存します。- 1 ファイル丸ごとの上書きを避けるため、OneDrive のような同期ストレージでも壊れにくくしています。
Encrypt shared state fileを ON にすると、shared state は保護形式で保存されます。
- Firebase Console で project を作成します。
Realtime Databaseを作成します。AuthenticationでEmail/Passwordを有効にします。- 必要なら
Googleprovider も有効にします。 Database URLとWeb API Keyを控えます。- Unity で
Tools > CollabSync > Settingsを開きます。 Storage ProviderをFirebase Realtime Databaseにします。Database URL、Web API Key、State Rootを入力します。Apply Cloud Settingsを押します。Reconnectを押します。Run Doctorで接続確認します。
- Supabase project を作成します。
AuthenticationでEmailを有効にします。- 必要なら
Googleprovider も有効にします。 Project URLとanon public keyを控えます。- table と RLS を作成します。
- Unity で
Tools > CollabSync > Settingsを開きます。 Storage ProviderをSupabaseにします。Supabase URL、Anon Key、Tableを入力します。Apply Cloud Settingsを押します。Reconnectを押します。Run Doctorで接続確認します。
Root Admin が Google OAuth Client ID を設定します。
重要:
Desktop App用の OAuth Client ID を使ってください。- sign-in 時は system browser が開き、ローカル loopback callback で Unity に戻ります。
Google OAuth Client IDを保存したら、Apply Cloud SettingsとReconnectを実行してください。
最初に有効な shared state へ書き込んだユーザーが Root Admin になります。
手順:
Tools > CollabSyncを開きます。Settingsを開きます。Your Nameを入力します。Storage Providerを選びます。- provider 設定を入力して
Apply Cloud SettingsまたはApply Storage Settingsを押します。 - cloud を使う場合は
Sign Inします。 Reconnectを押します。Run Doctorで正常を確認します。
cloud backend の場合:
Tools > CollabSyncを開きます。Your Nameを入力します。- Root Admin が設定済みの provider が表示されていることを確認します。
- 自分の
email / passwordまたはGoogleでサインインします。 - 必要なら
Reconnectを押します。 Run Doctorで接続確認します。
Storage ProviderをLocal JSONにします。Choose...またはNew...で共有 JSON を選びます。Resolved Local JSONが意図した場所か確認します。- 必要なら
Encrypt shared state fileを設定します。 Run Doctorで接続確認します。
CollabSync は表示名ではなく User ID でユーザーを識別します。
Firebase/Supabaseでは provider 側の UID が使われます。Local JSONではこの PC に固定保存された ID が使われます。User IDは参照専用です。CollabSync から直接変更できません。- 表示名を変えても別ユーザーにはなりません。
- Admin 追加やユーザー削除は
User IDベースで行われます。
メイン UI は Overview Details Memos Settings の 4 タブです。
最初に見るタブです。
Online現在のオンライン人数と、編集中メンバーの要約を表示します。Unread / Pinned Memos未読メモとピン留めメモを表示します。Active Locks現在のロックを表示します。必要ならRequest UnlockやUnlockを使います。
一覧はデフォルトで絞って表示されます。
件数が多い時だけ Show all で展開します。
詳しく確認したい時のタブです。
Selection Status現在選択中の Scene / Prefab / Asset / GameObject が、だれの編集やロックの影響を受けているかを表示します。Usersオンライン状態、現在の作業、ロック数、作業履歴、User IDを確認できます。Lock ManagerAll / Mine / Blocking Meの絞り込み、検索、Unlock All Mine、管理者によるForce Unlockを使えます。
チームメモ用のタブです。
できること:
- 新規メモ追加
- 現在の選択への紐付け
- 手動の URL / asset path 紐付け
- Markdown 表示
- ピン留め
- 既読
- 検索
Unread onlyPinned onlyRelated to selection
通常削除は投稿者本人のみです。
管理者は Force Delete を使えます。
接続設定、認証、管理機能をまとめたタブです。
重要な流れ:
- 設定を変える
Apply Cloud SettingsまたはApply Storage Settings- 必要ならサインイン
Reconnect
CollabSync には 自動ロック と 手動ロック があります。
編集中の対象を検知し、必要最小限の範囲でロックします。
基本方針:
- ふつうの Inspector 編集は object 単位を優先します。
- Scene 全体設定の変更は scene 単位になることがあります。
- Script を実際に編集した時は script 側も対象になります。
- Play mode に入っただけでは auto-lock しません。
- 不要なロックが残りにくいよう、dirty 状態と heartbeat を見て管理します。
明示的にロックしたい時は次を使います。
Tools > CollabSync- Project ウィンドウ右クリックの
CollabSync GameObject > CollabSync
overlay 表示:
L他ユーザーのロックM自分のロック!他ユーザーが編集中
他ユーザーがロックしている .cs は、自分の環境で読み取り専用に寄せます。
誤編集の事故を減らすための保護です。
Keep retained locks until merged を ON にすると、手動ロックは解除時にすぐ消えず、保護ブランチに対象 commit が入るまで Retained として残ることがあります。
向いている場面:
- GitHub 中心で運用している
- branch をまたいだ競合を避けたい
main反映前にロックを消したくない
- 自分のロック解除
- メモ投稿
- 自分のメモ削除
- 他ユーザーへの
Request Unlock
通常ユーザーに加えて:
- 他ユーザーの
Force Unlock - 他ユーザーの
Force Delete Global Work Historyの切り替え
Admin に加えて:
- Admin の追加 / 削除
- ユーザー削除
- 削除済みユーザー一覧の閲覧
- ユーザー復活
- provider / endpoint など shared 設定の変更
- Sandbox の有効化 / 解除
Delete User は単に一覧から消すだけではありません。
- プレゼンス削除
- ロック削除
- Admin 権限剥奪
- その
User IDの再書き込みをブロック
あとで Root Admin が Deleted Users から復活できます。
Your NameYour User IDStorage Provider- provider ごとの接続設定
AuthenticationReconnectNotificationsGit-aware Locks
Run Doctor は次の確認に使います。
- provider 設定が正しいか
- sign-in が有効か
Local JSONの path が妥当か- 読み書きができるか
- 共有状態の基本構造が壊れていないか
- 現在の backend が正常に配信できているか
使いどころ:
- 初回セットアップ直後
- provider を変えた直後
Local JSONの path を変えた直後- 他メンバーだけ接続できない時
- 何かおかしいが原因が分からない時
Sandbox は Root Admin 専用です。
できること:
Enable SandboxOpen Sandbox PanelDisable Sandbox
重要:
- 各 panel は別ユーザーとして動作します。
- cloud backend では panel ごとに別 session を持てます。
- panel からのメモ、ロック、解除依頼は実 backend に書き込まれます。
- UI 確認だけでなく、実運用に近い挙動確認に使えます。
迷ったら Firebase Realtime Database か Supabase です。
共有フォルダ運用の事情がある時だけ Local JSON を選ぶのが無難です。
provider 設定を保存したあとです。
Apply は保存、Reconnect はその保存済み設定へ切り替える操作です。
rules 側の path が一致していない可能性が高いです。
State Root を holo_board にしたなら、rules 側も holo_board/$project を許可してください。
されません。
JSON Path は各 PC のローカル設定です。
置けません。 Git 管理対象に入るため拒否されます。
なりません。
内部では User ID で判定しています。
通常仕様です。 自分のロックだけ解除できます。強制解除は Admin 以上だけです。
入ります。 Sandbox は表示だけの mock ではありません。必要なら別の project / backend で試してください。
これは CollabSync が論理的に扱う shared state の例です。
Firebase/Supabaseでは payload として保存されます。Local JSONでは保護形式や store 展開前の論理構造として対応します。
| 症状 | 対処 |
|---|---|
| Sign In したのに接続できない | provider 設定を保存済みか、Reconnect を押したか確認してください |
Firebase が 401 / permission error になる |
State Root と rules の path が一致しているか確認してください |
| Supabase に接続できない | URL Anon Key Table と RLS を確認してください |
| Local JSON が更新されない | Resolved Local JSON と共有フォルダの権限を確認してください |
| Local JSON の path が拒否される | Git 管理対象の project 内パスを選んでいないか確認してください |
| Script が read-only のまま | 他ユーザーの lock がまだ残っていないか確認してください |
| 管理機能が出ない | 自分が Admin / Root Admin か確認してください |
| Sandbox でユーザーが増えない | Root Admin で Enable Sandbox したか確認してください |
| UI が重い | Overview / Details の一覧を開きすぎていないか確認し、不要な panel を閉じてください |
Hierarchy/Projectoverlay を見直し、見た目の変化がない heartbeat 更新だけでは repaint しないように軽量化CollabSyncWindowの derived cache 再計算頻度を抑え、memo Markdown cache も memo 内容が変わった時だけ破棄するように改善- memo 既読表示のユーザー名解決をキャッシュベースに変更し、memo 一覧の表示負荷を削減
- Sandbox の local overlay 更新は対象や identity が変わった時だけ再配信し、heartbeat だけで UI 全体を揺らしにくいように調整
- Sandbox heartbeat 間隔も見直し、複数 panel 使用時の定期通信負荷を軽減
- README を全面的に整理し、導入、設定、運用、トラブルシューティングを今の実装に合わせて再構成
- cloud 設定の
ApplyとReconnectの流れを README に明記 - Firebase の
State Rootと rules の一致が必要な点を README に追記 CollabSyncWindowの snapshot refresh を多重実行しにくくし、メモ Markdown 描画キャッシュと一覧表示制限で軽量化- UI を見直し、オンライン / ユーザー / ロック / Sandbox 一覧を既定で見やすく整理
- Sandbox panel ごとの cloud session 分離を強化し、main session を上書きしにくいように改善
Doctorを現行仕様に合わせて更新Sandboxを Root Admin 専用で追加- 複数の一時ユーザーパネルで UI と競合表示を確認できるように改善
Local JSONを通常 provider として整理JSON Pathを PC ごとのローカル設定へ移動- cloud key を non-root に見せないよう改善
Firebase Realtime DatabaseとSupabaseを cloud backend として追加- Root Admin が shared config を設定し、各メンバーは個別サインインする方式へ変更
MIT License © IGNORANZ PROJECT
{ "updatedAt": 1730000000000, "presences": [ { "userId": "a3d9...", "user": "Alice", "assetPath": "Assets/Scenes/Main.unity", "context": "Scene", "heartbeat": 1730000000000 } ], "locks": [ { "assetPath": "Assets/Scripts/", "ownerId": "b1f2...", "owner": "Bob", "reason": "context-menu", "createdAt": 1730000000000, "ttlMs": 0 } ], "adminUserIds": ["a3d9..."], "adminUsers": ["Alice"], "blockedUserIds": ["c8e4..."], "blockedUsers": ["Charlie"], "rootAdminUserId": "a3d9...", "rootAdminUser": "Alice", "workHistoryMode": "enabled", "memos": [ { "id": "a1b2c3", "text": "新しいシーン構成を確認", "authorId": "a3d9...", "author": "Alice", "assetPath": "Assets/Scenes/Main.unity", "createdAt": 1730000000000, "pinned": true, "readByUserIds": ["b1f2..."], "readByUsers": ["Bob"] } ] }