From 50974412f99c4bd4d8e004ef007ff0a4c6489754 Mon Sep 17 00:00:00 2001 From: ienaga Date: Mon, 2 Nov 2026 10:33:31 +0900 Subject: [PATCH] =?UTF-8?q?#78=20=E4=BE=9D=E5=AD=98=E9=96=A2=E4=BF=82?= =?UTF-8?q?=E3=82=92=E6=B8=9B=E3=82=89=E3=81=97=E3=81=9F=E3=83=86=E3=83=B3?= =?UTF-8?q?=E3=83=97=E3=83=AC=E3=83=BC=E3=83=88=E3=81=B8=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .npmignore | 7 + package.json | 2 +- template.json | 7 +- template/.gitignore | 5 +- template/MicrosoftGame.config | 40 ++++++ template/README.md | 133 ++++++++++++++++-- template/electron.config.json | 34 +++++ template/electron/README.md | 79 ----------- template/electron/icons/README.md | 7 - template/electron/index.js | 53 ------- template/electron/package.json | 17 --- template/package.json | 64 +++++---- template/specs/08-project.md | 63 +++++++-- .../{electron => src/assets}/icons/icon.icns | Bin template/src/assets/icons/icon.ico | Bin 0 -> 27745 bytes .../{electron => src/assets}/icons/icon.png | Bin template/src/ui/component/organism/.gitkeep | 0 template/src/ui/component/template/.gitkeep | 0 template/vite.config.js | 11 +- 19 files changed, 308 insertions(+), 214 deletions(-) create mode 100644 template/MicrosoftGame.config create mode 100644 template/electron.config.json delete mode 100644 template/electron/README.md delete mode 100644 template/electron/icons/README.md delete mode 100644 template/electron/index.js delete mode 100644 template/electron/package.json rename template/{electron => src/assets}/icons/icon.icns (100%) create mode 100644 template/src/assets/icons/icon.ico rename template/{electron => src/assets}/icons/icon.png (100%) create mode 100644 template/src/ui/component/organism/.gitkeep create mode 100644 template/src/ui/component/template/.gitkeep diff --git a/.npmignore b/.npmignore index a81b581..179ccb3 100644 --- a/.npmignore +++ b/.npmignore @@ -3,4 +3,11 @@ .gitignore template/ios template/android +template/xbox +template/dist template/package.json +template/package-lock.json +template/src/Packages.js +template/src/Packages.ts +template/src/config/Config.js +template/src/config/Config.ts diff --git a/package.json b/package.json index 807695a..90b4861 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@next2d/framework-template", "description": "Next2D Framework default JavaScript template.", - "version": "5.0.1", + "version": "6.0.0", "homepage": "https://next2d.app", "bugs": "https://github.com/Next2D/framework-template/issues/new", "author": "Toshiyuki Ienaga", diff --git a/template.json b/template.json index ae12728..484356c 100644 --- a/template.json +++ b/template.json @@ -2,9 +2,12 @@ "package": { "devDependencies": { "eslint": "*", - "eslint-plugin-unused-imports": "*", "@eslint/eslintrc": "*", - "@eslint/js": "*" + "@eslint/js": "*", + "globals": "*" + }, + "scripts": { + "lint": "eslint src --ignore-pattern \"src/**/*.test.js\"" } } } diff --git a/template/.gitignore b/template/.gitignore index a4504dd..a9d5887 100644 --- a/template/.gitignore +++ b/template/.gitignore @@ -25,5 +25,6 @@ dist-ssr src/Packages.js src/config/Config.js -electron/resources -electron/package-lock.json \ No newline at end of file + +# Xbox: builder が生成する C++/CMake ホスト一式 (MicrosoftGame.config はルートで管理) +/xbox diff --git a/template/MicrosoftGame.config b/template/MicrosoftGame.config new file mode 100644 index 0000000..6afc28a --- /dev/null +++ b/template/MicrosoftGame.config @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + 00000000000000000000000000000000 + 00000000 + 0000000000000000 + + + + + + diff --git a/template/README.md b/template/README.md index 5335505..c93b0b5 100644 --- a/template/README.md +++ b/template/README.md @@ -25,7 +25,7 @@ This project was bootstrapped with [Create Next2D App](https://github.com/Next2D | ツール / Tool | バージョン / Version | |--------------|---------------------| -| Node.js | 22.x 以上 / 22.x or higher | +| Node.js | 22.12 以上 / 22.12 or higher | | npm | 10.x 以上 / 10.x or higher | ### オプション / Optional @@ -36,6 +36,7 @@ For iOS/Android builds, the following are also required: - **iOS**: Xcode 14 以上、macOS - **Android**: Android Studio、JDK 21 以上 +- **Xbox (試作 / prototype)**: Windows、Visual Studio 2022、Microsoft GDK、CMake 3.26 以上 --- @@ -146,11 +147,12 @@ You can specify the environment with the `--env` option (`dev`, `stg`, `prd`, et | コマンド / Command | プラットフォーム / Platform | |-------------------|---------------------------| -| `npm run preview:windows -- --env prd` | Windows | -| `npm run preview:macos -- --env prd` | macOS | -| `npm run preview:linux -- --env prd` | Linux | -| `npm run preview:ios -- --env prd` | iOS | -| `npm run preview:android -- --env prd` | Android | +| `npm run preview:web` | Web (HTML) | +| `npm run preview:windows` | Windows | +| `npm run preview:macos` | macOS | +| `npm run preview:linux` | Linux | +| `npm run preview:ios` | iOS | +| `npm run preview:android` | Android | --- @@ -185,12 +187,29 @@ You can specify the environment with the `--env` option. | コマンド / Command | プラットフォーム / Platform | 出力先 / Output | |-------------------|---------------------------|----------------| -| `npm run build:web -- --env prd` | Web (HTML) | `dist/web/prd/` | -| `npm run build:steam:windows -- --env prd` | Windows (Steam) | `dist/steam/windows/` | -| `npm run build:steam:macos -- --env prd` | macOS (Steam) | `dist/steam/macos/` | -| `npm run build:steam:linux -- --env prd` | Linux (Steam) | `dist/steam/linux/` | -| `npm run build:ios -- --env prd` | iOS | Xcode project | -| `npm run build:android -- --env prd` | Android | Android Studio project | +| `npm run build:web` | Web (HTML) | `dist/web/prd/` | +| `npm run build:steam:windows` | Windows (Steam) | `dist/steam/windows/build/prd/` | +| `npm run build:steam:macos` | macOS (Steam) | `dist/steam/macos/build/prd/` | +| `npm run build:steam:linux` | Linux (Steam) | `dist/steam/linux/build/prd/` | +| `npm run build:steam:manifest` | Steam 共有Depot / Shared depot | `dist/steam/shared/prd/` | +| `npm run build:ios` | iOS | `ios/` (Xcode) | +| `npm run build:android` | Android | `android/` (Android Studio) | +| `npm run build:xbox` | Xbox (試作 / prototype) | `xbox/` (GDK host) | + +各スクリプトの既定環境は `prd` です。別の環境は `npm run build:web -- --env dev` のように上書きします。 + +Each script defaults to the `prd` environment. Override it like `npm run build:web -- --env dev`. + +### Steam アップロード / Steam upload + +```bash +npm run upload:steam:dry-run # ローカル検証のみ / Local validation only +npm run upload:steam # 全OSの成果物をSteamPipeへアップロード / Upload all OS packages +``` + +`electron.config.json` の `steam.appId` / `steam.depots` と、環境変数 `STEAM_USERNAME`(任意で `STEAMCMD`)が必要です。 + +Requires `steam.appId` / `steam.depots` in `electron.config.json` and the `STEAM_USERNAME` (optionally `STEAMCMD`) environment variable. ### 環境設定 / Environment Configuration @@ -213,9 +232,16 @@ src/ │ ├── animation/ # アニメーション定義 / Animation definitions │ ├── component/ │ │ ├── atom/ # 最小コンポーネント / Smallest components -│ │ └── molecule/ # 複合コンポーネント / Composite components +│ │ ├── molecule/ # 複合コンポーネント / Composite components +│ │ ├── organism/ # Moleculeの組み合わせ / Combinations of molecules +│ │ ├── page/ # ページ / Pages +│ │ └── template/ # ページテンプレート / Page templates │ └── content/ # Animation Tool 生成 / Generated content └── view/ # View & ViewModel + +capacitor.config.json # iOS / Android 設定 / iOS / Android settings +electron.config.json # Electron / Steam 設定 / Electron / Steam settings +MicrosoftGame.config # Xbox (GDK) 設定 / Xbox (GDK) settings ``` 各ディレクトリの詳細は、ディレクトリ内の `README.md` を参照してください。 @@ -275,3 +301,84 @@ MIT License - [Next2D Framework](https://github.com/Next2D/framework) - フレームワーク / Framework - [Create Next2D App](https://github.com/Next2D/create-next2d-app) - プロジェクト生成ツール / Project generator - [Next2D Animation Tool](https://tool.next2d.app/) - アニメーション作成ツール / Animation creation tool + + +## iOS / Android dependencies + +Capacitor's CLI, core and platform SDKs are managed by `@next2d/builder`. +The npm scripts invoke the builder through `npx`; neither the builder nor Capacitor +packages are added as game dependencies. Keep `capacitor.config.json`, native projects and +game-specific plugins in the game. Use `npm run open:ios` or +`npm run open:android` to sync and open the native project. +Both the template and generated apps use the published builder package through `npx`. + +## Electron / Steam configuration + +`electron.config.json` manages the app name, bundle ID, executable name, icons, +CPU architectures, window settings and Steam IDs. `create-next2d-app` initializes +`appId`, `appName`, `executableName` and `companyName` from the project name. +For example, `my-game` uses `app.example.my-game` and the app name `my-game`. +Replace the example bundle ID and company name before distribution. + +| Platform | Default architecture | Supported architectures | +|---|---|---| +| Windows | `x64` | `x64`, `arm64` | +| macOS | `universal` | `x64`, `arm64`, `universal` | +| Linux | `x64` | `x64`, `arm64` | + +32-bit Windows (`ia32`) is not supported. The `win32` in an output directory such +as `My Game-win32-x64` is Electron's Windows platform name; this is a **64-bit** build. +Use `architectures.windows` or a CLI override to select ARM64: + +```sh +npm run build:steam:windows # x64 by default +npm run build:steam:windows -- --arch arm64 # ARM64 override +``` + +Steam exports default to `prd`; append `-- --env dev` to override the environment. +macOS universal packages must be built on macOS. Preview uses the host OS and CPU. + +Platform icons are included as Next2D placeholders in `src/assets/icons/` and are +referenced by `electron.config.json`: `icon.ico` for Windows, `icon.icns` for macOS, +and `icon.png` for Linux. Replace these images for your game. Paths are relative +to the project root. Omitting an icon path uses the builder's bundled placeholder. + +`steam.appId` and `steam.depots` are `null` until you enter the IDs assigned in +Steamworks. Local packaging works without IDs. Multiple operating systems may use +the same Depot ID. The builder maps their packages to `windows/`, `macos/`, and +`linux/` in the shared depot, generating combined VDFs once every required OS's +package is available. Separate Depot IDs still produce separate upload scripts. + +When collecting exports from separate machines, keep each OS's `build//` +contents (including `steam-package.json`) in `dist/steam//build//`, then run: + +```sh +npm run build:steam:manifest +``` + +This generates shared depot manifests without rebuilding any application, on any +host OS. Shared VDFs and launch settings are in +`dist/steam/shared//depot-/`; preserve the entire `dist/steam/` tree when +moving them. Configure Steamworks launch options from `launch.json`, including the +OS-specific path prefixes for shared depots. The command fails if required packages +are missing or their metadata does not match the project. + +`macos.sign` and `macos.notarize` default to `false` for local testing. Enable both +for distribution and supply `APPLE_SIGNING_IDENTITY` / `APPLE_NOTARY_PROFILE` via +the environment. The builder never uploads or publishes to Steam automatically. + +Use a version of `@next2d/builder` that supports the generated host and shared depot +manifests. Only `electron.config.json` is needed for Electron configuration. The +builder owns the host and runtime version, generates a temporary host for each +export, then removes it. No `electron/` directory, Electron install, or Electron +lockfile is needed in the game. + +## Xbox configuration (prototype) + +`MicrosoftGame.config` holds the game-specific Microsoft GDK settings, in the same way +`capacitor.config.json` does for iOS / Android. Replace `TitleId`, `StoreId`, `MSAAppId` +and the store logo paths with the values issued by ID@Xbox / Partner Center. +`npm run build:xbox` generates the C++ / CMake host in `xbox/` (ignored by git) from the +builder's template and injects this file. On macOS / Linux only host generation and asset +packing run; building the executable requires Windows with Visual Studio 2022 and the GDK. +Xbox support in `@next2d/builder` is still a prototype. diff --git a/template/electron.config.json b/template/electron.config.json new file mode 100644 index 0000000..a8a43c0 --- /dev/null +++ b/template/electron.config.json @@ -0,0 +1,34 @@ +{ + "appId": "app.example.appId", + "appName": "Example-Product-Name", + "executableName": "example-product-name", + "companyName": "Example Company", + "icons": { + "windows": "src/assets/icons/icon.ico", + "macos": "src/assets/icons/icon.icns", + "linux": "src/assets/icons/icon.png" + }, + "architectures": { + "windows": "x64", + "macos": "universal", + "linux": "x64" + }, + "window": { + "width": 1280, + "height": 720, + "fullscreen": false + }, + "steam": { + "appId": null, + "branch": "internal", + "depots": { + "windows": null, + "macos": null, + "linux": null + } + }, + "macos": { + "sign": false, + "notarize": false + } +} diff --git a/template/electron/README.md b/template/electron/README.md deleted file mode 100644 index a438d3b..0000000 --- a/template/electron/README.md +++ /dev/null @@ -1,79 +0,0 @@ -# Electron Configuration - -Windows、macOS、Linux向けのデスクトップアプリケーションビルドに使用するElectron設定ディレクトリです。 - -Directory for Electron configuration used to build desktop applications for Windows, macOS, and Linux. - -## ディレクトリ構造 / Directory Structure - -``` -electron/ -├── icons/ # アプリケーションアイコン -├── index.js # メインプロセス -└── package.json # 依存関係 -``` - -## ファイル説明 / File Description - -### index.js - -Electronのメインプロセスを定義します。ウィンドウの作成、アプリケーションのライフサイクル管理などを行います。 - -Defines the Electron main process. Handles window creation, application lifecycle management, etc. - -### package.json - -Electron用の依存関係と設定を管理します。 - -Manages Electron-specific dependencies and configuration. - -### icons/ - -各プラットフォーム向けのアプリケーションアイコンを格納します。詳細は [icons/README.md](./icons/README.md) を参照してください。 - -Contains application icons for each platform. See [icons/README.md](./icons/README.md) for details. - -## ビルドコマンド / Build Commands - -```bash -# Windows向けビルド / Build for Windows -npm run build:steam:windows -- --env prd - -# macOS向けビルド / Build for macOS -npm run build:steam:macos -- --env prd - -# Linux向けビルド / Build for Linux -npm run build:steam:linux -- --env prd -``` - -## エミュレーター / Emulator - -開発中にデスクトップアプリとしてプレビューできます。 - -Preview as a desktop application during development. - -```bash -# Windows / macOS / Linux エミュレーター -npm run preview:windows -- --env dev -npm run preview:macos -- --env dev -npm run preview:linux -- --env dev -``` - -## カスタマイズ / Customization - -### ウィンドウ設定 / Window Settings - -`index.js` でウィンドウのサイズや設定をカスタマイズできます。 - -Customize window size and settings in `index.js`. - -### アイコン変更 / Icon Change - -`icons/` ディレクトリ内の画像を置き換えてアプリケーションアイコンを変更します。 - -Replace images in the `icons/` directory to change application icons. - -## 関連ドキュメント / Related Documentation - -- [README.md](../README.md) - プロジェクト全体の説明 -- [icons/README.md](./icons/README.md) - アイコン設定 diff --git a/template/electron/icons/README.md b/template/electron/icons/README.md deleted file mode 100644 index 9080fdc..0000000 --- a/template/electron/icons/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# App Icons - -Windows、macOSのアプリケーションで利用するアイコン画像を格納してます。 -デフォルトはNext2Dのロゴを配置しているので、アプリケーションのイメージに合わせて上書きしてください。 - -Icon images used for Windows and macOS applications are stored. -The default is the Next2D logo, which can be overridden to match the image of the application. \ No newline at end of file diff --git a/template/electron/index.js b/template/electron/index.js deleted file mode 100644 index 6917120..0000000 --- a/template/electron/index.js +++ /dev/null @@ -1,53 +0,0 @@ -process.env.ELECTRON_DISABLE_SECURITY_WARNINGS = "1"; - -const { app, BrowserWindow } = require("electron"); - -/** - * 自動生成ファイルの読み込み - * Loading of auto-generated files - */ -const config = require("./electron.index.json"); - -app.commandLine.appendSwitch("disable-http-cache"); - -const createWindow = () => -{ - const browserWindow = new BrowserWindow({ - "fullscreen": true, - "autoHideMenuBar": false, - "webPreferences": { - "nodeIntegration": false - } - }); - - /** - * Chrome Developer Tools - */ - // browserWindow.webContents.openDevTools(); - - browserWindow.loadFile(config.path); -}; - -app.whenReady().then(createWindow); - -app.on("window-all-closed", () => -{ - /** - * windowsならアプリを終了、macならdockに滞在 - * Exit apps if windows, stay in dock if mac - */ - if (process.platform !== "darwin") { - app.quit(); - } -}); - -app.on("activate", () => -{ - /** - * アプリで起動している画面がなければアプリを起動 - * If there is no screen running on the application, start the application. - */ - if (BrowserWindow.getAllWindows().length === 0) { - createWindow(); - } -}); \ No newline at end of file diff --git a/template/electron/package.json b/template/electron/package.json deleted file mode 100644 index bffc8fe..0000000 --- a/template/electron/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "example-product-name", - "version": "0.0.1", - "description": "Your Production Description", - "main": "index.js", - "config": { - "forge": { - "packagerConfig": { - "icon": "./electron/icons/icon.icns", - "asar": true - } - } - }, - "devDependencies": { - "electron": "*" - } -} diff --git a/template/package.json b/template/package.json index af0caa0..5d46507 100644 --- a/template/package.json +++ b/template/package.json @@ -2,40 +2,43 @@ "name": "@next2d/framework-template", "version": "0.0.1", "description": "Next2D Framework JavaScript template.", + "private": true, "type": "module", "scripts": { - "start": "vite --host", - "preview:ios": "npx @next2d/builder --platform ios --preview", - "preview:android": "npx @next2d/builder --platform android --preview", - "preview:macos": "npx @next2d/builder --platform macos --preview", - "preview:windows": "npx @next2d/builder --platform windows --preview", - "preview:linux": "npx @next2d/builder --platform linux --preview", - "open:ios": "npx @next2d/builder --platform ios --open", - "open:android": "npx @next2d/builder --platform android --open", - "build:steam:windows": "npx @next2d/builder --platform steam:windows", - "build:steam:macos": "npx @next2d/builder --platform steam:macos", - "build:steam:linux": "npx @next2d/builder --platform steam:linux", - "build:web": "npx @next2d/builder --platform web", - "build:ios": "npx @next2d/builder --platform ios --build", - "build:android": "npx @next2d/builder --platform android --build", - "build": "npx @next2d/builder", - "test": "npx vitest", - "generate": "npx @next2d/view-generator" + "start": "vite --host", + "preview:web": "npx @next2d/builder --platform web --env prd --preview", + "preview:ios": "npx @next2d/builder --platform ios --env prd --preview", + "preview:android": "npx @next2d/builder --platform android --env prd --preview", + "preview:macos": "npx @next2d/builder --platform macos --env prd --preview", + "preview:windows": "npx @next2d/builder --platform windows --env prd --preview", + "preview:linux": "npx @next2d/builder --platform linux --env prd --preview", + "open:ios": "npx @next2d/builder --platform ios --env prd --open", + "open:android": "npx @next2d/builder --platform android --env prd --open", + "open:xbox": "npx @next2d/builder --platform xbox --env prd --open", + "build:web": "npx @next2d/builder --platform web --env prd", + "build:ios": "npx @next2d/builder --platform ios --env prd --build", + "build:android": "npx @next2d/builder --platform android --env prd --build", + "build:xbox": "npx @next2d/builder --platform xbox --env prd", + "build:steam:windows": "npx @next2d/builder --platform steam:windows --env prd", + "build:steam:macos": "npx @next2d/builder --platform steam:macos --env prd", + "build:steam:linux": "npx @next2d/builder --platform steam:linux --env prd", + "build:steam:manifest": "npx @next2d/builder --platform steam:macos --env prd --steam-manifest", + "upload:steam": "npx @next2d/builder --steam-upload --env prd", + "upload:steam:dry-run": "npx @next2d/builder --steam-upload --env prd --dry-run", + "lint": "eslint src --ignore-pattern \"src/**/*.test.js\"", + "test": "npx vitest", + "generate": "npx @next2d/view-generator" }, "devDependencies": { - "@capacitor/android": "^8.1.0", - "@capacitor/cli": "^8.1.0", - "@capacitor/core": "^8.1.0", - "@capacitor/ios": "^8.1.0", - "@eslint/eslintrc": "^3.3.4", + "@eslint/eslintrc": "^3.3.7", "@eslint/js": "^10.0.1", - "@next2d/vite-plugin-next2d-auto-loader": "^3.1.13", - "@vitest/web-worker": "^4.0.18", - "eslint": "^10.0.2", - "globals": "^17.4.0", - "jsdom": "^28.1.0", - "vite": "^7.3.1", - "vitest": "^4.0.18", + "@next2d/vite-plugin-next2d-auto-loader": "^3.1.21", + "@vitest/web-worker": "^5.0.5", + "eslint": "^10.14.0", + "globals": "^17.14.0", + "jsdom": "^30.1.3", + "vite": "^8.3.5", + "vitest": "^5.0.5", "vitest-webgl-canvas-mock": "^1.1.0" }, "peerDependencies": { @@ -54,6 +57,7 @@ "@next2d/text": "file:../../player/packages/text", "@next2d/texture-packer": "file:../../player/packages/texture-packer", "@next2d/ui": "file:../../player/packages/ui", - "@next2d/webgl": "file:../../player/packages/webgl" + "@next2d/webgl": "file:../../player/packages/webgl", + "@next2d/webgpu": "file:../../player/packages/webgpu" } } diff --git a/template/specs/08-project.md b/template/specs/08-project.md index 96332ea..f785253 100644 --- a/template/specs/08-project.md +++ b/template/specs/08-project.md @@ -2,7 +2,7 @@ ## 要件 -Node.js 22.x以上、npm 10.x以上。iOS: Xcode 14+。Android: Android Studio + JDK 21+。 +Node.js 22.12以上、npm 10.x以上。iOS: Xcode 14+。Android: Android Studio + JDK 21+。Xbox(試作): Windows + Visual Studio 2022 + Microsoft GDK + CMake 3.26+。 ## セットアップ @@ -17,13 +17,30 @@ npm install && npm start # → http://localhost:5173 | `npm start` | 開発サーバー | | `npm test` | テスト (Vitest) | | `npm run generate` | routing設定からView/ViewModel自動生成 | -| `npm run build:web -- --env prd` | Webビルド | -| `npm run build:steam:windows -- --env prd` | Windows (Steam) | -| `npm run build:steam:macos -- --env prd` | macOS (Steam) | -| `npm run build:steam:linux -- --env prd` | Linux (Steam) | -| `npm run build:ios -- --env prd` | iOS (Xcodeプロジェクト) | -| `npm run build:android -- --env prd` | Android (Android Studioプロジェクト) | -| `npm run preview:{platform} -- --env {env}` | エミュレーター起動 | +| `npm run lint` | ESLint(テストファイルを除く) | +| `npm run build:web` | Webビルド | +| `npm run build:steam:windows` | Windows (Steam) | +| `npm run build:steam:macos` | macOS (Steam) | +| `npm run build:steam:linux` | Linux (Steam) | +| `npm run build:steam:manifest` | 既存のSteam成果物から共有Depotの設定を生成 | +| `npm run upload:steam` | Steamへアップロード(`upload:steam:dry-run` で事前検証) | +| `npm run open:ios` | iOSプロジェクトを同期してXcodeで開く | +| `npm run open:android` | Androidプロジェクトを同期してAndroid Studioで開く | +| `npm run build:ios` | iOSを同期・ビルド(Xcodeと署名設定が必要) | +| `npm run build:android` | Androidを同期・ビルド(SDK/JDKと署名設定が必要) | +| `npm run build:xbox` | Xbox(試作)GDKホストを `xbox/` に生成・ビルド | +| `npm run open:xbox` | Xbox(試作)Visual Studioで開く(Windowsのみ) | +| `npm run preview:{platform}` | エミュレーター起動(web / windows / macos / linux / ios / android) | + +全スクリプトの既定環境は `prd`。`npm run build:web -- --env dev` のように `--env` で上書きする。 + +## iOS / Androidの依存管理 + +`@capacitor/cli`・`@capacitor/core`・`@capacitor/ios`・`@capacitor/android` はbuilderが管理する。 +builderはnpmスクリプトから `npx` で起動し、builder・Capacitorともゲームの直接依存には追加しない。 +ゲーム側は `capacitor.config.json`、既存のネイティブプロジェクト、ゲーム固有のプラグインを管理する。 +builderは `webDir` を更新してからプロジェクトを生成・同期し、既存のネイティブ設定を維持する。 +ゲームのコードから `@capacitor/core` を直接importする場合だけ、互換バージョンの直接依存も宣言する。 ## エントリーポイント (index.js) @@ -74,3 +91,33 @@ export { packages }; ``` importエイリアスはパス区切りをアンダースコアに変換。View/ViewModelはクラス名をそのまま使用。 + +## Electron / Steam + +- Electron設定はルートの `electron.config.json` に集約。ホストとElectronバージョンはbuilderが管理し、`electron/` は不要。 +- Windowsは `x64` が既定、`arm64` も対応。32bit (`ia32`) は非対応。出力名の `win32-x64` は64bit版Windowsを意味する。 +- macOSは `universal`、Linuxは `x64` が既定。CPU設定はJSONまたは `--arch` で指定する。 +- アイコンは `src/assets/icons/icon.ico` / `icon.icns` / `icon.png` を参照。仮のNext2D画像を製品用に置き換える。 +- App ID・Depot IDは未発行なら `null`。複数OSで同一Depot IDを指定可能。 +- 共有Depotは全対象OSの成果物が揃うと `dist/steam/shared//depot-/` に統合VDFを生成する。 +- 別マシンの成果物を集めた場合は `npm run build:steam:manifest` で再ビルドせず統合する。共有Depotへの配置先はOS別サブフォルダ。 + +```sh +npm run build:steam:windows -- --arch arm64 +npm run build:steam:manifest -- --env prd +``` + +### Steamアップロード + +```sh +npm run upload:steam:dry-run # ローカル検証のみ +npm run upload:steam # 全OSの成果物を1回でアップロード(STEAM_USERNAME、任意でSTEAMCMDが必要) +``` + +反映先ブランチは `electron.config.json` の `steam.branch`(既定 `internal`)。`--steam-branch` で上書きできる。 + +## Xbox(試作) + +- GDK設定はルートの `MicrosoftGame.config` で管理する。`TitleId`・`StoreId`・`MSAAppId`・ストアロゴをPartner Centerの値に置き換える。 +- `npm run build:xbox` でbuilder同梱テンプレートから `xbox/`(C++/CMakeホスト、git管理外)を生成し、設定を注入する。 +- 実行ファイルのビルドはWindows + Visual Studio 2022 + Microsoft GDK + CMake 3.26以上が必要。macOS / Linuxはホスト生成とアセット準備まで。 diff --git a/template/electron/icons/icon.icns b/template/src/assets/icons/icon.icns similarity index 100% rename from template/electron/icons/icon.icns rename to template/src/assets/icons/icon.icns diff --git a/template/src/assets/icons/icon.ico b/template/src/assets/icons/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..3d07c9da42d6cd953b3060e8a1796c3d0cd1986d GIT binary patch literal 27745 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%0D#3L2d+oRg zYa^Owuu54MVelvZQQ5uY>D$juH&gl(z0kRoA8^LSZMI)utE*kkXFAUT13^Tm3OC!p ze>E*dj4SByA+*PXgV2p1K=$yiqx02T=PqLG)g$)JgMl(k2X)TSUYknwnJ7T7TsM zCMm(cErePjUklh36ey-Pi@w0@3>@X1QjB~HY*770+xT04FEOc1FpZpbsqiI>!e2fP z3L6MCe`a-Y$FeR(TKa7NUP&O5OTb*FZ8EZvcVL5dC(LBuWW^9 z(iwlIYe5l)c0!1HASCCzb;xMmmT6zn84k4Xp#)%qO1Gs)T09IXu+e%cG9DPE?%gTY zvDd*OM>4(%=JM#dzXyx@&6P$!G*iV}S!Mm^DKd@L;)T^eymKdsZR2nkrxw{bZQxls zTehmbt-SJ6x0dJej+U=M7Tf3V_PSx;6-5{ZKtVZempgHs@;q${%ZpvUGu@M=&yIb{ zJ4kkU%C7&~_V=ekJBI#31~&y5{Z0FgcY)){sBZ}7iHiH1X#Vq-T#@-i5cxA2be%Li zV4QT<;O;>nbqMe#f$A5x{DT14SLgRt&O9$j<7>%O{P{3jTkcHfOYuw`zD5p*lYPEr z+ZDOw$rbHIMZMrp^!3CzKp3&uyd?i~F~#1H}y#he3k0X0ZDwl}q~O zOYt0QvX8#LkI2TtN)^f~bOksId>G!{;}?fe7zO>=%gMuGvow@xdE-n$$o zcPWX(;8Y%g^oHo6rRR;&Aa0I3f2!WH16<;U-}LA8X{6r%(*mz~ib}|xm=?=uG^Cs` zV!GZ(edGICG;!Q?)@4d$gw#5cdqGp!&Ej>L@=Rvi_HnaltgISWeCa#CzzJ?~i6u_3 zQDV+LMH*UAhWIwo?n|dTrptt`)kqL}H#}PQRXwI~H-z&Y^N5J>FUGO@QgXk~Ie@Y~ zYBiiHKJ3?87FD+#0B-B0_k7zFy4!h5Slw@~+_K$^;1dQi^Pj-80;3f-3jV*@^zCqm zV1?gDGxW(7ap!yG_BA>Sfw51T`Qvk-KPOU{b}r00K$?pc56-x_lt1Ac@h7mJ&F#l4 z`^d>xtfYn%_dOsrn1?|^M%yoW>bxg~2k&~Em`2bANme}RM3FhuE#3`I4T``b#%erwr`d${IjC08-zp%;mw&fqM!ohaee$+t>%;Lb_zr|V)2QyEK4Tlz0 zJFAv32RedITX*w!Xc)<63)l-W60%WqU>OjZc@B`iH`%BDiNb5YB;+o&=Qc%yyPnEz zMc9{$(})U4W2n=j+10!i^l z(#F;g+3dXz1j8Nvi}F{x+HYm%Phns0R+l7I+f7sH>e`MwGOw38xPZNZ-?F_CgaVcr zEh`ItN|ye)j14IEK4D@97O<@Xzf=Cf1 z3s%P=L@F+XCir&CNW=@f)N|mIrdpc@T0t93@bPs2FLiEn&)7bwkm;W zi5(5Q<&8U$8-*;8vD4VoXFkc|Ka*NtjA)PksemPo6lgYHung7%Z5=<+fKY-K!8JEW zV$^HQW9H5-nb@ljM=cE!`ZmIhvdn zSpQ<(`nrh{i8DjB<%%*6D_{N$WOn~l?n%+bc3(Z#wy64k2`^qTA_ zF-^FdS|spm`3;9@9v~LWc--xkDZb)QbHF;~!aEm;(ImW`;nC#5xuc=5e~yJJQD$|3O_^;(+z( ziH+GcW;+ zh{C)OZ%Et!peINPrHlv1WPw|&teNi0G@$|#Pjc~ForeJv(qDmMwzJn)zhZv8$2>e-J zI^?EEC}pn3>8|4Sg7P;Z%dMEYUp=rp%L%}<+}>V`K?esIPOhYPM;Tq^kV?*-Nl7m& zLs&6d>UhK~!6RzdI)4+~=C!RcZcu2m$O;I>X2`(cc%7uJA}+iQ%qU% zX>4N8{pLcN4cdi?o7V?M$D0JY4S_9FNLN7ZaJx;m|K2_~d$Z-Iy_&-WXLR?S)aCeV fP^nH_ES}qJ=9f)J%>tM}*8*s%>#9|%*na*$bies~ literal 0 HcmV?d00001 diff --git a/template/electron/icons/icon.png b/template/src/assets/icons/icon.png similarity index 100% rename from template/electron/icons/icon.png rename to template/src/assets/icons/icon.png diff --git a/template/src/ui/component/organism/.gitkeep b/template/src/ui/component/organism/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/template/src/ui/component/template/.gitkeep b/template/src/ui/component/template/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/template/vite.config.js b/template/vite.config.js index 4f72248..c90e8a6 100644 --- a/template/vite.config.js +++ b/template/vite.config.js @@ -9,10 +9,11 @@ export default defineConfig({ "build": { "outDir": "dist", "target": "esnext", + "chunkSizeWarningLimit": 1024, "modulePreload": { "polyfill": false }, - "rollupOptions": { + "rolldownOptions": { "output": { "entryFileNames": "assets/js/app.js" } @@ -37,12 +38,18 @@ export default defineConfig({ }, "resolve": { "alias": { - "@": path.resolve(__dirname, "src") + "@": path.resolve(import.meta.dirname, "src") } }, "test": { "globals": true, "environment": "jsdom", + "server": { + "deps": { + // 公開版の @next2d/* は拡張子なしの ESM import を含むため Vite で変換する + "inline": [/\/node_modules\/@next2d\//] + } + }, "setupFiles": [ "@vitest/web-worker", "vitest-webgl-canvas-mock"