---
# System prepended metadata

title: 大正大学さざえ堂VRChatプロジェクト

---

# 大正大学さざえ堂VRChatプロジェクト
## 本ドキュメントについて
2024年12月より発足した案件「大正大学さざえ堂VRChatプロジェクト」でVRChatのワールドを作成した。
社内のナレッジとして今回VRChatのワールド制作で使用したUdonsharpの知見についてまとめる。

なお、本ドキュメントではVRChatの概要や、VRChatSDKのインストール方法など開発環境の準備方法は記載しない。
本案件での開発途中で直面した課題をもとに、VRChatでの制作についてまだ経験のない開発者が、開発段階で留意した方がよい事項をまとめる。

## 対象読者
- 成果物を振り返りたい本案件に関与した方々
- 今後社内でVRChatのワールド制作を検討している開発者
- VRChatのワールド開発に興味のある方

## 目次

[TOC]

## 成果物概要
- 大正大学のイベント「大正デジタル未来ラボ」で展示するVRChatワールド
  - 制作したVRChatのワールド:
      - リンク： [SazaeVR_20250116_01](https://vrchat.com/home/world/wrld_cee6afed-3ff8-4e2a-9d99-f644c6c96f56)
      - 使用できるアカウント情報 ：[アカウントリスト](https://docs.google.com/spreadsheets/d/1VAI-8XlXLtvz4rDoisv6KtwpSM9AYzwaFJmdv04-Dto/edit?gid=0#gid=0)

- ワールドの概要
  - 大正大学に実在する建物「さざえ堂」をフォトグラしたモデルを探検する謎解きゲーム
  - 4つのエリアで構成
    - チュートリアルエリア、暗闇の通路、栄螺堂の明かり、仏具のスキャン
      - 参考画像: (引用元 :[さざえ堂VR_プレイマニュアル](https://docs.google.com/presentation/d/1p4vw73Jgdk7FO_gBJOKFLikjz3UzzpDVa5fGd44BOOY/edit#slide=id.p))
        - ![image](https://hackmd.io/_uploads/H1KuYTojkx.png)
    
  - 参考:「大正デジタル未来ラボ」とは(以下Googleの検索結果)
    - https://tls.tais.ac.jp/event/
    - https://www.tais.ac.jp/guide/latest_news/20250117/90465/
 - 制作期間: 2024年12月中旬～2025年2月中旬
 - プラットフォーム(`VRChat`)の選定理由
    - 案件の開始からリリースまでの時間が短く、確実に動作するプラットフォームが必要だった
    - VRChatを利用すれば、デフォルトでプレイヤー間でのコミュニケーション機能などが整っている
    - クラスターも候補にあったが、クラスターの制約が多いのも懸念点だった
      - スマホ対応前提でワールドを作らなければならない
        - 今後の拡張性に不安
    - 2024年夏からVRChatが伸び始めていた
      - 社内知見をためたかった
    - DiO社内にVRChatを個人的に利用している方がいるため、知見がある

今回は検討対象に挙がらなかったが、今後の比較対象として[Resonite](https://store.steampowered.com/app/2519830/Resonite/?l=japanese)も考えられる → しかしPCスペックの問題でしばらく広くユーザーに浸透することはないかもという懸念がある。またVRChat側が多くのユーザーをすでに確保しているので。。。
## 開発スケジュール概要

◇| 2024/12月中旬 | 12月下旬 | 2025/1月上旬 | 1月中旬 | 1月下旬 | 2月上旬 | 2月中旬 | 2月下旬 | 3月上旬 |3月 XX
---|---|---|---|---|---|---|---|---|---|---
 企画・要件定義 | ● | ● | | | | | | | |
 撮影| ● |||| | | | | |
3Dモデル制作 || ● | ● | ● | ● | ● ||||
2Dアセット制作|| ● | ● | ● | ● | ● ||||
サウンド制作|| ● | ● | ● | ● | ● ||||
 VRChat実装 | ● | ● | ● | ● | ● | ● | | | |
 テスト・調整 | | | | | ● | ● | ● | ● | ● |
備考:TOPICを記載|12/19・20  すがも観音さざえ堂撮影|1/23 大正大学柏木理事長MTGにて仕様調整|||1/26 第1回イベント||2/16 第2回イベント|||納品

※ ●は作業実施期間を示す

## プロジェクトでチームで使用したツール類
- プロジェクト用GoogleDrive: [さざえ堂VRChat](https://drive.google.com/drive/folders/1PkrvviPBkKHSl3x8BPOQx98KbsBJEdRj)
    - 用途
        - ドキュメントや大正大学のイベント当日の現場撮影動画を管理
- プロジェクト開発者用: **利用権限保持者以外使用不可**
    - AzureDevOps:[TaishoSazaeVR](https://dev.azure.com/higuchisouta/TaishoSazaeVR)
        - 用途
            - GitやWikiを使用
        - AzureDevOpsの選定理由
            - 無料枠でGitが5人まで容量無制限で使用できるため
        - 利用権限保持者(敬称略)
            - 樋口、王、小谷、(金 ※)、吉岡、(玉置 ※)
                - ※ 無料枠の制限5人のため、メンバーの増減時に使用者が入れ替わった。2025/3/10現在、金の代わりに玉置が使用可能
- タスク管理ツール:
    - [Bcaklog](https://dio8.backlog.com/board/SAZAEDO2025)
        - 利用の背景
            - 社内でタスク管理を統一するため？プロジェクトの途中から導入された。
    - [Googleスプレッドシート](https://docs.google.com/spreadsheets/d/1IGacrRnMHXai5i1wfKoMY7GkPOJiKYKJIG50ySbaTGk/edit?gid=369886891#gid=369886891)、[Torello](https://trello.com/b/3TbwdvFm/%E5%A4%A7%E6%AD%A3%E5%A4%A7%E5%AD%A6)
        - 利用の背景 
            - Backlogに移行前に使用。
## 開発環境
- Unity: 2022.3.22f1
- SDK version
  - 3.7.5

## Udonsharpでできないこと
### System.Collections.Generic
  - → つまり`Dictionary`や `List`, `Delegate`, `Task`, `Action`などは使用できない
    - 対策:`Dictionary`や `List`の代わりにArrayを使用するようにする。`Delegate`, `Task`, `Action`はあきらめる。。。
  - しかし`GetComponent<T>`や`GetComponentInChildren<T>`は使用可
### Corutine
  - 対策: 自作のTimer変数を`Update()`で`Time.deltaTime`を回して対応する
### クラス内のEnum
  - 対策: クラス外で宣言すれば使える
### ラムダ式
  - 対策: ちゃんと関数作る
### null条件演算子`?.`
  - 対策: if文でnullチェックする `if(変数!=null){// 何らかの処理}`
### 外部APIに対してPOST,PUT,Deleteができない、またurlを動的に変更できない
  - Urlを動的に変更できないので、静的に定義してGetリクエストのクエリパラメータに外部に送信したいデータを指定する
      - ※プレイヤーに手動でURLを入力させる場合に限り、動的にURLを設定することができる
  - 例: クエリパラメータに指定した文字列をサーバー側に送信し、サーバー側でクエリパラメータの文字列をスプレッドシートに書き込む処理
   ![image](https://hackmd.io/_uploads/HJVnK6ijkx.png)

### PrefabのInstantiateしたオブジェクトは同期の処理できない
  - 対策: あらかじめワールドに配置する
### tag
  - 対策: `GameObject.FindGameObjectsWithTag`などは使えないので`GameObject.Find`で行う
### デフォルトで作成される`Button`がクリックできない
  - Layerを`UI`→`Default`に変更する。
    - 参考: [Zenn:【VRChat】さくっとボタンを追加する～その1～](https://zenn.dev/beeeegle/articles/4e7a67cb1624d0)

## チーム開発で困ったこと
### GitのConflict
  - それぞれの開発者がが同じゲームシーンにオブジェクトを配置していたため、ワールドの情報が(例)`VRCDefaultWorldScene.unity`が頻繁にコンフリクトしていた。
  - 対策: 使用するゲームシーンに配置するものは基本プレファブにして、`override`する方針にする

## その他 Tips
### 同期処理の伝達速度を改善するための提案
  - [UdonSynced]属性を付与した変数を無為に増やしすぎない
    - 参考: [Qiita: 【VRChat】 Udon開発する上での注意点【Unity】](https://qiita.com/toRisouP/items/16bd06aa303a1bb1a747#%E8%A3%9C%E8%B6%B3-udon-synced-variables%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E3%81%AE%E5%85%AC%E5%BC%8F%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A9%E3%83%A0%E3%81%A7%E3%81%AE%E5%A0%B1%E5%91%8A)
  -  [UdonSynced]はDefaultでは常に同期処理を行うため同期したい変数が多い場合は伝達速度が下がる。同期の速度を向上したい場合はスクリプトのクラス自体を`[UdonBehaviourSyncMode(BehaviourSyncMode.Manual)]`にすることでManualの同期設定を行う
       - [UdonSynced]変数だけでなく、SendCustomNetworkEvent関数も多用すると処理がスタックするため、リアルタイム性を追及するためにはManualでの同期方法が有効
### UdonSharpの仕様変更に注意する
- 例: SDKバージョンによって引数に配列を指定しても処理されていたものが、処理されなくなったり。。。 → エラーはでないので使い方が間違っていると気づきにくい。開発環境が参考にするドキュメントや情報と合致していることを確認する。
### リモートPCから`Build and Run`実行時に以下のエラーが生じる
- 事象
    - 使用するVRChatのExeをQuestLinkのVRChat.exeを指定していると、リモートデスクトップ時に`Build and Run`すると以下のErrorが表示された。
    ![image](https://hackmd.io/_uploads/BywpKajs1l.png)

- 対策:Steam版のVRChat.exeを指定して対応
     ![image](https://hackmd.io/_uploads/Sy1Ctpioyl.png)

### UdonSharpが自動で作成する`Assets/Serialized/UdonPrograms/`配下のファイルがGitの変更に毎回検知されるので大変
  - 対策:`.gitignore`する
### 実装速度がC#より遅い
  - 対策: 留意事項であるため慣れるしかない!?<<<脳筋的発想!!!>>>
    - なるべく同期処理を減らしたり、必要な関数のみ都度呼び出すように処理したりとか？？ 
    - コンピュートシェーダーも使用出来ないが[代用方法](https://phi16.hatenablog.com/entry/2023/09/25/235421)はある。
