# TapFun 接続仕様書 クラウドゲーミング

> クラウドゲーミングで Windows 向けゲームを TapFun に提供するパブリッシャー向けの接続仕様書


## はじめに {#introduction}

> [!WARNING]
> **既知の問題（2026-10-02）**: ゲームパッドの 1 回の入力が 2 回分になる問題があります。詳細とワークアラウンドは [こちら](#known-issue-gamepad-double-input)。

このページは、**クラウドゲーミング**で TapFun にゲームを提供するパブリッシャー・開発者向けの接続仕様書です。Windows 向け exe をクラウド上の Windows サーバーで実行し、プレイヤーのブラウザへストリーミング配信します。主にプレイ時間課金で、アセットの追加ダウンロードが無いタイトルに適しています。

ブラウザで動作するゲームを提供する場合は [Web App 向けの仕様書](../webapp/) を参照してください。

### テストプレイまで {#intro-test-play}

1. 実行可能な exe が格納された zip ファイルを提出いただきます。
2. テスト環境でのプレイ用のリンクをお送りしますので、手触りなどをお試しください。
3. 無料プレイ時間の終了後もテストされる場合は、エナジーやタイトルパスの購入が必要です。決済手段には「AmazonPay」を選択してください（[テスト環境での決済方法](#test-payment)）。

テストプレイの結果、大きな問題が無ければ以下に進みます。

### コミュニケーション手段の確立 {#intro-communication}

- 基本はメールで行います。
- 必要に応じて、両社が参加する Slack コネクトチャネルを TapFun 側で発行します。
- Slack コネクトチャネルへの参加ができない場合は、御社のコミュニケーションツールへ参加させていただきます。

### Publisher Console へのログイン {#intro-publisher-console-login}

exe のアップデートや各種設定は、テスト環境の Publisher Console（`https://<TEST_HOST>/publisher`）で行えます。担当者がログイン権限を付与しますので、ログインされる方のメールアドレスをお伝えください。

### リリース内容の調整 {#intro-release}

動作上の問題の解決の目処が立ちましたら、リリース時期や提供価格を調整します。

### 開発中の問題発生時の対応 {#intro-issue-report}

「操作が反応しない」「意図しない動作がある」といった問題が発生した際は、以下を添えてコミュニケーションチャネルでお知らせください。

- 問題が再現したアプリ名（テスト環境上に同一ゲームが複数ある場合は、アプリ ID など識別できる情報）
- 問題が発生したテスト環境の TapFun ユーザーアカウント（ゲスト状態でのみ発生する場合を除く）
- 発生状況が把握できるスクリーンショット
- スクリーンショットで不足する場合は、再現手順全体の録画
- 問題の再現手順

問題が正常な仕様に起因する場合、双方協議のうえで機能追加や変更を行う場合があります。

### 提出する exe の要件 {#intro-exe-requirements}

- ゲームエンジンは問いません。Windows で起動できる exe であれば対象です。実際に動くかどうかは、非公開のテスト環境で確認します（13 GB のタイトルでも動作実績があります）。
- **インストール工程はありません。** zip を展開して exe を直接起動します。同梱のランタイムのインストーラー（Visual C++ 再頒布可能パッケージ、OpenAL など）は実行されないため、必要な DLL は exe と同じフォルダに置いて同梱してください。
- exe からファイルを絶対パスで参照しないでください。ローカル PC とクラウド上ではパスが異なります。相対パスを使ってください。
- **Steam などのクライアントが無くても起動する必要があります。** Steamworks を使っている場合は、外したビルドにするか、初期化に失敗してもそのまま続行するようにしてください（Steam が無い環境では、初期化が失敗したり起動時に止まったりしがちです）。そのほかの SDK・DRM・ランチャーへの対応は不要です。
- 言語を Steam の設定から決めている場合、TapFun 上では検出できません。OS のロケール、同梱の設定ファイル、または Publisher Console の「exe 起動パラメータ」（タイトル全体に共通）で言語を指定してください。
- 検証には exe そのものが必要です。Steam キーでの検証はできません。
- zip のファイル名は、タイトルが分かる名前にしてください（例: `MyGame_Demo.zip`）。

### exe の調整作業 {#intro-exe-adjustment}

リリースに向けて、exe の調整を行っていただきます。

- セーブデータのディレクトリは [保存できるパス](#runtime-save-data) のいずれかである必要があります。該当していれば、そのディレクトリを TapFun までお伝えください。該当しない場合は exe 側の変更が必要です。**レジストリは使用できません。**
- ウィンドウで起動してしまう場合は、フルスクリーンで起動するようにしてください。
- ゲーム内の設定でフルスクリーンの切り替えが可能な場合は、切り替えできなくすることが望ましいです。
- ゲーム内でユーザーが任意にゲームを終了（＝ exe プロセスの終了）できる場合は、できないようにすることが望ましいです。
- ゲーム内の外部リンク（ストアページやクレジットの URL など）は、プレイヤーのブラウザではなくクラウド上で開こうとするため動作しません。外部の URL を開くときは [openUrl](#api-openurl) を使ってください。
- 「セーブフォルダを開く」のように、Windows の別アプリやフォルダを開く機能は動作しません。表示しないようにしてください。
- 画面上のデバッグ表示は、提出前に消してください。

### テストからリリースまで {#intro-release-flow}

1. **テスト環境で確認する**: テスト環境では、Basic 認証の後に、ご自身で作成した TapFun アカウントでログインします（プレイにはログインが必要です）。Publisher Console のバージョン一覧の「このバージョンで起動」からも起動できます。
2. **本番環境で最終確認する**: 本番の Publisher Console の権限は別途付与します。リリース前は非公開の状態で、[本番でのテストプレイ](#production-test-play)の方法で確認してください。
3. **公開する**: 公開作業は TapFun が行います。公開時刻は 10:00〜17:00 の間で調整できます。

- exe を受け取ってから公開までの目安は約 1 か月です（クラウド環境の準備と、クラウド版での確認・調整を含みます）。
- Publisher Console には権限の区別がありません。ログインできる方は全員が同じ操作をできます。ログインできる方を追加する場合は、メールアドレスを TapFun にお知らせください。

### デバッグ {#intro-debugging}

ゲーム実行ページの URL に次のパラメータを付けると、[クライアント API](#client-api) のやり取りを確認できます。

| パラメータ | 内容 |
| --- | --- |
| `?debugLog=1` | ゲーム画面の上にログ表示領域を出します。TapFun が受け取ったクライアント API のリクエスト（[consoleLog](#api-consolelog) を含む）が表示されます。 |
| `?verbose=1` | ブラウザのデベロッパーツールのコンソールに詳細なログを出します。consoleLog の `data` もここに出力されます。 |

### プレイヤーからの問い合わせ {#intro-support}

- TapFun のプラットフォームに関する問い合わせ（ログイン、決済、起動できないなど）は TapFun が対応します。必要に応じて、プレイヤー ID を添えてパブリッシャー様に共有します。
- ゲームの内容に関する問い合わせは、パブリッシャー様の窓口へご案内します。問い合わせ窓口（フォームなど）をご用意いただき、TapFun にお知らせください。

### FAQ {#faq}

**Q. ゲーム画面をクリックするまで音が出ません。**
A. ブラウザの制約による挙動（仕様）です。

**Q. ゲームパッドが反応しません。**
A. ゲーム画面をクリックした後に反応します。状況によってはクリックしなくても反応しますが、基本として最初にゲーム画面のクリックが必要です。

**Q. iPhone でほかのアプリから戻ると、音が出なくなります。**
A. 毎回ではありませんが、すべてのタイトルで起きることがあります。音が出ないまま一度ホーム画面に戻り、もう一度ブラウザに戻ると回復します。

## 環境 {#environments}

### ホスト名 {#hosts}

| TapFun 環境 | ホスト名 | Web UI の Basic 認証 |
| --- | --- | --- |
| テスト | 担当者にお問い合わせください（本ドキュメントでは `<TEST_HOST>` と表記） | あり（ID / パスワードは担当者にお問い合わせください） |
| 本番 | `https://tapfun.co.jp` | なし |

テスト環境のホスト名と Basic 認証の ID / パスワードは秘匿情報です。このドキュメントには記載していませんので、TapFun の担当者にお問い合わせください。コード例などの `<TEST_HOST>` はテスト環境のホスト名に置き換えてください。社外や公開の場（公開リポジトリ、公開チャンネルなど）には記載しないでください。

### テスト環境での決済方法 {#test-payment}

テスト環境でエナジーやタイトルパスを購入する際は、次のいずれかを使用してください。

- **AmazonPay**: 選択すると「マルチペイメントサービス テスト環境」に遷移します。「決済する」を選択すると決済できます。
- **テスト用クレジットカード**: 番号 `4111111111111111`、有効期限は未来の任意の年月、セキュリティコードは任意の 3 桁の数字。

### 本番でのテストプレイ {#production-test-play}

リリース前のアプリにアクセスするには、Publisher Console の基本情報でメンテナンスモードを有効にし、「メンテナンス例外メールアドレス」にテストプレイするユーザーのメールアドレスを入力してください。

本番で購入を伴うテストを行う場合は、TapFun 側でアプリごとにテストプレイ用アカウントを登録します。このアカウントには対象アプリでのみ使える TapFun クレジットが付与されます。テストプレイ用アカウントの購入は即座に取り消され、売上から相殺されます。

## Publisher Console {#publisher-console}

### 基本情報 {#pc-basic}

| 項目 | 説明 |
| --- | --- |
| アプリ ID | アプリの内部 ID です。 |
| name | 内部名です。 |
| apiKey | [Web API](#web-api) を呼ぶ際の API キーです。 |
| Bearer token | Web API を呼ぶ際の `Authorization: Bearer` の値です（`アプリID_apiKey` の形式）。 |
| メンテナンスモード | 有効にするとメンテナンスモードになります。 |
| メンテナンス例外メールアドレス | メンテナンス中でもプレイできるユーザーのメールアドレスです（改行区切り）。リリース前の非公開アプリでも、メンテナンスモードを有効にするとこのアドレスのアカウントからアクセスできます。 |
| folder | アップロードするバイナリの zip 内のフォルダ名です。 |
| exe | zip 内で実行する exe のファイル名です。 |
| exe 起動パラメータ | コマンドライン起動オプションです。例: `--debug=on --verbose` |
| デスクトップ横幅 / 高さ | クラウドレンダリングサーバー上のデスクトップ解像度です。既定は 1920x1080 です（横幅 720〜1920、高さ 480〜1080）。 |
| セーブデータディレクトリ | セーブデータのディレクトリです。中のファイルはすべてセーブデータとして保存・復元されるため、セーブデータ以外のファイルを入れないでください。変更はご相談ください（[ユーザーデータの保存復元](#runtime-save-data)）。 |
| ゲームパッド対応 | ゲームパッドで操作できるタイトルで有効にします。有効にすると、スマートフォン・タブレットからもプレイできるようになります（[対応する入力](#runtime-input)）。 |
| バーチャルパッドデフォルト | スマートフォン・タブレットで、画面上のバーチャルパッドを最初から表示するかどうかです。タップ操作だけで遊べるタイトルは無効にしてください。 |
| ポインターデバイス対応 | マウスで操作できるタイトルで有効にします。 |
| マウスカーソル常時表示 | マウスカーソルのキャプチャが必要なゲーム向けの設定です。 |

### 詳細情報（紹介ページ） {#pc-detail}

「詳細情報」タブでは、TapFun 上のゲーム紹介ページに表示する内容を編集します。

| 項目 | 説明 |
| --- | --- |
| アイコン画像 | ゲームのアイコンです。推奨解像度は 512x512（正方形）です。 |
| 2:1 画像 | 一覧や紹介ページで使う横長の画像です。推奨解像度は 1920x960 です。 |
| ローディング画像 PC / SP | ゲームの起動中に表示する画像です。推奨解像度は PC が 600x520、スマートフォンが 300x260 です。 |
| 操作説明画像 | プレイ中に TapFun の画面から開ける操作説明の画像です（任意）。 |
| スクリーンショット画像 | 紹介ページに表示するスクリーンショットです。 |
| ゲームタイトル | 紹介ページなどに表示するゲームの名前です。 |
| 開発元 / パブリッシャー | 紹介ページに表示する開発元とパブリッシャーの名前です。 |
| ゲーム詳細紹介文 | 紹介ページの本文です。[Markdown](https://marked.js.org/#specifications) 形式で書けます。 |
| サードパーティー EULA | ゲームに含まれるサードパーティーの使用許諾など、紹介ページに表示する規約の文面です。 |

操作説明画像とスクリーンショット画像は、ドラッグで並べ替えられます。削除するときは、画像をクリックして削除マークを付けたあと、「追加アップロード & 順序を保存」を押すと反映されます。

### 販売情報 {#pc-sales}

「販売情報」は表示のみです。DLC 以外の変更は TapFun にご相談ください。

| 項目 | 説明 |
| --- | --- |
| お試し分数 | 1 回あたりの無料プレイ時間です。1 回分は 12 時間後に回復します。 |
| パス未所有時 1 エナジープレイ分数 | タイトル利用パスを持っていないプレイヤーが、エナジー 1 つでプレイできる時間です。 |
| タイトル利用パス価格 | タイトル利用パスの価格です。 |
| タイトル利用パス購入後無料時間 | タイトル利用パスの購入後に、無料でプレイできる時間です。 |
| タイトルパス所有時 1 エナジープレイ分数 | タイトル利用パスを持っているプレイヤーが、エナジー 1 つでプレイできる時間です。 |
| DLC (YAML) | [DLC](#pc-dlc) の定義です。 |

### DLC {#pc-dlc}

- Publisher Console 上で、TapFun のウェブページで販売する DLC を管理します。
- タイトル利用パス販売時には、DLC は「タイトル利用パス同梱版」および「通常版購入後の単体 DLC」として販売されます。
- DLC の内容は YAML 形式で記述します。複数登録できます（数の制限はありませんが、複数登録する際は事前にご相談ください）。
- 購入済みの DLC がある場合、exe 起動時に `--dlcs 識別子,識別子,...` を引数に渡します（[起動パラメータ](#runtime-launch-params)）。

```yaml
- name: Digital Deluxe Upgrade
  code: digital_deluxe_upgrade
  price: 3270
  bundlePrice: 2000
  archived: false
  description: |
    通常版を Digital Deluxe Upgrade 版にアップグレードします。
    ・コラボ衣装（6 着）
    ・撮影機能「フォトフレーム」（6 種）
```

| キー | 型 | 説明 |
| --- | --- | --- |
| `name` | string | 商品名です。 |
| `code` | string | DLC の識別子です。`--dlcs` に渡される値です。 |
| `price` | number | DLC 単体の金額です。 |
| `bundlePrice` | number | タイトルパス同梱版として販売する際の金額です。タイトルパス価格＋この金額が同梱版の価格になります。 |
| `archived` | bool | `true` にすると追加コンテンツ（および同梱版）として非表示になります。 |
| `description` | string | 通常版購入者向けの説明文です。改行が反映されます。 |

### Steam {#pc-steam}

Steam のストアページがあるタイトルでは、PC 幅のプレイ画面に Steam ストアの購入ウィジェットを表示します。

| 項目 | 説明 |
| --- | --- |
| Steam AppID | 表示する Steam のアプリ ID です。変更は TapFun にご相談ください。 |
| 追跡用パラメータ (utm) | Steam ストアへのリンクに付ける `utm_source` / `utm_medium` / `utm_campaign` / `utm_term` / `utm_content` です（各 100 文字まで）。Steam が引き継ぐのはこの 5 種類だけです。 |

### バイナリ更新方法 {#pc-binary-update}

- 使用中のバージョンを含めて 5 つまでアップロードできます。使用中以外のバージョンは削除できます。
- アップロード後、バージョン一覧から「First Release」を選択してリリースします（[リリース時のセッションの扱い](#pc-binary-release-sessions)）。
- アップロード済みのバージョンを選んでゲームを起動できます。
- 新しくアップロードしたバージョンを一度リリースするまで、追加のバージョンはアップロードできません。
- テスト環境・本番環境ともに同じ操作で更新できます。
- 「First Release」にしたバージョンが、プレイヤーが起動するバージョンになります。以前のバージョンを「First Release」にすれば、前のビルドに戻せます。
- アップロード後、使えるようになるまでに処理時間がかかります。目安は 1〜5 GB で 30 分以内です。複数のバージョンを同時にアップロードしないでください。
- アップロード後に状態が「失敗」になる場合があります。削除して再試行しても成功しない場合は TapFun までご連絡ください。

#### リリース時のセッションの扱い {#pc-binary-release-sessions}

| 状況 | 挙動 |
| --- | --- |
| アップロード中・アップロード直後 | プレイヤーには影響しません。プレイヤーが起動するのは「First Release」にしたバージョンだけです。 |
| 「First Release」を押したとき | 新しいバージョンが使われるのは、リリース後に**新しく開始したセッション**からです。TapFun 側から、実行中のセッションを終了させることはありません。 |
| 実行中のセッション | リリース前に開始したセッションは、そのまま続きます。プレイヤーが新しいバージョンを遊ぶには、ゲームを終了して起動し直す必要があります。 |
| セーブデータ | TapFun アカウントごとに保持され、バージョンを切り替えても引き継がれます。新旧のバージョンで同じセーブデータを読めるようにしてください。 |
| 前のバージョンに戻す | 戻したいバージョンの「Revert Version」を押します。挙動は「First Release」と同じで、戻したあとに開始したセッションから適用されます。 |
| リリース前に動作を確認する | バージョン一覧の「このバージョンで起動」で、リリースしていないバージョンも新しいセッションで起動できます（ほかのプレイヤーには影響しません）。 |

「バイナリ」タブの画面:

- **zip の構造**: zip の中に「folder」のフォルダがあり、その中に「exe」があるようにします（`<folder>/<exe>`）。
- **アップロードできない場合の表示**: 「失敗したバージョンを削除してください」「不要なバージョンを削除してください」（5 つに達している）「First Release 待ちのバージョンがあります」のいずれかが表示されたら、その指示に従ってください。
- **ApplicationVersions**: アップロード済みのバージョンの一覧です。バージョンごとに「First Release」（リリース）、「Revert Version」（以前のバージョンに戻す）、「削除」、「このバージョンで起動」を操作できます。
- **ツール → セーブデータダウンロード**: TapFun ユーザー ID を入力すると、そのプレイヤーのセーブデータをダウンロードできます（ゲーム終了から数分後に行ってください）。

### ゲームの起動 {#pc-launch}

アプリ画面上部の「アプリページ」から、次のオプションを付けてゲームを起動できます（[デバッグ](#intro-debugging)）。リリース前のアプリには「非公開状態」と表示されます。

| オプション | 説明 |
| --- | --- |
| 新規セッション | 既存のセッションを使わず、新しいセッションでゲームを起動し直します。 |
| パフォーマンスモニタ | PC のプレイ画面にパフォーマンスモニタを表示します。 |
| ログ表示 | 画面上に consoleLog API などのログを表示します（URL の `?debugLog=1` と同じ）。 |
| verbose | ブラウザのコンソールに出すログの量を増やします（URL の `?verbose=1` と同じ）。 |

### そのほかのタブ {#pc-other-tabs}

| タブ | 内容 |
| --- | --- |
| 月別売上 | 日ごとの購入回数・売上・取消と、売上区分（Platform / Publisher）ごとの内訳です。 |
| CustomEvents | [クライアント API](#client-api) で送られたリクエスト（`custom_event`）の記録です。 |
| Leaderboards | リーダーボードとエントリーの一覧です。 |
| Times | プレイヤーごとのプレイ時間（無料・お試し・エナジー・合計）と、タイトル利用パスの購入日時などの記録です。 |
| 紹介ページ | TapFun 上のゲーム紹介ページを別タブで開きます。 |

## クラウド実行環境 {#cloud-runtime}

### 動作概要【重要】 {#runtime-overview}

TapFun は「リモートデスクトップ方式」でゲームをサーバー内で起動し、ブラウザからリモート操作します。クラウドゲーミングの基盤には [Tencent CAR](https://www.tencentcloud.com/jp/document/product/1158/49599) を使用しています。

- クラウド上の Windows サーバー（Windows Server 2019 / 2022）で exe を実行します。
- デスクトップ画面のグラフィックとオーディオ出力をキャプチャし、ブラウザ（tapfun.co.jp）内の canvas 要素へストリーミングします。**ゲーム画面はフルスクリーンで起動してください。**
- canvas 内のマウス操作・キーボード操作は Windows サーバー上の exe に送られます。
- ゲームの容量に制限はありません。
- 画面解像度は最大 1920x1080（既定）、リフレッシュレートは最大 60 fps です。解像度は Publisher Console の「デスクトップ横幅 / 高さ」で変更できます。
- Windows Media Foundation 経由で再生できる動画形式は H.264 / H.265 です。VP9 は使用できません。
- アセットの追加ダウンロードは通常行えません（ユーザー単位のデータとして保存されるため、容量次第でご相談になります）。
- Tencent CAR の各種機能・API の使用を希望される場合はご連絡ください。

### サーバー性能 {#runtime-server-spec}

| プラン | CPU | メモリ | GPU 性能 | GPU | Furmark 2 1080p スコア | GPU 性能目安 |
| --- | --- | --- | --- | --- | --- | --- |
| S | 4 コア | 8 GB | 2TF SP/30T | Tesla T4 / GRID T4-8Q 他 | 2600〜3200 | GTX 1650 |
| M | 4 コア | 16 GB | 4TF SP/30T | Tesla T4 / GRID T4-8Q 他 | 2600〜3200 | RTX 3050〜3060 |

### ネットワーク要件 {#runtime-network}

ゲーム実行環境からゲームサーバーへ通信する場合の要件です。

- **受信の許可**: すべての送信元から UDP 8000 および 60000〜60100 への受信を許可してください。
- すべての送信元を許可できない場合、テスト環境では次の IP のみ許可することで実行できます。
  `124.156.222.35`, `124.156.224.128`, `43.130.251.233`, `43.133.176.140`, `43.133.180.230`, `43.133.218.250`, `43.153.145.189`, `43.153.153.36`, `43.153.155.47`, `43.153.157.78`, `43.163.247.41`, `150.109.195.27`
- **接続元 IP**: exe を実行するサーバーから外部へ HTTP 等で通信する際の接続元 IP は非公開です。

### ユーザーデータの保存復元 {#runtime-save-data}

ユーザーデータは起動時に自動で復元され、終了時に自動で保存されます。

- 保存復元するディレクトリはゲームタイトルごとに設定でき、ディレクトリは **1 つ** のみです。保存容量は合計 **100 MB 以内** を推奨します。
- セーブデータは TapFun アカウントごとに保持され、ビルドを更新してもそのまま引き継がれます。
- クラウドストレージへの保存はゲーム終了後に行われます。**Publisher Console からセーブデータをダウンロードする場合は、ゲーム終了から数分後に行ってください。**
- 保存できるパスは次のいずれかの配下です。
  - `C:\Users\%UserName%\AppData\Local\<任意のディレクトリ>`
  - `C:\Users\%UserName%\AppData\LocalLow\<任意のディレクトリ>`
  - `C:\Users\%UserName%\AppData\Roaming\<任意のディレクトリ>`
  - `<アップロードした zip のルートディレクトリ>\<任意のディレクトリ>`
- exe と同じフォルダに直接置いたファイルは保存されません。exe と同じフォルダから 1 階層以上下のフォルダを作り、その中に保存してください。
- **セーブデータディレクトリには、セーブデータ以外のファイルを入れないでください。** ディレクトリ内のファイルはすべてセーブデータとして保存・復元されます。DLL やアセットなどが入っていると、アップロードした zip の最新のファイルではなく、保存されていた古いファイルが復元され、不具合の原因になります。
- `%UserName%` は Windows のログインユーザー名です。ある程度固定的ですが基本的にランダムなため、参照は 1 セッション内に留めてください。
- 任意のディレクトリ名は TapFun までお知らせください。レジストリへの保存は復元されません。Unity の `PlayerPrefs` は Windows ではレジストリに保存されるため、ファイルに保存するよう変更してください。
- セーブデータを初期化する機能はありません。初回だけの動作（チュートリアルなど）は、別の TapFun アカウントで確認してください。
- 保存先の設定が終わるまでは、セーブの挙動は正しく動きません。セーブまわりの確認は、保存先の設定後に行ってください。

保存先の例:

| ゲームエンジンなど | 保存先の例 |
| --- | --- |
| Unity（`Application.persistentDataPath`） | `C:\Users\%UserName%\AppData\LocalLow\<会社名>\<製品名>` |
| Godot 4 | `C:\Users\%UserName%\AppData\Roaming\Godot\app_userdata\<プロジェクト名>` |
| Electron（localStorage を含む） | `C:\Users\%UserName%\AppData\Roaming\<アプリ名>` |
| アクションゲームツクールMV | `C:\Users\%UserName%\AppData\Local\<フォルダ名>\save` |

### 対応する入力 {#runtime-input}

プレイヤーの操作は、クラウド上の Windows に次の入力として届きます。

| プレイヤーの操作 | exe から見える入力 |
| --- | --- |
| キーボード（PC） | Windows の通常のキーボード入力 |
| マウス（PC） | Windows の通常のマウス入力。Publisher Console の「ポインターデバイス対応」を有効にしたタイトルで使えます |
| タッチ（スマートフォン・タブレット） | マウスクリック |
| ゲームパッド（PC）・バーチャルパッド（スマートフォン・タブレット） | 仮想ゲームパッド |

- スマートフォン・タブレット（iOS / Android）からプレイできるのは、Publisher Console の「ゲームパッド対応」を有効にしたタイトルです。プレイヤーは画面上のバーチャルパッド（スティック・十字キー・各ボタン、Esc キーのボタン）またはタップで操作します。タップ操作だけで遊べるタイトルは、「ゲームパッド対応」を有効にし、「バーチャルパッドデフォルト」を無効にしてください。
- バーチャルパッドの入力はゲームパッドとして届くため、ゲーム側の追加の実装は不要です（Unreal Engine では、エンジンのゲームパッド設定がそのまま使えます）。
- スマートフォン・タブレットからはキーボード入力を送れません。キーを押さないと先に進めない場面（「A キーで開始」など）があると、スマートフォン・タブレットでは進めなくなります。タップかゲームパッドでも操作できるようにしてください。
- タッチ端末に仮想のマウスカーソルはありません。タッチはその位置へのマウスクリックとして届きます。2 本目以降の指（マルチタッチ）は区別できない場合があります。
- ゲームパッドの振動には対応していません。
- ゲームパッドとバーチャルパッドは、ゲーム画面を一度クリック（タップ）してから反応します（[FAQ](#faq)）。

### ゲームパッド {#runtime-gamepad}

ほとんどの場合、そのままゲームパッドで操作できます。

> [!WARNING]
> #### 既知の問題（2026-10-02）: ゲームパッドの 1 回の入力が 2 回分になる {#known-issue-gamepad-double-input}
>
> - **現象**: ゲームパッドを接続すると、クラウド上の Windows に仮想パッドが 2 台（Xbox 360 互換と DualShock 4 互換）作られ、同じ入力が両方に届きます。接続中のすべてのパッドを読むゲーム（Unity の Input System、SDL、Windows.Gaming.Input の RawGameController など）では、1 回押すと 2 回分の入力になります（例: 移動が 2 マス進む、拾う操作ですぐ置いてしまう）。XInput だけを読むゲームでは起きません。
> - **対象**: PC のゲームパッド、スマートフォン・タブレットのバーチャルパッドの両方。
> - **原因と状況**: クラウドゲーミングの基盤（Tencent CAR）側の問題です。TapFun から修正を依頼しています。修正され次第、このページを更新します。
> - **対処**: 修正までの間は、下記の[ワークアラウンド](#known-issue-gamepad-workaround)をご検討ください。

#### ワークアラウンド {#known-issue-gamepad-workaround}

ゲーム側で、入力を受け付けるゲームパッドを 1 台に絞ります。

1. 最初に入力（ボタンかスティック）があったゲームパッドを「担当」にし、それ以外のゲームパッドの入力は無視する。
2. 担当が切断されたら担当を解除し、次に入力があったゲームパッドを新しい担当にする。
3. 通常の PC でプレイヤーがパッドを持ち替えた場合に備えて、担当の入力が 1 秒ほど無いときだけ、ほかのゲームパッドの入力で担当を切り替える。

クラウド上の 2 台には数ミリ秒差で同じ入力が届くため、どちらが担当になっても操作は変わりません。パッドの種類や名前で判定しないので、通常の PC でも、基盤が修正されて 1 台に戻った後も、そのままで問題なく動きます。

### 起動パラメータ {#runtime-launch-params}

TapFun と API 連携するアプリに限り、exe の起動パラメータに `--tapfun-user-id` などを付与して起動します。**既定では付与しません。** 必要な場合は TapFun 担当者にご連絡ください（管理画面で有効にします）。付与しない場合、exe には Publisher Console の「exe 起動パラメータ」の値だけが渡ります。

```text
C:\Apps\%UserName%\TapFunDebugConsoleApp.exe --type car --port 10100 --bearer-token 123_AAABBBCCC --api-host <TEST_HOST> --sig-key FFFGGGHHH --is-paid-timer 0 --is-sp 0 --tapfun-user-id PLYR01HE2R3JV6Y2NEGRMS4KZQB861DBG --dlcs delux_upgrade,special_upgrade --username=%E3%81%82%E3%81%84
```

| パラメータ | 説明 |
| --- | --- |
| `--type` | `car` 固定です。 |
| `--port` | [CAR Data Channel](https://www.tencentcloud.com/jp/document/product/1158/51428) 用の UDP ポート番号です。通常は `10100` 固定です。 |
| `--bearer-token` | [Web API](#web-api) および [クライアント API の送信](#client-api-transport) で使う Bearer token です。 |
| `--api-host` | Web API のホスト名です（例: 本番は `tapfun.co.jp`）。 |
| `--sig-key` | Publisher Console の署名用キー（sigKey）です。 |
| `--tapfun-user-id` | [TapFun ユーザー ID](#glossary-user-id) です。秘匿データではありませんが、**画面上には表示しないでください。** |
| `--dlcs` | 購入済みの [DLC](#pc-dlc) の `code` をカンマ区切りで渡します。 |
| `--username` | ユーザー名です。URL エンコード済みの UTF-8、デコード後 1〜12 文字、絵文字不可です。 |
| `--is-paid-timer` | `1`: 有料タイマーユーザー / `0`: 無料タイマーユーザー |
| `--is-sp` | `1`: スマートフォンユーザー / `0`: それ以外 |

## クライアント API {#client-api}

exe と、プレイヤーのブラウザ上の TapFun との通信用 API です。送信データは一旦ユーザーのブラウザを通るため、**秘匿情報は含めないでください。**

| API | 概要 |
| --- | --- |
| [openUrl](#api-openurl) | 別タブで URL を開く |
| [inputTextSingleLine](#api-inputtextsingleline) | 1 行文字入力モーダル |
| [inputTextMultiLine](#api-inputtextmultiline) | 複数行文字入力モーダル |
| [inputTextMultiLineChunkText](#api-inputtextmultilinechunktext) | 複数行入力の初期テキストを分割送信 |
| [copyText](#api-copytext) | クリップボードへコピーできるモーダル |
| [showText](#api-showtext) | テキストモーダル |
| [getPlayerEnvironment](#api-getplayerenvironment) | プレイヤー環境の取得 |
| [launchSuccessNotice](#api-launchsuccessnotice) | 起動成功通知 |
| [consoleLog](#api-consolelog) | ログ表示 |
| [clientStatus](#api-clientstatus) | クライアント状態の通知（自動送信） |

### 通信仕様 {#client-api-transport}

送信は TapFun の HTTP API への POST、受信は exe 内での UDP 待ち受けです。送信には `--tapfun-user-id` と `--bearer-token` が必要です（[起動パラメータ](#runtime-launch-params)）。

**送信**

| 項目 | 内容 |
| --- | --- |
| 送信先 | `https://<環境のホスト名>/api/v1/custom_event?userId=<TapFunユーザーID>` |
| メソッド | HTTP POST |
| Content-Type | `application/x-www-form-urlencoded` |
| 認証 | `Authorization: Bearer <Bearer token>`（例: `Authorization: Bearer 123_NWU0MjlkY2ViYTVkOTdiYjIw`） |
| 文字コード | UTF-8 |
| 最大サイズ | 10 MB |
| ブラウザへの伝達 | WebSocket |

**受信**

| 項目 | 内容 |
| --- | --- |
| 方式 | [CAR Data Channel](https://www.tencentcloud.com/jp/document/product/1158/51428)。ローカル UDP ポート `10100`（`--port`）で LISTEN |
| 文字コード | UTF-8 |
| データ形式 | クエリストリング形式（例: `from=getPlayerEnvironment&isSP=0`）。**半角スペースは `%20` でエンコードされます。** |

### サンプル Unity プロジェクト {#client-api-sample-project}

- GitHub: <https://github.com/tapfuncojp/debug-console-app>（閲覧には GitHub アカウント名が必要です。お知らせください）

送信のサンプル（Unity / C#）:

```csharp
public IEnumerator SendCustomEventToCar(string userId, WWWForm formData)
{
    // config.apiHost = --api-host, config.bearerToken = --bearer-token
    string url = $"https://{config.apiHost}/api/v1/custom_event?userId={userId}";
    using (UnityWebRequest www = UnityWebRequest.Post(url, formData))
    {
        www.SetRequestHeader("Authorization", $"Bearer {config.bearerToken}");
        yield return www.SendWebRequest();
    }
}
```

受信のサンプル（Unity / C#）:

```csharp
private UdpClient udpServer;
private IPEndPoint udpEndPoint;
private Thread serverThread;
private int udpServerPort = 10100; // --port
private bool isDataChannelReceiveLoopRunning = false;

public void CarHandleDataChannel()
{
    try
    {
        udpEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), udpServerPort);
        udpServer = new UdpClient(udpEndPoint);
        isDataChannelReceiveLoopRunning = true;
        serverThread = new Thread(CarDataChannelReceiveLoop);
        serverThread.IsBackground = true;
        serverThread.Start();
    }
    catch (Exception e)
    {
        Debug.LogError($"Failed to start UDP server: {e.Message}");
    }
}

private void CarDataChannelReceiveLoop()
{
    while (isDataChannelReceiveLoopRunning)
    {
        try
        {
            byte[] receivedBytes = udpServer.Receive(ref udpEndPoint);
            string receivedMessage = Encoding.UTF8.GetString(receivedBytes); // クエリストリング形式
            byte[] responseBytes = Encoding.UTF8.GetBytes("OK");
            udpServer.Send(responseBytes, responseBytes.Length, udpEndPoint);
            lock (queueLock)
            {
                receivedMessagesQueue.Enqueue(receivedMessage);
            }
        }
        catch (Exception e)
        {
            Debug.LogError($"Unexpected error in receive loop: {e.Message}");
            Thread.Sleep(1000); // 予期しないエラーの場合は少し待ってから継続
        }
    }
}
```

### openUrl {#api-openurl}

指定した URL を別タブで開きます。

| パラメータ | 必須 | 説明 |
| --- | :-: | --- |
| `req` | ✓ | `openUrl`（固定） |
| `url` | ✓ | 別タブで開く URL |

レスポンス通知: なし

### inputTextSingleLine {#api-inputtextsingleline}

1 行の文字入力モーダルを表示します。

| パラメータ | 必須 | 説明 |
| --- | :-: | --- |
| `req` | ✓ | `inputTextSingleLine`（固定） |
| `label` | | レスポンス識別用ラベル |
| `title` | | モーダルのタイトル |
| `placeholder` | | プレースホルダー |
| `text` | | デフォルト文字列（最大 128 文字） |
| `submit` | | 入力完了ボタンの文字列 |
| `cancel` | | キャンセルボタンの文字列 |
| `position` | | 表示位置。省略時は中央、`bottom` で下部 |
| `maxlength` | | 最大文字数（デフォルト 128、最大 128） |
| `pattern` | | [HTML input 要素の pattern 属性](https://developer.mozilla.org/ja/docs/Web/HTML/Reference/Attributes/pattern) の値 |
| `invalid` | | `pattern` に一致しない場合のメッセージ（`setCustomValidity` に渡されます） |

レスポンス通知:

| キー | 入力完了 | 入力キャンセル |
| --- | --- | --- |
| `from` | `inputTextSingleLine` | `inputTextSingleLine` |
| `label` | リクエストの `label` | リクエストの `label` |
| `result` | `submit` | `cancel` |
| `text` | 入力文字列（最大 128 文字） | 入力文字列 |

### inputTextMultiLine {#api-inputtextmultiline}

複数行の文字入力モーダルを表示します。

| パラメータ | 必須 | 説明 |
| --- | :-: | --- |
| `req` | ✓ | `inputTextMultiLine`（固定） |
| `label` | | レスポンス識別用ラベル |
| `title` | | モーダルのタイトル |
| `placeholder` | | プレースホルダー |
| `submit` | | 入力完了ボタンの文字列 |
| `cancel` | | キャンセルボタンの文字列 |
| `position` | | 表示位置。省略時は中央、`bottom` で下部 |
| `maxlength` | | 最大文字数（デフォルト 128、最大 10000。改行は 1 文字） |
| `text` | | デフォルト文字列 |
| `end` | | [inputTextMultiLineChunkText](#api-inputtextmultilinechunktext) で送信したシーケンスの終了番号 |

レスポンス通知: 入力が 128 文字を超える場合は、128 文字ずつのシーケンスに分割して複数回通知されます。

| キー | 入力完了 | 入力キャンセル |
| --- | --- | --- |
| `from` | `inputTextMultiLine` | `inputTextMultiLine` |
| `label` | リクエストの `label` | リクエストの `label` |
| `result` | `submit` | `cancel` |
| `text` | 入力文字列（最大 128 文字） | — |
| `seq` | シーケンス番号（1〜`end`） | — |
| `end` | シーケンス最終番号 | — |

### inputTextMultiLineChunkText {#api-inputtextmultilinechunktext}

[inputTextMultiLine](#api-inputtextmultiline) の初期テキストを分割して事前送信します。すべて送信した後に `inputTextMultiLine` を `end` 付きで送ると、分割した文字列を結合してモーダルを開きます。長いテキストを分けて送りたい場合に使用します。

| パラメータ | 必須 | 説明 |
| --- | :-: | --- |
| `req` | ✓ | `inputTextMultiLineChunkText`（固定） |
| `text` | ✓ | 文字列 |
| `seq` | ✓ | シーケンス番号（最大 100） |

レスポンス通知: なし

### copyText {#api-copytext}

テキストをクリップボードにコピーできるモーダルを表示します。

| パラメータ | 必須 | 説明 |
| --- | :-: | --- |
| `req` | ✓ | `copyText`（固定） |
| `title` | | モーダルのタイトル |
| `text` | ✓ | コピーする文字列 |

レスポンス通知: なし

### showText {#api-showtext}

テキストモーダルを表示します。

| パラメータ | 必須 | 説明 |
| --- | :-: | --- |
| `req` | ✓ | `showText`（固定） |
| `text` | ✓ | 表示する文字列 |

レスポンス通知: なし

### getPlayerEnvironment {#api-getplayerenvironment}

プレイヤーの環境を取得します。

| パラメータ | 必須 | 説明 |
| --- | :-: | --- |
| `req` | ✓ | `getPlayerEnvironment`（固定） |

レスポンス通知:

| キー | 説明 |
| --- | --- |
| `from` | `getPlayerEnvironment` |
| `userAgent` | ブラウザの `navigator.userAgent` |
| `isSP` | `1`: スマートデバイス（iPhone / iPad / Android） / `0`: それ以外 |
| `authenticated` | `1`: ログイン中 / `0`: ゲスト状態 |
| `isPaidTimer` | `1`: 有料残り時間の利用ユーザー（1 秒以上の残り時間がある） / `0`: それ以外 |

### launchSuccessNotice {#api-launchsuccessnotice}

起動成功をプラットフォームに通知します。送信すると「ストリーミングを開始しています」のダイアログを早めに消せます。

起動成功通知待ちが有効なアプリでは、この通知を受信するか一定以上のストリーミングが持続するまで、マウス操作を受け付けません（プロセス起動完了前のマウス操作で応答待ちが発生するのを避けるため）。操作できない間はタイマーを消費しません。対象のアプリかどうかは事前にお伝えします。

| パラメータ | 必須 | 説明 |
| --- | :-: | --- |
| `req` | ✓ | `launchSuccessNotice`（固定） |

レスポンス通知: なし

### consoleLog {#api-consolelog}

ログを出力します。ゲーム実行ページの URL に `?verbose=1` を付けるとブラウザのデベロッパーツールのコンソールに、`?debugLog=1` を付けると画面上のログ表示領域に表示されます（[デバッグ](#intro-debugging)）。

| パラメータ | 必須 | 説明 |
| --- | :-: | --- |
| `req` | ✓ | `consoleLog`（固定） |
| `data` | ✓ | 文字列または JSON 文字列。`JSON.parse()` できた場合は JSON オブジェクトとしてコンソールに表示します。 |

レスポンス通知: なし

### clientStatus {#api-clientstatus}

クライアント側の状態変化を通知します（リクエスト不要、自動送信）。

| `result` | 発生タイミング | 追加キー |
| --- | --- | --- |
| `lastTimeRemain` | プレイ残り時間が 90 秒前に達した | `second`: 秒数（`90`） |
| `purchaseSelectModalOpen` | プレイ時間購入モーダルを表示した | — |
| `lastTimeInfoModalOpen` | 残り時間モーダルを表示した | — |
| `manualOpen` | 操作説明を表示した | — |
| `isPaidTimer` | 有料タイマーユーザーになった | — |
| `isFreeTimer` | 無料タイマーユーザーになった | — |

すべての通知に `req=clientStatus` が付きます。例: `req=clientStatus&result=lastTimeRemain&second=90`

## Web API {#web-api}

パブリッシャー様のサーバー、または exe から呼び出す HTTP API です。

### 共通仕様 {#web-api-common}

| 項目 | 内容 |
| --- | --- |
| ベース URL | `https://<環境のホスト名>/api/v1`（[ホスト名](#hosts)） |
| メソッド | HTTP GET / POST |
| 文字コード | UTF-8 |
| リクエスト形式 | URL パス、クエリストリング、POST データ（`application/x-www-form-urlencoded`。個別に記載があるものを除く） |
| レスポンス形式 | JSON。配列の結果が 0 件の場合は空配列。HTTP ステータスは記載が無い限り 200 |
| 日時 | UTC、`yyyy-mm-ddThh:mm:ss.sssZ` |

### 認証 {#web-api-auth}

HTTP ヘッダー `Authorization: Bearer <アプリID>_<APIキー>`（Publisher Console の Bearer token）で認証します。

```text
Authorization: Bearer 123_NWU0MjlkY2ViYTVkOTdiYjIwNThmZTkxMDMzYWM4Y2JmNGUyMTQ0Ng
```

認証失敗時は HTTP 403 で次を返します。

```json
{"error":"no authorization"}
```

### POST /api/v1/photos {#api-photos}

TapFun フォトストレージに画像を保存します。ユーザーは TapFun 上で、ゲームから保存された画像を閲覧・ダウンロードできます。認証: 必要。

| 項目 | 内容 |
| --- | --- |
| Content-Type | `multipart/form-data` |
| クエリストリング `userId` | TapFun ユーザー ID（必須） |
| POST データ `file` | PNG / JPEG / WebP の画像バイナリ（必須）。part の `Content-Disposition` の `filename` は任意の値で必須（例: `form-data; name="file"; filename="sample.jpg"`） |

制約:

- 最大保存枚数: 1,000 枚（超えた場合は古いものから自動削除）
- 最大容量: 1 枚あたり 10 MB（全体の容量制限はありません）
- 最大の高さ・幅: 12,000 ピクセル
- 最大画像サイズ: 100M ピクセル（例: 10,000 × 10,000）
- 連続呼び出しの待機時間・呼び出し回数の制限: なし

```bash
curl -F "file=@sample.jpg;type=image/jpeg" \
  -H "Authorization: Bearer 1_8an4dAfsIyEEvBbaKxd55P2Wgf" \
  "https://<TEST_HOST>/api/v1/photos?userId=PLYR01JY39A09EE40YQZRHWTT9EM1VDBG"
```

```json
// 成功
{ "result": "success" }
// 失敗（404）: ユーザー ID が無い
{ "result": "failure", "message": "userId is not found" }
// 失敗（400）: その他（file が無い、大きすぎる、形式が不正など）
{ "result": "failure", "message": "other problems." }
```

### GET /api/v1/leaderboard/entries {#api-leaderboard-get}

リーダーボードのエントリー一覧を取得します。認証: 必要。

| クエリストリング | 必須 | 説明 |
| --- | :-: | --- |
| `name` | ✓ | リーダーボード名 |
| `sort` | | `asc`: 昇順 / `desc`: 降順（デフォルト） |
| `userId` | | ユーザー ID |
| `arround` | | 指定ユーザーの周辺のエントリーを取得します（1〜100）。`userId` 指定時に機能します |
| `offset` | | 表示開始位置（0〜9999）。範囲外は 0 |
| `limit` | | 件数（1〜1000、デフォルト 100）。範囲外は 100 |

```json
// 成功
{
  "result": "success",
  "entries": [
    {
      "position": 1,
      "userId": "PLYR01HE2R3JV6Y2NEGRMS4KZQB861DBG",
      "userName": "ユーザー名",          // UTF-8、絵文字不可、1〜12 文字
      "score": 12345,
      "note": "追加情報",                // 最大 8192 文字
      "createdAt": "2025-09-24T00:00:00.000Z",
      "updatedAt": "2025-09-24T00:00:00.000Z"
    }
  ]
}
// 失敗（404）: ユーザー ID が無い
{ "result": "failure", "message": "userId is not found" }
// 失敗（400）: その他
{ "result": "failure", "message": "other problems." }
```

### POST /api/v1/leaderboard/entries {#api-leaderboard-post}

リーダーボードのエントリーを作成・更新します。既存のスコア値以下（同値を含む）の場合は更新しません。リーダーボードは `name` ごとに自動で作られます。認証: 必要。

| POST データ | 必須 | 説明 |
| --- | :-: | --- |
| `name` | ✓ | リーダーボード名。英数字・`_`・`-` の 1〜64 文字（`/^[0-9a-zA-Z_-]{1,64}$/`） |
| `userId` | ✓ | ユーザー ID |
| `score` | ✓ | スコア値（-9,223,372,036,854,775,808〜9,223,372,036,854,775,807） |
| `note` | | 追加情報（UTF-8、0〜8192 文字） |
| `force` | | `1` を渡すと、既存のスコア値を下回る場合でも登録します |

```json
// 成功
{ "result": "success" }
// 失敗（404）: ユーザー ID が無い
{ "result": "failure", "message": "userId is not found" }
// 失敗（400）: その他
{ "result": "failure", "message": "other problems." }
```

### POST /api/v1/leaderboard/entries/delete {#api-leaderboard-delete}

リーダーボードのエントリーを削除します。エントリーが無い場合も成功を返します。認証: 必要。

| POST データ | 必須 | 説明 |
| --- | :-: | --- |
| `name` | ✓ | リーダーボード名（`/^[0-9a-zA-Z_-]{1,64}$/`） |
| `userId` | ✓ | ユーザー ID |

```json
// 成功
{ "result": "success" }
// 失敗（404）: ユーザー ID が無い
{ "result": "failure", "message": "userId is not found" }
// 失敗（400）: その他
{ "result": "failure", "message": "other problems." }
```

## 用語 {#glossary}

### 実行環境 {#glossary-runtime}

exe を実行し配信するクラウドストリーミングサーバーです。

### TapFun ユーザー ID {#glossary-user-id}

- ユーザーを特定する最大 64 桁のユニーク ID です。アプリごとに発行されます。
- 文字種は `0-9`, `a-z`, `A-Z` です。
- 形式は `PLYR` + ULID + アプリごとの suffix（3〜7 文字。例: `DBG`, `XENO`, `MOCODVLP`）です。

### アプリ ID {#glossary-app-id}

アプリを特定する unsigned int 型の ID です。

### API キー {#glossary-api-key}

アプリごとに発行される 26 桁の文字列です。文字種は `0-9`, `A-Z` です。


### Publisher Console {#glossary-publisher-console}

パブリッシャー様向けの管理画面です。アプリの設定、紹介ページ、売上の確認などを行います。テスト環境と本番環境で別々にあり、ログインできる方は TapFun が登録します。

### 紹介ページ {#glossary-introduction-page}

TapFun 上のゲームのページです（`https://tapfun.co.jp/p/<アプリ>`）。ゲームのプレイ画面は `https://tapfun.co.jp/p/<アプリ>/play` です。内容は Publisher Console の[詳細情報](#pc-detail)で編集します。

### ゲスト {#glossary-guest}

TapFun にログインしていない状態のプレイヤーです。

### TapFun ウォレット {#glossary-wallet}

プレイヤーが TapFun でチャージする残高です。TapFun 上での購入に使います。

### TapFun クレジット {#glossary-credit}

本番環境のテストプレイ用アカウントに付与される、対象のアプリでのみ使えるウォレット残高です（[本番でのテストプレイ](#production-test-play)）。

### セッション {#glossary-session}

クラウド上でゲームを起動してから終了するまでの 1 回分のプレイです。セッションの終了時にセーブデータが保存され、次のセッションの開始時に復元されます。

### お試し時間 {#glossary-trial}

タイトルごとに設定された、無料でプレイできる時間です（Publisher Console の「お試し分数」）。1 回分は 12 時間後に回復します。

### エナジー {#glossary-energy}

プレイ時間を延長するためにプレイヤーが購入する単位です。エナジー 1 つで遊べる時間はタイトルごとに設定され、タイトル利用パスを持っているかどうかで別々の値になります（[販売情報](#pc-sales)）。

### タイトル利用パス {#glossary-title-pass}

タイトルごとに販売する利用権です（「タイトルパス」とも書きます）。購入後、設定された時間は無料でプレイできます。DLC を同梱した版も販売できます（[DLC](#pc-dlc)）。

### 有料タイマーユーザー / 無料タイマーユーザー {#glossary-timer}

有料のプレイ時間（エナジーやタイトル利用パスで得た残り時間）が 1 秒以上あるプレイヤーが有料タイマーユーザー、それ以外が無料タイマーユーザーです。起動パラメータ `--is-paid-timer` や [getPlayerEnvironment](#api-getplayerenvironment) の `isPaidTimer` で分かります。

### First Release {#glossary-first-release}

Publisher Console で、アップロード済みのバージョンを、プレイヤーが起動するバージョンにする操作です（[リリース時のセッションの扱い](#pc-binary-release-sessions)）。

### バーチャルパッド {#glossary-virtual-pad}

スマートフォン・タブレットのプレイ画面に表示する仮想のゲームパッドです。入力はゲームパッドの入力として exe に届きます（[対応する入力](#runtime-input)）。

## 変更履歴 {#changelog}

| 日付 | 内容 |
| --- | --- |
| 2026-10-02 | このドキュメントを公開しました。 |
