PlayCanvas Engine
PlayCanvas Engineは、ウェブ向けのオープンソース3Dエンジンです。最新のブラウザであれば、デスクトップでもモバイルでもWebGPUまたはWebGL 2でレンダリングでき、Editor、PlayCanvas React、Web Componentsもこのエンジンの上に構築されています。
最初のアプリ
これは完全なEngineアプリです。このページ上で実際に動いていて、編集することもできます。入力するとプレビューが再実行されます。
import * as pc from 'playcanvas';
// WebGL 2よりWebGPUを優先してグラフィックスデバイスを作成します
const canvas = document.getElementById('application');
const device = await pc.createGraphicsDevice(canvas, {
deviceTypes: [pc.DEVICETYPE_WEBGPU]
});
device.maxPixelRatio = Math.min(window.devicePixelRatio, 2);
// 使用するコンポーネントシステムを指定してアプリケーションを作成します
const options = new pc.AppOptions();
options.graphicsDevice = device;
options.componentSystems = [
pc.RenderComponentSystem,
pc.CameraComponentSystem,
pc.LightComponentSystem
];
const app = new pc.AppBase(canvas);
app.init(options);
app.setCanvasFillMode(pc.FILLMODE_FILL_WINDOW);
app.setCanvasResolution(pc.RESOLUTION_AUTO);
window.addEventListener('resize', () => app.resizeCanvas());
app.start();
// シーン全体をやわらかく照らします
app.scene.ambientLight = new pc.Color(0.3, 0.3, 0.35);
// グリッドの中央を見下ろすカメラを作成します
const camera = new pc.Entity('camera');
camera.addComponent('camera', {
clearColor: new pc.Color(0.12, 0.14, 0.17)
});
camera.setPosition(0, 7, 17);
camera.lookAt(0, 0, 0);
app.root.addChild(camera);
// 影を落とす太陽を作成します
const light = new pc.Entity('light');
light.addComponent('light', {
castShadows: true,
shadowDistance: 40,
shadowBias: 0.2,
normalOffsetBias: 0.05
});
light.setEulerAngles(45, 30, 0);
app.root.addChild(light);
// 中央のオレンジから端の紫へと色が変わるボックスのグリッドを作成します
const size = 10;
const orange = new pc.Color(1, 0.4, 0.1);
const purple = new pc.Color(0.4, 0.2, 1);
const boxes = [];
for (let x = -size; x <= size; x++) {
for (let z = -size; z <= size; z++) {
const material = new pc.StandardMaterial();
material.diffuse.lerp(orange, purple, Math.hypot(x, z) / (size * 1.5));
material.update();
const box = new pc.Entity();
box.addComponent('render', { type: 'box', material: material });
box.setPosition(x, 0, z);
app.root.addChild(box);
boxes.push(box);
}
}
// 毎フレーム、ボックスの高さを中央から外側へ波打たせます
let time = 0;
app.on('update', (dt) => {
time += dt;
for (const box of boxes) {
const { x, z } = box.getPosition();
const height = 2.2 + 2 * Math.sin(time * 3 - Math.hypot(x, z) * 0.5);
box.setLocalScale(0.9, height, 0.9);
}
});
最初の数行は、どのEngineアプリでも同じです。createGraphicsDeviceはWebGPUを要求し、ブラウザが対応していない場合はWebGL 2にフォールバックします。AppBaseはアプリケーション本体で、フレームループを実行しますが、動かすのは登録したコンポーネントシステムだけなので、バンドラーはそれ以外をビルドから除外できます。シーン内のすべてはapp.rootの下の階層に置かれたエンティティで、コンポーネントが各エンティティに能力を与えます。ここでは、カメラ、影を落とす太陽、そしてそれぞれ専用のマテリアルで描画される441個のボックスです。updateイベントは毎フレーム、前のフレームからの経過時間をコードに渡し、コードはそれを使ってボックスを波打たせます。次のような変更を試してみてください。
time * 3の3を大きくして波を速くする。0.5を大きくすると、波の輪の間隔が狭まります。orangeとpurpleを好きな2色に変える。sizeを20に変えてグリッドを広げる。ボックスは1,681個になります。type: 'cylinder'でボックスを円柱に変える。
このようなアプリを自分のマシンで作るには、npm create playcanvas@latestを実行してEngine形式を選ぶか、Engineをスタンドアロンで使用するの手順に従ってプロジェクトを手動でセットアップしてください。
作れるもの
Engineのアプリはブラウザで動くため、作ったものはどんなデバイスからでも、リンクひとつで誰にでも届けられます。開発者がこのエンジンで作っているものの一例を紹介します。
サンプルブラウザには、ボリュメトリックフォグやダイナミックスカイから、数千人のキャラクターがアニメーションする群衆まで、編集できるソースコード付きのライブサンプルが250以上あります。
モデル: ElinによるTropical Island(ページ上部のデモ)、AlexJJによるCatapult、DazによるLow Poly Lumberjack、ShopifyによるMaterials Variants Shoe(いずれもCC BY 4.0)。スケートパークのスプラットはChristoph Schindelarによるものです。PlayCanvas Engineを使用する理由
- 1つのコードベースでWebGPUとWebGL 2に対応。 WebGPUを要求すると、まだ対応していないブラウザではWebGL 2にフォールバックし、APIも見た目も変わりません。それぞれが動作する環境はサポートされているブラウザを参照してください。
- 必要なものはすべて内蔵。 剛体の物理演算、ステートベースのアニメーション、ポジショナルサウンド、2Dと3Dのユーザーインターフェース、ARとVRのためのWebXR、Gaussian Splat、そしてマウス、キーボード、タッチ、ゲームパッドの入力が、すべて組み込まれています。パッケージには、カメラ操作、キャラクターコントローラー、XR、ポストエフェクトなどのすぐに使えるスクリプトも同梱されています。
- 軽量な設計。 エンジンはESモジュールとして公開されており、
AppBaseは登録したコンポーネントシステムとリソースハンドラーだけを動かすため、バンドラーはアプリで使わないものを除外できます。 - 高速なアセット読み込み。 モデルはDracoジオメトリ圧縮とBasisテクスチャ圧縮を使ったglTF 2.0ファイルから読み込まれ、大規模なGaussian Splatのシーンはカメラの動きに合わせて詳細度(LOD)ごとにストリーミングされます。
- TypeScript対応。 npmパッケージには完全なTypeScript型定義が同梱されているため、TypeScriptでもJavaScriptでも、エディタがすべてのクラス、メソッド、プロパティを補完し、チェックできます。
- JavaScriptが動く場所ならどこでも。 ブラウザだけでなく、マルチプレイヤーサーバー、アセットツール、ユニットテストのためにNode.jsでヘッドレスに実行することもできます。
- オープンソースで、本番環境での実績あり。 エンジンはGitHubでMITライセンスのもとオープンに開発されており、個人・商用を問わず無料で利用できます。PlayCanvas EditorやSuperSplat、そしてEditor、PlayCanvas React、Web Componentsで作られたすべてのアプリを支えています。
1つのエンジン、4つの使い方
PlayCanvasのすべての製品はこのエンジンを動かしているので、自分に合った作業スタイルを選んでください。エンティティ、コンポーネント、マテリアル、スクリプトについて学んだことは、どの方法でも活かせます。
エンジンを探索する
エンジンの機能はトピックごとに解説されており、どのトピックもエンジンの使い方を問わず当てはまります。
| トピック | 内容 |
|---|---|
| エンティティ・コンポーネント・システム(ECS) | エンティティ、コンポーネント、シーン階層 |
| スクリプティング | スクリプトクラスとそのライフサイクル、属性、イベント |
| アセット | 実行時のモデル、テクスチャ、その他のファイルの読み込みと管理 |
| グラフィックス | カメラ、メッシュ、ライティング、マテリアル、シェーダー、ポストエフェクト、パーティクル |
| Gaussian Splatting | 3D Gaussian Splatのレンダリング、ストリーミング、カスタマイズ |
| アニメーション | アニメーションステートグラフ、レイヤーマスク、アニメーションイベント |
| 物理演算 | 剛体、衝突、トリガー、レイキャスト、ジョイント |
| 2D | スプライト、9スライス、テクスチャアトラス、Spine |
| ユーザーインターフェース | 画面上や3D空間内のスクリーン、レイアウト、テキスト、画像、入力 |
| XR | 入力とハンドトラッキングを含む、WebXRによる没入型のARとVR |
| 最適化 | 読み込み時間、フレームレート、メモリのプロファイリングとチューニング |
このセクションの内容
- Engineをスタンドアロンで使用する — npmとVite、またはインポートマップとCDNでプロジェクトをセットアップします。
- Node.jsでエンジンを実行する — サーバー、ツール、テスト向けにヘッドレスのアプリを実行します。
- バージョニングとリリース — バージョン番号、npmタグ、受け取るアップデートの制御方法。
- エンジンマイグレーション — 破壊的変更と、コードを更新する方法。
- サポートされているブラウザ — WebGL 2とWebGPUに必要なブラウザの最小バージョン。
- AI を活用した開発 — Engineプロジェクトにコーディングエージェントをセットアップし、その変更を検証します。
- サンプル — 編集できるソースコード付きの250以上のライブサンプル。
- APIリファレンス — すべてのクラス、メソッド、プロパティ。
最新情報を追う
- GitHub — ソースコード、Issue、プルリクエストに。各バージョンのリリースノートもあります
- PlayCanvasブログ — Engineのニュースに
- Discordとフォーラム — 質問や作品の共有に
- EngineのAI向けドキュメントインデックス — コーディングエージェントに





