# VRChatからTwitterに戦績を投稿させたい!
どうも, [おぷん](https://twitter.com/opn_brk)です.
今年も某コミュニティのアドベントカレンダーの季節が来たので書きます.
去年書いたものが[これ](https://hackmd.io/@open-brk/H18SM4mKF)でアレから一年になります.
VRChatや身の回りの出来事を振り返りながら, VRChatについて得た知見をまとめていければと思います.
下記は22/12/18時点のもので, 適当に書いたため間違っていることも言ってるかもしれません...
そのときはTwitterで優しく教えてください.
## 目次
[TOC]
# VRChat一年の振り返り
まずはVRChatここ一年の活動を振り返ります
- ~7月: 全く活動なし...
- この時期はタスク過多でリアルでも死んでた.
- 8月: Vket
- 実家から参戦, モデラーと回ったり. 某コミュニティで回ったり.
- 実家から下宿先のゲーミングPCで遊ぶ図↓
- 
- 何故かVimのアイコンを作る
- 
- 9月: たまたま訪れたワールド: クエストトビラでここしばらくお邪魔している面白いコミュニティと知り合う.
- Vimのアイコンをわかってくれた人がいて, コミュニティに馴染むのに一役買った.
- **なおこの時点までNew User**, New Userあたりが一番チヤホヤしてくれてありがたい.
- この直後にUserランクに昇格
- 
- https://twitter.com/opn_brk/status/1569378243987521537
- 知り合い経由で"Public陣内"と言われるコミュニティもちょっとお邪魔した
- 
- 10月
- ユーザーランクKnownになる.
- https://twitter.com/opn_brk/status/1583107021444091904
- Stable Diffusion?が発端でTwitterを賑やかせていたケーキ化改変(謎)をする
- 
- シェーダーに興味を持つようになる.
- 11月
- 現実のキャリアパス方面等でいいことがあった.
- 先述クエストトビラ界隈の人とApexをするようになったりする
- 12月
- 初V睡眠をキめる
- このアドカレのためにワールドを作ることを試みる.
- https://vrchat.com/home/world/wrld_4c3c5d82-7257-41f9-a932-f4282c01b90b
ぼちぼち.... という感じです.
# VRChatからTwitterに戦績を投稿させたい!
本題です.
まずVRChatワールド作成の概観を説明します.
Unityにオブジェクトを置いていって, ギミックをつけたいときにはVRChatが提供するComponentを付与します.
公式ドキュメント: https://docs.vrchat.com/docs/creating-your-first-world
## VRCとプログラミング
ただし通常のUnity開発のように任意のC#を動かせるわけではなく,
C#やUnity, Photonの機能の中から, 使って良い機能だけを呼び出せる**Udon Assembly**を叩くことで様々なギミックを作れます.
Udon AssemblyはVRChat専用のVMで動く命令セットで, Udon Assemblyを生成する方法はUdon GraphとUdon Sharpの二種類あります.
- Udon Graph
- ヴィジュアルプログラミング
- 最初から公式
- ワールドオブジェクトにアタッチしてギミック作成

- Udon Sharp
- もともとは個人のレポジトリ?
- https://github.com/vrchat-community/UdonSharp
- 最近やっと継承/インターフェースサポート(v1.1.0):
- 参考: https://kurotorimkdocs.gitlab.io/kurotorimemo/010-VR/010_VRChat/UDON/UdonSharp1.0/
```csharp
using UnityEngine;
using UdonSharp;
public class RotatingCubeBehaviour : UdonSharpBehaviour
{
private void Update()
{
transform.Rotate(Vector3.up, 90f * Time.deltaTime);
}
}
```
## 外部との通信の制限.
上のUdon Assemblyによる機能のホワイトリスト化により特に通信周りが制限されています.
具体的には
- ワールド内からのリクエストは**動画を取得するためのhttpのGETリクエスト**のみ!
- 上記のリクエストURLは
- ユーザーが直接入力したもの
- もしくは, もともとワールドに登録してあった文字列 ([SerializedField] readonly)
なお, VketなどではVRChat内から任意のリンクを開くことができますが, この機能は一般ワールド制作者は使えません...
## 抜け道の探索
これを掻い潜ってもうちょい自由度のあることをしようとしてきた他人の試みを探してきました.
- VRChatからの出力を処理
- -> デバッグログを外部プログラムで取得
- -> QRコードから読み取ってもらう
- -> 動画のGetリクエストを受け取るlocalhostを立てるThirdPartyアプリ
- URLをブラウザで開くアプリ(VRChatOpenBrowser)
- https://yukiyukivirtual.booth.pm/items/2539784
- VRChatへ入力
- byte列を動画として送る->Udonで解析
- MIDIとしてbyte列を送る->Udonで解析
- ふっかつの呪文方式
## VRChatから戦績をTwitterに投稿させたい!
やはり, VRChatの人々もTwitterにコミュニティを持つわけです.
僕は自作ゲームを遊んでくれた結果を投稿してもらえるように, 以下のようなリンクからにスコアやタイムなどを埋め込んでいました.
```
https://twitter.com/intent/tweet?text=おぷんアドベントカレンダー2022を読みました!&url=https://hackmd.io/@open-brk/SJwckqn_j&hashtags=アドベントカレンダー
```
が, これは上述した通りかなり厳しいです....
せいぜい,
- Tweet文/上記のようなリンクをコピーしておけるようにして置く.
- QRコードを生成してあとから記念写真に写ったものを取ってもらう
などですが如何せんハードルは高いです.
また, 前述の[VRChatOpenBrowser](https://yukiyukivirtual.booth.pm/items/2539784)から開かせる方法もありますが,
こちらは事前にワールドに登録されたURLしか開けないので, 動的なリンク生成は不可能です.
### 一番カンタンに投稿させる方法??
前述の[VRChatOpenBrowser](https://yukiyukivirtual.booth.pm/items/2539784)を使っている場合は, 開かせるまでの手間をある程度省かせることができます.
この方法は具体的には, Ctrl+A, Ctrl+C, Ctrl+Vの順に押してもらうとブラウザがTweet Readyな状態になります.
#### 原理
これはご存知, 全選択, コピー, 貼り付けのショートカットの処理をUdonで検知しフックすることで,
プログラムで生成されたURLをユーザーが入力したかのように見せかけて開かせることができます.
また, これを応用すれば, スコアなどをクエリパラメーターにつけてサーバーにリクエストできます(GETリクエストですが...). これで, スコアランキングなどを黒魔術的に作れるかもしれません...
## 12/22更新: ワールドを公開 (CommunityLabにPublish)
上の経験をもとに作ったワールドをLabに公開しました!
みかんを撃つだけの超簡単なShootingゲームをさせて, tweetをさせることを目的にしたワールドです↓
https://vrchat.com/home/world/wrld_4c3c5d82-7257-41f9-a932-f4282c01b90b
~~スコアをツイートすることに関してはなかなかハードルが高いので半ばあきらめです.~~
意外とInputFieldのURLをブラウザにコピペさせる手法でツイートしてくれてます。(フレンドへの解説&誘導ありきですが)
↓自作ワールド"みかんうち==Orange Home/Shooting" についてツイートしてくれてる人たち
https://twitter.com/search?q=%23%E3%81%BF%E3%81%8B%E3%82%93%E3%81%86%E3%81%A1%20OR%20%23%E3%81%BF%E3%81%8B%E3%82%93%E3%81%86%E3%81%A1v1%20%20-from%3Aopn_brk&src=typed_query&f=live
## 12/23更新: ワールドをPublicにするために
なお, ワールドをPublicにするためには, まず**Community Lab**にUploadして,
ある程度のVisit数とFavariteが必要です.
Community Labにあるうちは限定された方法でしかアクセスできません
- 自分/フレンドがワールドインスタンスを立てる
- Community Labタグをつけてワールド検索するなど
この状態で数週間のうちに **200Visits以上, 30Favarite以上**(目安)をもらう必要があるらしいです. (ワールド製作者談)
参考note記事↓
https://note.com/tangerine_tech/n/nc2215fd1ea49
最初のうちはRecently Uploadedタグが付いているせいか野良の人が来てくれますが,
ほとんどは己の†**ソーシャルネットワーキング能力**†に頼るしかありません.
VRChatってSNSだ...と再認識した瞬間でした.
そういうことで僕はしばらく†**Favorite乞食**†としてやっていくことになりそうです...
## これから
VRChatワールド(特にゲームワールド)作成は フレンドとインタラクティブに遊べる環境を作れるという点で楽しいところもありそうなので, ぼちぼちやっていければと思っています.
最近はJSONをGETしてくる機能だったり, Udon2の開発がほのめかされているのでVRChatのさらなる発展にも期待です.
こういうことをしたいのだったら本当は自由度の高いNeosVRに行けばいいのかもしれません...
<!--
VRCUrlInputField
Ctrl+A, Ctrl+C, Ctrl+V
QRCodeGenerator
OpenBrowser
スコアを表示.
https://www.patreon.com/posts/discord-feedback-60645335
https://booth.pm/ja/items/2794348
https://booth.pm/ja/items/2069807
https://vrcworld.wiki.fc2.com/wiki/Layers
-->
<!--
最近はVRChat Creator Companion(VCC)というパッケージ管理ツール?ができて, 今までSDKのバージョンアップの度にVRChat公式からダウンロードして~という流れが必要だったのですが, その管理が簡単になるようです.
新しくワールドを作るなら, そこからUnity Projectを作ったほうが良さそうです.
-->