Unity Asset Storeで購入済みアセット一覧をワンクリックで取得する方法
Unity Asset Storeの「My Assets」ページでは、購入済みアセットが100件ずつしか表示されず、全体のリストをエクスポートする公式機能もありません。アセットを大量に購入している場合、手動でリスト化するのは現実的ではありません。
そこで、Chrome DevToolsのSnippets機能を使って、ワンクリックで全アセットの名前とカテゴリをTSVファイルとしてダウンロードする方法をClaude Codeに作ってもらいました。
仕組み
Asset StoreのフロントエンドはGraphQL APIを使っています。
CurrentUserクエリのmyAssetsフィールドに、購入済み全アセットのIDが配列で入っている- 各IDに対して
Productクエリを投げると、アセット名やカテゴリなどの詳細が取れる
この2段階のクエリをスクリプトで自動化します。
セットアップ(初回のみ)
- Asset Storeにログインした状態で My Assetsページ を開く
- F12キーで開発者ツールを開く
- Sources タブ → 左パネルの Snippets を選択
- + New snippet をクリックし、名前を
Unity Asset Listにする - 以下のコードを貼り付けて Ctrl+S(Mac: Cmd+S)で保存
ユーザーIDの確認方法
コード内の variables: { id: "XXXXX" } の部分に自分のユーザーIDを入れる必要があります。確認方法:
- My Assetsページを開いた状態で F12 → Network タブ
graphqlでフィルタリング- いずれかのリクエストのPayloadを見ると、
CurrentUserクエリのvariablesに"id": "XXXXX"がある
コード
(async () => { const csrf = document.cookie.match(/_csrf=([^;]+)/)?.[1]; const res = await fetch('/api/graphql/batch', { method: 'POST', headers: { 'Content-Type': 'application/json;charset=UTF-8', 'x-csrf-token': csrf, 'x-requested-with': 'XMLHttpRequest' }, credentials: 'include', body: JSON.stringify([{ query: "query CurrentUser($id: ID!) { user(id: $id) { myAssets } }", variables: { id: "XXXXX" }, operationName: "CurrentUser" }]) }); const d = await res.json(); const ids = [...new Set(JSON.parse(d[0].data.user.myAssets))]; console.log(ids.length + " asset IDs found"); const q = "query Product($id: ID!) { product(id: $id) { id name category { name } } }"; let all = []; for (let i = 0; i < ids.length; i += 50) { const batch = ids.slice(i, i + 50).map(id => ({ query: q, variables: { id }, operationName: "Product" })); const r = await fetch('/api/graphql/batch', { method: 'POST', headers: { 'Content-Type': 'application/json;charset=UTF-8', 'x-csrf-token': csrf, 'x-requested-with': 'XMLHttpRequest' }, credentials: 'include', body: JSON.stringify(batch) }); const data = await r.json(); all.push(...data.map(x => x.data?.product).filter(Boolean)); console.log(all.length + "/" + ids.length); } const blob = new Blob([all.map(p => p.name + "\t" + (p.category?.name || "")).join("\n")], {type: "text/plain"}); const a = document.createElement("a"); a.href = URL.createObjectURL(blob); a.download = "my_assets.tsv"; a.click(); console.log("Done! " + all.length + " items downloaded as my_assets.tsv"); })();
XXXXXの部分は自分のユーザーIDに置き換えてください。
使い方(2回目以降)
- Asset Storeにログインして My Assets ページを開く
- F12 → Sources → Snippets →
Unity Asset Listを右クリック → Run my_assets.tsvが自動ダウンロードされる
たったこれだけです。アセットを買い足したときも同じ手順で最新リストが取得できます。
出力フォーマット
ダウンロードされる my_assets.tsv はタブ区切りで、各行に「アセット名」と「カテゴリ名」が入っています。ExcelやGoogle Sheetsで開けばそのまま表形式で閲覧・検索できます。
注意点
- このスクリプトはUnity Asset Storeの内部GraphQL APIを利用しているため、サイト側の仕様変更で動かなくなる可能性があります
- 自分のアカウントの購入済みアセットを取得するだけなので、利用規約上の問題はないと考えられますが、自己責任でお願いします
- 50件ずつバッチリクエストを送るため、500件程度なら数秒で完了します
Unity キーボード&マウス ↔ GamePad の切り替えが上手く行かなかった
PlayerInputは通常、デバイスの切り替えを自動でやってくれるはずなんですが、それがうまく機能しないシチュエーションがありました。
なんでかなと調べていったら、PlayerInputManagerがシーンに存在したのが良くなかったっぽい。
PlayerInputManagerを削除したら自動で切り替わるようになりました。
PhotonのNetworkRunner.StartGameが異様に重かった
PCだったらまだしも、Switchだと、この部分で数十秒ぐらい掛かってしまっていた。
調べたところネットワークのヒープの確保に時間がかかっているようでした。ヒープサイズをだいぶ大きくしていたのが問題だったので、NetworkProjectConfigで設定できるヒープサイズを小さくすることで解決しました。
日本通信Simを使ってデュアルSimしようと思ったらうまくいかなかった
機種はiPhone13 Pro Max。
もともと使っていた楽天モバイル(eSim)に日本通信の物理Simを追加したのですが、そしたらなんと、楽天モバイルが全然繋がらなくなってしまった。
物理Simを外しても駄目。もはや繋がらない。
楽天モバイルの店舗に行っても解決せず。eSim入れ直しても駄目で、途方に暮れていたのだけれど、日本通信Simを入れたときに追加した構成プロファイルを削除したら、楽天モバイルが復活しました。
構成プロファイルが1個しか入れられないから、デュアルSim、実質無理みたいですね。楽天Sim x 2とかならいけるのかな?
追記
その後、楽天Sim x 2にしているのですが、これはうまく動いています。
SteamからSMSが届かない問題
Steamの二段階認証に必要なSMSが届かない。
なのでサポートに連絡して、いったん電話番号を削除してもらってもう一度登録しようとするも、そのときに必要なSMSが届かない。
一晩おいて、もしかして... っと思って試したのが、
"+81" と書いてある後に、90-xxxx-xxxx で入力するのではなく、090-xxxx-xxxxと登録すること。
なんとこれでSMSが来るようになりました!
良かった良かった。
なんかUnityでプロジェクトファイルが開けなくなった
起動しようにも途中でクラッシュしてしまうという。。。
Libraryフォルダを削除しても、プロジェクトをCloneし直しても、Unityをインストールし直しても駄目でした。
最新のUnityをインストールし、Libraryフォルダを削除した状態で開き直したらプロジェクトを開けました。
さらにその後に元のUnityのバージョンで開いたら大丈夫になりました。
別プロジェクトのPV用にUnityで動画撮影してて、その最中にMacのストレージが枯渇してエラー吐いた後からおかしくなった気がするので、そのときにUnityが内部で使っている何かしらのキャッシュがおかしくなっていたのかも?