refactor: reorganize package structure and decouple framework packages (#338)
* refactor: reorganize package structure and decouple framework packages ## Package Structure Reorganization - Reorganized 55 packages into categorized subdirectories: - packages/framework/ - Generic framework (Laya/Cocos compatible) - packages/engine/ - ESEngine core modules - packages/rendering/ - Rendering modules (WASM dependent) - packages/physics/ - Physics modules - packages/streaming/ - World streaming - packages/network-ext/ - Network extensions - packages/editor/ - Editor framework and plugins - packages/rust/ - Rust WASM engine - packages/tools/ - Build tools and SDK ## Framework Package Decoupling - Decoupled behavior-tree and blueprint packages from ESEngine dependencies - Created abstracted interfaces (IBTAssetManager, IBehaviorTreeAssetContent) - ESEngine-specific code moved to esengine/ subpath exports - Framework packages now usable with Cocos/Laya without ESEngine ## CI Configuration - Updated CI to only type-check and lint framework packages - Added type-check:framework and lint:framework scripts ## Breaking Changes - Package import paths changed due to directory reorganization - ESEngine integrations now use subpath imports (e.g., '@esengine/behavior-tree/esengine') * fix: update es-engine file path after directory reorganization * docs: update README to focus on framework over engine * ci: only build framework packages, remove Rust/WASM dependencies * fix: remove esengine subpath from behavior-tree and blueprint builds ESEngine integration code will only be available in full engine builds. Framework packages are now purely engine-agnostic. * fix: move network-protocols to framework, build both in CI * fix: update workflow paths from packages/core to packages/framework/core * fix: exclude esengine folder from type-check in behavior-tree and blueprint * fix: update network tsconfig references to new paths * fix: add test:ci:framework to only test framework packages in CI * fix: only build core and math npm packages in CI * fix: exclude test files from CodeQL and fix string escaping security issue
@@ -13,6 +13,48 @@
|
|||||||
"baseBranch": "master",
|
"baseBranch": "master",
|
||||||
"updateInternalDependencies": "patch",
|
"updateInternalDependencies": "patch",
|
||||||
"ignore": [
|
"ignore": [
|
||||||
"@esengine/editor-app"
|
"@esengine/engine-core",
|
||||||
|
"@esengine/runtime-core",
|
||||||
|
"@esengine/asset-system",
|
||||||
|
"@esengine/material-system",
|
||||||
|
"@esengine/ecs-engine-bindgen",
|
||||||
|
"@esengine/script-runtime",
|
||||||
|
"@esengine/platform-common",
|
||||||
|
"@esengine/platform-web",
|
||||||
|
"@esengine/platform-wechat",
|
||||||
|
"@esengine/sprite",
|
||||||
|
"@esengine/camera",
|
||||||
|
"@esengine/particle",
|
||||||
|
"@esengine/tilemap",
|
||||||
|
"@esengine/mesh-3d",
|
||||||
|
"@esengine/effect",
|
||||||
|
"@esengine/audio",
|
||||||
|
"@esengine/fairygui",
|
||||||
|
"@esengine/physics-rapier2d",
|
||||||
|
"@esengine/rapier2d",
|
||||||
|
"@esengine/world-streaming",
|
||||||
|
"@esengine/network-server",
|
||||||
|
"@esengine/network-protocols",
|
||||||
|
"@esengine/editor-core",
|
||||||
|
"@esengine/editor-runtime",
|
||||||
|
"@esengine/editor-app",
|
||||||
|
"@esengine/sprite-editor",
|
||||||
|
"@esengine/camera-editor",
|
||||||
|
"@esengine/particle-editor",
|
||||||
|
"@esengine/tilemap-editor",
|
||||||
|
"@esengine/mesh-3d-editor",
|
||||||
|
"@esengine/fairygui-editor",
|
||||||
|
"@esengine/physics-rapier2d-editor",
|
||||||
|
"@esengine/behavior-tree-editor",
|
||||||
|
"@esengine/blueprint-editor",
|
||||||
|
"@esengine/asset-system-editor",
|
||||||
|
"@esengine/material-editor",
|
||||||
|
"@esengine/shader-editor",
|
||||||
|
"@esengine/world-streaming-editor",
|
||||||
|
"@esengine/node-editor",
|
||||||
|
"@esengine/build-config",
|
||||||
|
"@esengine/sdk",
|
||||||
|
"@esengine/worker-generator",
|
||||||
|
"@esengine/engine"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
5
.github/codeql/codeql-config.yml
vendored
@@ -6,3 +6,8 @@ paths-ignore:
|
|||||||
- "**/node_modules"
|
- "**/node_modules"
|
||||||
- "**/dist"
|
- "**/dist"
|
||||||
- "**/bin"
|
- "**/bin"
|
||||||
|
- "**/tests"
|
||||||
|
- "**/*.test.ts"
|
||||||
|
- "**/*.spec.ts"
|
||||||
|
- "**/test"
|
||||||
|
- "**/__tests__"
|
||||||
|
|||||||
13
.github/workflows/ai-issue-helper.yml
vendored
@@ -12,8 +12,7 @@ permissions:
|
|||||||
jobs:
|
jobs:
|
||||||
ai-helper:
|
ai-helper:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
# 只在真实用户提到 @ai-helper 时触发,忽略机器人评论
|
# å<EFBFBD>ªåœ¨çœŸå®žç”¨æˆ·æ<EFBFBD><EFBFBD>到 @ai-helper 时触å<C2A6>‘,忽略机器人评è®? if: |
|
||||||
if: |
|
|
||||||
contains(github.event.comment.body, '@ai-helper') &&
|
contains(github.event.comment.body, '@ai-helper') &&
|
||||||
github.event.comment.user.type != 'Bot'
|
github.event.comment.user.type != 'Bot'
|
||||||
steps:
|
steps:
|
||||||
@@ -31,7 +30,7 @@ jobs:
|
|||||||
issue_number: context.issue.number
|
issue_number: context.issue.number
|
||||||
});
|
});
|
||||||
|
|
||||||
// 限制长度,避免超过 token 限制
|
// é™<EFBFBD>制长度,é<EFBFBD>¿å…<EFBFBD>è¶…è¿?token é™<C3A9>制
|
||||||
const maxLength = 1000;
|
const maxLength = 1000;
|
||||||
const truncate = (str, max) => {
|
const truncate = (str, max) => {
|
||||||
if (!str) return '';
|
if (!str) return '';
|
||||||
@@ -55,8 +54,7 @@ jobs:
|
|||||||
|
|
||||||
评论: ${{ env.COMMENT_BODY }}
|
评论: ${{ env.COMMENT_BODY }}
|
||||||
|
|
||||||
请搜索项目代码并提供解决方案。
|
请æ<EFBFBD>œç´¢é¡¹ç›®ä»£ç <EFBFBD>å¹¶æ<EFBFBD><EFBFBD>供解决方案ã€? PROMPT_EOF
|
||||||
PROMPT_EOF
|
|
||||||
|
|
||||||
- name: AI Analysis
|
- name: AI Analysis
|
||||||
uses: actions/ai-inference@v1
|
uses: actions/ai-inference@v1
|
||||||
@@ -66,10 +64,7 @@ jobs:
|
|||||||
enable-github-mcp: true
|
enable-github-mcp: true
|
||||||
max-tokens: 1500
|
max-tokens: 1500
|
||||||
system-prompt: |
|
system-prompt: |
|
||||||
你是 ECS Framework (TypeScript ECS 框架) 的 AI 助手。
|
ä½ æ˜¯ ECS Framework (TypeScript ECS 框架) çš?AI 助手ã€? 主è¦<C3A8>代ç <C3A7>åœ?packages/framework/core/srcã€? æ<>œç´¢ç›¸å…³ä»£ç <C3A7>å<EFBFBD>Žï¼Œç”¨ä¸æ–‡ç®€æ´<C3A6>回ç”问题,包å<E280A6>«é—®é¢˜åˆ†æž<C3A6>ã€<C3A3>解决方案和代ç <C3A7>引用ã€? prompt-file: prompt.txt
|
||||||
主要代码在 packages/core/src。
|
|
||||||
搜索相关代码后,用中文简洁回答问题,包含问题分析、解决方案和代码引用。
|
|
||||||
prompt-file: prompt.txt
|
|
||||||
|
|
||||||
- name: Post AI Response
|
- name: Post AI Response
|
||||||
env:
|
env:
|
||||||
|
|||||||
54
.github/workflows/batch-label-issues.yml
vendored
@@ -8,14 +8,14 @@ on:
|
|||||||
required: true
|
required: true
|
||||||
type: choice
|
type: choice
|
||||||
options:
|
options:
|
||||||
- 'recent' # 最近 20 个 issue
|
- 'recent' # 最�20 �issue
|
||||||
- 'open' # 所有打开的 issue
|
- 'open' # 所有打开�issue
|
||||||
- 'unlabeled' # å<>ªå¤„ç<E2809E>†æ²¡æœ‰æ ‡ç¾çš„ issue
|
- 'unlabeled' # å<>ªå¤„ç<E2809E>†æ²¡æœ‰æ ‡ç¾çš„ issue
|
||||||
- 'all' # 所有 issue(慎用)
|
- 'all' # 所�issue(慎用)
|
||||||
default: 'recent'
|
default: 'recent'
|
||||||
|
|
||||||
skip_labeled:
|
skip_labeled:
|
||||||
description: '跳过已有标签的 issue'
|
description: 'è·³è¿‡å·²æœ‰æ ‡ç¾çš?issue'
|
||||||
required: false
|
required: false
|
||||||
type: boolean
|
type: boolean
|
||||||
default: true
|
default: true
|
||||||
@@ -45,20 +45,20 @@ jobs:
|
|||||||
|
|
||||||
echo "📊 开始批é‡<C3A9>æ‰“æ ‡ç¾..."
|
echo "📊 开始批é‡<C3A9>æ‰“æ ‡ç¾..."
|
||||||
echo "模å¼<C3A5>: $MODE"
|
echo "模å¼<C3A5>: $MODE"
|
||||||
echo "跳过已标签: $SKIP_LABELED"
|
echo "è·³è¿‡å·²æ ‡ç? $SKIP_LABELED"
|
||||||
|
|
||||||
# 获å<C2B7>– issue 列表
|
# 获å<C2B7>– issue 列表
|
||||||
if [ "$MODE" = "recent" ]; then
|
if [ "$MODE" = "recent" ]; then
|
||||||
echo "📋 获取最近 20 个 issue..."
|
echo "📋 获å<C2B7>–最è¿?20 ä¸?issue..."
|
||||||
ISSUES=$(gh issue list --limit 20 --json number,labels,title,body --jq '.[] | {number, labels: [.labels[].name], title, body}')
|
ISSUES=$(gh issue list --limit 20 --json number,labels,title,body --jq '.[] | {number, labels: [.labels[].name], title, body}')
|
||||||
elif [ "$MODE" = "open" ]; then
|
elif [ "$MODE" = "open" ]; then
|
||||||
echo "📋 获取所有打开的 issue..."
|
echo "📋 获å<C2B7>–所有打开çš?issue..."
|
||||||
ISSUES=$(gh issue list --state open --json number,labels,title,body --jq '.[] | {number, labels: [.labels[].name], title, body}')
|
ISSUES=$(gh issue list --state open --json number,labels,title,body --jq '.[] | {number, labels: [.labels[].name], title, body}')
|
||||||
elif [ "$MODE" = "unlabeled" ]; then
|
elif [ "$MODE" = "unlabeled" ]; then
|
||||||
echo "📋 获取没有标签的 issue..."
|
echo "📋 获å<C2B7>–æ²¡æœ‰æ ‡ç¾çš?issue..."
|
||||||
ISSUES=$(gh issue list --state all --json number,labels,title,body --jq '.[] | select(.labels | length == 0) | {number, labels: [.labels[].name], title, body}')
|
ISSUES=$(gh issue list --state all --json number,labels,title,body --jq '.[] | select(.labels | length == 0) | {number, labels: [.labels[].name], title, body}')
|
||||||
else
|
else
|
||||||
echo "📋 获取所有 issue(限制 100 个)..."
|
echo "📋 获å<C2B7>–所æœ?issue(é™<C3A9>åˆ?100 个)..."
|
||||||
ISSUES=$(gh issue list --state all --limit 100 --json number,labels,title,body --jq '.[] | {number, labels: [.labels[].name], title, body}')
|
ISSUES=$(gh issue list --state all --limit 100 --json number,labels,title,body --jq '.[] | {number, labels: [.labels[].name], title, body}')
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -76,7 +76,7 @@ jobs:
|
|||||||
echo "ðŸ”<C5B8> 处ç<E2809E>† Issue #$ISSUE_NUM: $TITLE"
|
echo "ðŸ”<C5B8> 处ç<E2809E>† Issue #$ISSUE_NUM: $TITLE"
|
||||||
echo " çŽ°æœ‰æ ‡ç¾: $EXISTING_LABELS"
|
echo " çŽ°æœ‰æ ‡ç¾: $EXISTING_LABELS"
|
||||||
|
|
||||||
# 跳过已有标签的 issue
|
# è·³è¿‡å·²æœ‰æ ‡ç¾çš?issue
|
||||||
if [ "$SKIP_LABELED" = "true" ] && [ ! -z "$EXISTING_LABELS" ]; then
|
if [ "$SKIP_LABELED" = "true" ] && [ ! -z "$EXISTING_LABELS" ]; then
|
||||||
echo " â<>ï¸<C3AF> è·³è¿‡ï¼ˆå·²æœ‰æ ‡ç¾ï¼‰"
|
echo " â<>ï¸<C3AF> è·³è¿‡ï¼ˆå·²æœ‰æ ‡ç¾ï¼‰"
|
||||||
continue
|
continue
|
||||||
@@ -85,55 +85,55 @@ jobs:
|
|||||||
# 分æž<C3A6>å†…å®¹å¹¶æ‰“æ ‡ç¾
|
# 分æž<C3A6>å†…å®¹å¹¶æ‰“æ ‡ç¾
|
||||||
LABELS_TO_ADD=""
|
LABELS_TO_ADD=""
|
||||||
|
|
||||||
# 检测 bug
|
# 检�bug
|
||||||
if echo "$TITLE $BODY" | grep -iE "(bug|错误|崩溃|crash|error|exception|问题|fix)" > /dev/null; then
|
if echo "$TITLE $BODY" | grep -iE "(bug|错误|崩溃|crash|error|exception|问题|fix)" > /dev/null; then
|
||||||
LABELS_TO_ADD="$LABELS_TO_ADD bug"
|
LABELS_TO_ADD="$LABELS_TO_ADD bug"
|
||||||
echo " ðŸ<C3B0>› 检测到: bug"
|
echo " ðŸ<C3B0>› 检测到: bug"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 检测 feature request
|
# 检�feature request
|
||||||
if echo "$TITLE $BODY" | grep -iE "(feature|功能|enhancement|improve|优化|建议|新增|æ·»åŠ |add)" > /dev/null; then
|
if echo "$TITLE $BODY" | grep -iE "(feature|功能|enhancement|improve|优化|建议|新增|æ·»åŠ |add)" > /dev/null; then
|
||||||
LABELS_TO_ADD="$LABELS_TO_ADD enhancement"
|
LABELS_TO_ADD="$LABELS_TO_ADD enhancement"
|
||||||
echo " ✨ 检测到: enhancement"
|
echo " �检测到: enhancement"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 检测 question
|
# 检�question
|
||||||
if echo "$TITLE $BODY" | grep -iE "(question|疑问|how to|如何|怎么|为什么|why|咨询|\?|?)" > /dev/null; then
|
if echo "$TITLE $BODY" | grep -iE "(question|疑问|how to|如何|怎么|为什么|why|咨询|\?|�" > /dev/null; then
|
||||||
LABELS_TO_ADD="$LABELS_TO_ADD question"
|
LABELS_TO_ADD="$LABELS_TO_ADD question"
|
||||||
echo " ❓ 检测到: question"
|
echo " â<EFBFBD>?检测到: question"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 检测 documentation
|
# 检�documentation
|
||||||
if echo "$TITLE $BODY" | grep -iE "(doc|文档|readme|guide|tutorial|教程|说明)" > /dev/null; then
|
if echo "$TITLE $BODY" | grep -iE "(doc|文档|readme|guide|tutorial|教程|说明)" > /dev/null; then
|
||||||
LABELS_TO_ADD="$LABELS_TO_ADD documentation"
|
LABELS_TO_ADD="$LABELS_TO_ADD documentation"
|
||||||
echo " 📖 检测到: documentation"
|
echo " 📖 检测到: documentation"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 检测 performance
|
# 检�performance
|
||||||
if echo "$TITLE $BODY" | grep -iE "(performance|性能|slow|æ…¢|lag|å<>¡é¡¿|optimize|优化)" > /dev/null; then
|
if echo "$TITLE $BODY" | grep -iE "(performance|性能|slow|æ…¢|lag|å<>¡é¡¿|optimize|优化)" > /dev/null; then
|
||||||
LABELS_TO_ADD="$LABELS_TO_ADD performance"
|
LABELS_TO_ADD="$LABELS_TO_ADD performance"
|
||||||
echo " ⚡ 检测到: performance"
|
echo " �检测到: performance"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 检测 core
|
# 检�core
|
||||||
if echo "$TITLE $BODY" | grep -iE "(@esengine/ecs-framework|packages/core|core package|核心包)" > /dev/null; then
|
if echo "$TITLE $BODY" | grep -iE "(@esengine/ecs-framework|packages/framework/core|core package|æ ¸å¿ƒåŒ?" > /dev/null; then
|
||||||
LABELS_TO_ADD="$LABELS_TO_ADD core"
|
LABELS_TO_ADD="$LABELS_TO_ADD core"
|
||||||
echo " 🎯 检测到: core"
|
echo " 🎯 检测到: core"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 检测 editor
|
# 检�editor
|
||||||
if echo "$TITLE $BODY" | grep -iE "(editor|编辑器|tauri)" > /dev/null; then
|
if echo "$TITLE $BODY" | grep -iE "(editor|编辑器|tauri)" > /dev/null; then
|
||||||
LABELS_TO_ADD="$LABELS_TO_ADD editor"
|
LABELS_TO_ADD="$LABELS_TO_ADD editor"
|
||||||
echo " 🎨 检测到: editor"
|
echo " 🎨 检测到: editor"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 检测 network
|
# 检�network
|
||||||
if echo "$TITLE $BODY" | grep -iE "(network|网络|multiplayer|多人|å<>Œæ¥)" > /dev/null; then
|
if echo "$TITLE $BODY" | grep -iE "(network|网络|multiplayer|多人|å<>Œæ¥)" > /dev/null; then
|
||||||
LABELS_TO_ADD="$LABELS_TO_ADD network"
|
LABELS_TO_ADD="$LABELS_TO_ADD network"
|
||||||
echo " ðŸŒ<C5B8> 检测到: network"
|
echo " ðŸŒ<C5B8> 检测到: network"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 检测 help wanted
|
# 检�help wanted
|
||||||
if echo "$TITLE $BODY" | grep -iE "(help wanted|需è¦<C3A8>帮助|求助)" > /dev/null; then
|
if echo "$TITLE $BODY" | grep -iE "(help wanted|需è¦<C3A8>帮助|求助)" > /dev/null; then
|
||||||
LABELS_TO_ADD="$LABELS_TO_ADD help wanted"
|
LABELS_TO_ADD="$LABELS_TO_ADD help wanted"
|
||||||
echo " 🆘 检测到: help wanted"
|
echo " 🆘 检测到: help wanted"
|
||||||
@@ -141,12 +141,12 @@ jobs:
|
|||||||
|
|
||||||
# æ·»åŠ æ ‡ç¾
|
# æ·»åŠ æ ‡ç¾
|
||||||
if [ ! -z "$LABELS_TO_ADD" ]; then
|
if [ ! -z "$LABELS_TO_ADD" ]; then
|
||||||
echo " ✅ 添加标签: $LABELS_TO_ADD"
|
echo " âœ?æ·»åŠ æ ‡ç¾: $LABELS_TO_ADD"
|
||||||
for label in $LABELS_TO_ADD; do
|
for label in $LABELS_TO_ADD; do
|
||||||
gh issue edit $ISSUE_NUM --add-label "$label" 2>&1 | grep -v "already exists" || true
|
gh issue edit $ISSUE_NUM --add-label "$label" 2>&1 | grep -v "already exists" || true
|
||||||
done
|
done
|
||||||
echo " 💬 æ·»åŠ è¯´æ˜Žè¯„è®º..."
|
echo " 💬 æ·»åŠ è¯´æ˜Žè¯„è®º..."
|
||||||
gh issue comment $ISSUE_NUM --body $'🤖 自动标签系统检测到此 issue 并添加了相关标签。如有误判,请告知维护者。\n\n🤖 Auto-labeling system detected and labeled this issue. Please let maintainers know if this is incorrect.' || true
|
gh issue comment $ISSUE_NUM --body $'🤖 è‡ªåŠ¨æ ‡ç¾ç³»ç»Ÿæ£€æµ‹åˆ°æ?issue å¹¶æ·»åŠ äº†ç›¸å…³æ ‡ç¾ã€‚如有误判,请告知维护者。\n\n🤖 Auto-labeling system detected and labeled this issue. Please let maintainers know if this is incorrect.' || true
|
||||||
else
|
else
|
||||||
echo " ℹï¸<C3AF> 未检测到明确类型"
|
echo " ℹï¸<C3AF> 未检测到明确类型"
|
||||||
fi
|
fi
|
||||||
@@ -156,5 +156,5 @@ jobs:
|
|||||||
done
|
done
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
echo "✅ 批量标签完成!"
|
echo "âœ?批é‡<C3A9>æ ‡ç¾å®Œæˆ<C3A6>ï¼?
|
||||||
echo "查看结果: https://github.com/${{ github.repository }}/issues"
|
echo "查看结果: https://github.com/${{ github.repository }}/issues"
|
||||||
|
|||||||
74
.github/workflows/ci.yml
vendored
@@ -42,57 +42,35 @@ jobs:
|
|||||||
node-version: '20.x'
|
node-version: '20.x'
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
|
||||||
- name: Install Rust stable
|
|
||||||
uses: dtolnay/rust-toolchain@stable
|
|
||||||
with:
|
|
||||||
targets: wasm32-unknown-unknown
|
|
||||||
|
|
||||||
# 缓存 Rust 编译结果
|
|
||||||
- name: Cache Rust dependencies
|
|
||||||
uses: Swatinem/rust-cache@v2
|
|
||||||
with:
|
|
||||||
workspaces: packages/engine
|
|
||||||
cache-on-failure: true
|
|
||||||
|
|
||||||
# 缓存 wasm-pack
|
|
||||||
- name: Cache wasm-pack
|
|
||||||
uses: actions/cache@v4
|
|
||||||
with:
|
|
||||||
path: ~/.cargo/bin/wasm-pack
|
|
||||||
key: wasm-pack-${{ runner.os }}
|
|
||||||
|
|
||||||
- name: Install wasm-pack
|
|
||||||
run: |
|
|
||||||
if ! command -v wasm-pack &> /dev/null; then
|
|
||||||
cargo install wasm-pack
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: pnpm install --no-frozen-lockfile
|
run: pnpm install --no-frozen-lockfile
|
||||||
|
|
||||||
# 构建所有包 (使用 Turborepo Remote Cache)
|
# 构建 framework 包 (可独立发布的通用库,无外部依赖)
|
||||||
- name: Build all packages
|
- name: Build framework packages
|
||||||
run: pnpm run build
|
|
||||||
|
|
||||||
- name: Copy WASM files to ecs-engine-bindgen
|
|
||||||
run: |
|
run: |
|
||||||
mkdir -p packages/ecs-engine-bindgen/src/wasm
|
pnpm --filter @esengine/ecs-framework build
|
||||||
cp packages/engine/pkg/es_engine.js packages/ecs-engine-bindgen/src/wasm/
|
pnpm --filter @esengine/ecs-framework-math build
|
||||||
cp packages/engine/pkg/es_engine.d.ts packages/ecs-engine-bindgen/src/wasm/
|
pnpm --filter @esengine/behavior-tree build
|
||||||
cp packages/engine/pkg/es_engine_bg.wasm packages/ecs-engine-bindgen/src/wasm/
|
pnpm --filter @esengine/blueprint build
|
||||||
cp packages/engine/pkg/es_engine_bg.wasm.d.ts packages/ecs-engine-bindgen/src/wasm/
|
pnpm --filter @esengine/fsm build
|
||||||
|
pnpm --filter @esengine/timer build
|
||||||
|
pnpm --filter @esengine/spatial build
|
||||||
|
pnpm --filter @esengine/procgen build
|
||||||
|
pnpm --filter @esengine/pathfinding build
|
||||||
|
pnpm --filter @esengine/network-protocols build
|
||||||
|
pnpm --filter @esengine/network build
|
||||||
|
|
||||||
# 类型检查
|
# 类型检查 (仅 framework 包)
|
||||||
- name: Type check
|
- name: Type check (framework packages)
|
||||||
run: pnpm run type-check
|
run: pnpm run type-check:framework
|
||||||
|
|
||||||
# Lint 检查
|
# Lint 检查 (仅 framework 包)
|
||||||
- name: Lint check
|
- name: Lint check (framework packages)
|
||||||
run: pnpm run lint
|
run: pnpm run lint:framework
|
||||||
|
|
||||||
# 测试
|
# 测试 (仅 framework 包)
|
||||||
- name: Run tests with coverage
|
- name: Run tests with coverage
|
||||||
run: pnpm run test:ci
|
run: pnpm run test:ci:framework
|
||||||
|
|
||||||
- name: Upload coverage to Codecov
|
- name: Upload coverage to Codecov
|
||||||
uses: codecov/codecov-action@v4
|
uses: codecov/codecov-action@v4
|
||||||
@@ -103,9 +81,11 @@ jobs:
|
|||||||
name: codecov-umbrella
|
name: codecov-umbrella
|
||||||
fail_ci_if_error: false
|
fail_ci_if_error: false
|
||||||
|
|
||||||
# 构建 npm 包
|
# 构建 npm 包 (core 和 math)
|
||||||
- name: Build npm packages
|
- name: Build npm packages
|
||||||
run: pnpm run build:npm
|
run: |
|
||||||
|
pnpm run build:npm:core
|
||||||
|
pnpm run build:npm:math
|
||||||
|
|
||||||
# 上传构建产物
|
# 上传构建产物
|
||||||
- name: Upload build artifacts
|
- name: Upload build artifacts
|
||||||
@@ -113,6 +93,6 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
name: build-artifacts
|
name: build-artifacts
|
||||||
path: |
|
path: |
|
||||||
packages/*/dist/
|
packages/framework/**/dist/
|
||||||
packages/*/bin/
|
packages/framework/**/bin/
|
||||||
retention-days: 7
|
retention-days: 7
|
||||||
|
|||||||
6
.github/workflows/codecov.yml
vendored
@@ -28,7 +28,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Run tests with coverage
|
- name: Run tests with coverage
|
||||||
run: |
|
run: |
|
||||||
cd packages/core
|
cd packages/framework/core
|
||||||
pnpm run test:coverage
|
pnpm run test:coverage
|
||||||
|
|
||||||
- name: Upload coverage to Codecov
|
- name: Upload coverage to Codecov
|
||||||
@@ -36,7 +36,7 @@ jobs:
|
|||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.CODECOV_TOKEN }}
|
token: ${{ secrets.CODECOV_TOKEN }}
|
||||||
files: ./packages/core/coverage/coverage-final.json
|
files: ./packages/framework/core/coverage/coverage-final.json
|
||||||
flags: core
|
flags: core
|
||||||
name: core-coverage
|
name: core-coverage
|
||||||
fail_ci_if_error: false
|
fail_ci_if_error: false
|
||||||
@@ -46,4 +46,4 @@ jobs:
|
|||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: coverage-report
|
name: coverage-report
|
||||||
path: packages/core/coverage/
|
path: packages/framework/core/coverage/
|
||||||
|
|||||||
28
.github/workflows/release-editor.yml
vendored
@@ -50,7 +50,7 @@ jobs:
|
|||||||
- name: Rust cache
|
- name: Rust cache
|
||||||
uses: Swatinem/rust-cache@v2
|
uses: Swatinem/rust-cache@v2
|
||||||
with:
|
with:
|
||||||
workspaces: packages/editor-app/src-tauri
|
workspaces: packages/editor/editor-app/src-tauri
|
||||||
cache-on-failure: true
|
cache-on-failure: true
|
||||||
|
|
||||||
- name: Install dependencies (Ubuntu)
|
- name: Install dependencies (Ubuntu)
|
||||||
@@ -65,7 +65,7 @@ jobs:
|
|||||||
- name: Update version in config files (for manual trigger)
|
- name: Update version in config files (for manual trigger)
|
||||||
if: github.event_name == 'workflow_dispatch'
|
if: github.event_name == 'workflow_dispatch'
|
||||||
run: |
|
run: |
|
||||||
cd packages/editor-app
|
cd packages/editor/editor-app
|
||||||
node -e "const pkg=require('./package.json'); pkg.version='${{ github.event.inputs.version }}'; require('fs').writeFileSync('./package.json', JSON.stringify(pkg, null, 2)+'\n')"
|
node -e "const pkg=require('./package.json'); pkg.version='${{ github.event.inputs.version }}'; require('fs').writeFileSync('./package.json', JSON.stringify(pkg, null, 2)+'\n')"
|
||||||
node scripts/sync-version.js
|
node scripts/sync-version.js
|
||||||
|
|
||||||
@@ -80,15 +80,15 @@ jobs:
|
|||||||
- name: Copy WASM files to ecs-engine-bindgen
|
- name: Copy WASM files to ecs-engine-bindgen
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
mkdir -p packages/ecs-engine-bindgen/src/wasm
|
mkdir -p packages/engine/ecs-engine-bindgen/src/wasm
|
||||||
cp packages/engine/pkg/es_engine.js packages/ecs-engine-bindgen/src/wasm/
|
cp packages/rust/engine/pkg/es_engine.js packages/engine/ecs-engine-bindgen/src/wasm/
|
||||||
cp packages/engine/pkg/es_engine.d.ts packages/ecs-engine-bindgen/src/wasm/
|
cp packages/rust/engine/pkg/es_engine.d.ts packages/engine/ecs-engine-bindgen/src/wasm/
|
||||||
cp packages/engine/pkg/es_engine_bg.wasm packages/ecs-engine-bindgen/src/wasm/
|
cp packages/rust/engine/pkg/es_engine_bg.wasm packages/engine/ecs-engine-bindgen/src/wasm/
|
||||||
cp packages/engine/pkg/es_engine_bg.wasm.d.ts packages/ecs-engine-bindgen/src/wasm/
|
cp packages/rust/engine/pkg/es_engine_bg.wasm.d.ts packages/engine/ecs-engine-bindgen/src/wasm/
|
||||||
|
|
||||||
- name: Bundle runtime files for Tauri
|
- name: Bundle runtime files for Tauri
|
||||||
run: |
|
run: |
|
||||||
cd packages/editor-app
|
cd packages/editor/editor-app
|
||||||
node scripts/bundle-runtime.mjs
|
node scripts/bundle-runtime.mjs
|
||||||
|
|
||||||
- name: Build Tauri app
|
- name: Build Tauri app
|
||||||
@@ -99,7 +99,7 @@ jobs:
|
|||||||
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
|
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
|
||||||
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
|
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
|
||||||
with:
|
with:
|
||||||
projectPath: packages/editor-app
|
projectPath: packages/editor/editor-app
|
||||||
tagName: ${{ github.event_name == 'workflow_dispatch' && format('editor-v{0}', github.event.inputs.version) || github.ref_name }}
|
tagName: ${{ github.event_name == 'workflow_dispatch' && format('editor-v{0}', github.event.inputs.version) || github.ref_name }}
|
||||||
releaseName: 'ECS Editor v${{ github.event.inputs.version || github.ref_name }}'
|
releaseName: 'ECS Editor v${{ github.event.inputs.version || github.ref_name }}'
|
||||||
releaseBody: 'See the assets to download this version and install.'
|
releaseBody: 'See the assets to download this version and install.'
|
||||||
@@ -116,8 +116,8 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
name: windows-unsigned
|
name: windows-unsigned
|
||||||
path: |
|
path: |
|
||||||
packages/editor-app/src-tauri/target/release/bundle/nsis/*.exe
|
packages/editor/editor-app/src-tauri/target/release/bundle/nsis/*.exe
|
||||||
packages/editor-app/src-tauri/target/release/bundle/msi/*.msi
|
packages/editor/editor-app/src-tauri/target/release/bundle/msi/*.msi
|
||||||
retention-days: 1
|
retention-days: 1
|
||||||
|
|
||||||
# SignPath 代码签名(Windows)
|
# SignPath 代码签名(Windows)
|
||||||
@@ -221,7 +221,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Update version files
|
- name: Update version files
|
||||||
run: |
|
run: |
|
||||||
cd packages/editor-app
|
cd packages/editor/editor-app
|
||||||
node -e "const pkg=require('./package.json'); pkg.version='${{ github.event.inputs.version }}'; require('fs').writeFileSync('./package.json', JSON.stringify(pkg, null, 2)+'\n')"
|
node -e "const pkg=require('./package.json'); pkg.version='${{ github.event.inputs.version }}'; require('fs').writeFileSync('./package.json', JSON.stringify(pkg, null, 2)+'\n')"
|
||||||
node scripts/sync-version.js
|
node scripts/sync-version.js
|
||||||
|
|
||||||
@@ -239,8 +239,8 @@ jobs:
|
|||||||
This PR updates the editor version after successful release build.
|
This PR updates the editor version after successful release build.
|
||||||
|
|
||||||
### Changes
|
### Changes
|
||||||
- Updated `packages/editor-app/package.json` → `${{ github.event.inputs.version }}`
|
- Updated `packages/editor/editor-app/package.json` → `${{ github.event.inputs.version }}`
|
||||||
- Updated `packages/editor-app/src-tauri/tauri.conf.json` → `${{ github.event.inputs.version }}`
|
- Updated `packages/editor/editor-app/src-tauri/tauri.conf.json` → `${{ github.event.inputs.version }}`
|
||||||
|
|
||||||
### Release
|
### Release
|
||||||
- [GitHub Release](https://github.com/${{ github.repository }}/releases/tag/editor-v${{ github.event.inputs.version }})
|
- [GitHub Release](https://github.com/${{ github.repository }}/releases/tag/editor-v${{ github.event.inputs.version }})
|
||||||
|
|||||||
26
.github/workflows/release.yml
vendored
@@ -1,7 +1,7 @@
|
|||||||
name: Release NPM Packages
|
name: Release NPM Packages
|
||||||
|
|
||||||
on:
|
on:
|
||||||
# 标签触发:支持 v* 和 {package}-v* 格式
|
# æ ‡ç¾è§¦å<EFBFBD>‘:支æŒ?v* å’?{package}-v* æ ¼å¼<EFBFBD>
|
||||||
# Tag trigger: supports v* and {package}-v* formats
|
# Tag trigger: supports v* and {package}-v* formats
|
||||||
push:
|
push:
|
||||||
tags:
|
tags:
|
||||||
@@ -20,7 +20,7 @@ on:
|
|||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
inputs:
|
inputs:
|
||||||
package:
|
package:
|
||||||
description: '选择要发布的包 | Select package to publish'
|
description: '选择è¦<EFBFBD>å<EFBFBD>‘布的åŒ?| Select package to publish'
|
||||||
required: true
|
required: true
|
||||||
type: choice
|
type: choice
|
||||||
options:
|
options:
|
||||||
@@ -65,7 +65,7 @@ jobs:
|
|||||||
TAG="${GITHUB_REF#refs/tags/}"
|
TAG="${GITHUB_REF#refs/tags/}"
|
||||||
echo "tag=$TAG" >> $GITHUB_OUTPUT
|
echo "tag=$TAG" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
# 解析格式:v1.0.0 或 package-v1.0.0
|
# è§£æž<EFBFBD>æ ¼å¼<EFBFBD>:v1.0.0 æˆ?package-v1.0.0
|
||||||
# Parse format: v1.0.0 or package-v1.0.0
|
# Parse format: v1.0.0 or package-v1.0.0
|
||||||
if [[ "$TAG" =~ ^v([0-9]+\.[0-9]+\.[0-9]+.*)$ ]]; then
|
if [[ "$TAG" =~ ^v([0-9]+\.[0-9]+\.[0-9]+.*)$ ]]; then
|
||||||
PACKAGE="core"
|
PACKAGE="core"
|
||||||
@@ -85,7 +85,7 @@ jobs:
|
|||||||
echo "📦 Package: $PACKAGE"
|
echo "📦 Package: $PACKAGE"
|
||||||
echo "📌 Version: $VERSION"
|
echo "📌 Version: $VERSION"
|
||||||
else
|
else
|
||||||
# 手动触发:从 package.json 读取并 bump 版本
|
# 手动触å<EFBFBD>‘:从 package.json 读å<C2BB>–å¹?bump 版本
|
||||||
# Manual trigger: read from package.json and bump version
|
# Manual trigger: read from package.json and bump version
|
||||||
PACKAGE="${{ github.event.inputs.package }}"
|
PACKAGE="${{ github.event.inputs.package }}"
|
||||||
echo "package=$PACKAGE" >> $GITHUB_OUTPUT
|
echo "package=$PACKAGE" >> $GITHUB_OUTPUT
|
||||||
@@ -125,7 +125,7 @@ jobs:
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "✅ Version verified: $EXPECTED_VERSION"
|
echo "�Version verified: $EXPECTED_VERSION"
|
||||||
|
|
||||||
- name: Bump version (manual mode)
|
- name: Bump version (manual mode)
|
||||||
if: steps.parse.outputs.mode == 'manual'
|
if: steps.parse.outputs.mode == 'manual'
|
||||||
@@ -147,7 +147,7 @@ jobs:
|
|||||||
node -e "const fs=require('fs'); const pkg=JSON.parse(fs.readFileSync('package.json')); pkg.version='$NEW_VERSION'; fs.writeFileSync('package.json', JSON.stringify(pkg, null, 2)+'\n')"
|
node -e "const fs=require('fs'); const pkg=JSON.parse(fs.readFileSync('package.json')); pkg.version='$NEW_VERSION'; fs.writeFileSync('package.json', JSON.stringify(pkg, null, 2)+'\n')"
|
||||||
|
|
||||||
echo "version=$NEW_VERSION" >> $GITHUB_OUTPUT
|
echo "version=$NEW_VERSION" >> $GITHUB_OUTPUT
|
||||||
echo "📌 Bumped version: $CURRENT → $NEW_VERSION"
|
echo "📌 Bumped version: $CURRENT �$NEW_VERSION"
|
||||||
|
|
||||||
- name: Set final version
|
- name: Set final version
|
||||||
id: version
|
id: version
|
||||||
@@ -161,7 +161,7 @@ jobs:
|
|||||||
- name: Build core package (if needed)
|
- name: Build core package (if needed)
|
||||||
if: ${{ steps.parse.outputs.package != 'core' && steps.parse.outputs.package != 'node-editor' && steps.parse.outputs.package != 'worker-generator' }}
|
if: ${{ steps.parse.outputs.package != 'core' && steps.parse.outputs.package != 'node-editor' && steps.parse.outputs.package != 'worker-generator' }}
|
||||||
run: |
|
run: |
|
||||||
cd packages/core
|
cd packages/framework/core
|
||||||
pnpm run build
|
pnpm run build
|
||||||
|
|
||||||
- name: Build node-editor package (if needed for blueprint)
|
- name: Build node-editor package (if needed for blueprint)
|
||||||
@@ -188,8 +188,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
tag_name: ${{ steps.parse.outputs.tag }}
|
tag_name: ${{ steps.parse.outputs.tag }}
|
||||||
name: "${{ steps.parse.outputs.package }} v${{ steps.version.outputs.value }}"
|
name: "${{ steps.parse.outputs.package }} v${{ steps.version.outputs.value }}"
|
||||||
# 不设置为 latest,latest 保留给编辑器热更新使用
|
# ä¸<EFBFBD>设置为 latest,latest ä¿<C3A4>ç•™ç»™ç¼–è¾‘å™¨çƒæ›´æ–°ä½¿ç”? # Don't mark as latest, reserve latest for editor auto-update
|
||||||
# Don't mark as latest, reserve latest for editor auto-update
|
|
||||||
make_latest: false
|
make_latest: false
|
||||||
body: |
|
body: |
|
||||||
## 🚀 @esengine/${{ steps.parse.outputs.package }} v${{ steps.version.outputs.value }}
|
## 🚀 @esengine/${{ steps.parse.outputs.package }} v${{ steps.version.outputs.value }}
|
||||||
@@ -218,14 +217,13 @@ jobs:
|
|||||||
body: |
|
body: |
|
||||||
## 🚀 Release v${{ steps.version.outputs.value }}
|
## 🚀 Release v${{ steps.version.outputs.value }}
|
||||||
|
|
||||||
此 PR 更新 `@esengine/${{ steps.parse.outputs.package }}` 包的版本号
|
æ?PR æ›´æ–° `@esengine/${{ steps.parse.outputs.package }}` 包的版本å<EFBFBD>?
|
||||||
|
|
||||||
### å<>˜æ›´
|
### å<>˜æ›´
|
||||||
- ✅ 已发布到 npm: [@esengine/${{ steps.parse.outputs.package }}@${{ steps.version.outputs.value }}](https://www.npmjs.com/package/@esengine/${{ steps.parse.outputs.package }}/v/${{ steps.version.outputs.value }})
|
- âœ?å·²å<C2B2>‘布到 npm: [@esengine/${{ steps.parse.outputs.package }}@${{ steps.version.outputs.value }}](https://www.npmjs.com/package/@esengine/${{ steps.parse.outputs.package }}/v/${{ steps.version.outputs.value }})
|
||||||
- ✅ 更新 `packages/${{ steps.parse.outputs.package }}/package.json` → `${{ steps.version.outputs.value }}`
|
- �更新 `packages/${{ steps.parse.outputs.package }}/package.json` �`${{ steps.version.outputs.value }}`
|
||||||
|
|
||||||
---
|
---
|
||||||
*此 PR 由发布工作流自动创建*
|
*æ?PR ç”±å<C2B1>‘布工作æµ<C3A6>自动创建*
|
||||||
labels: |
|
labels: |
|
||||||
release
|
release
|
||||||
${{ steps.parse.outputs.package }}
|
${{ steps.parse.outputs.package }}
|
||||||
|
|||||||
6
.github/workflows/size-limit.yml
vendored
@@ -6,8 +6,8 @@ on:
|
|||||||
- master
|
- master
|
||||||
- main
|
- main
|
||||||
paths:
|
paths:
|
||||||
- 'packages/core/src/**'
|
- 'packages/framework/core/src/**'
|
||||||
- 'packages/core/package.json'
|
- 'packages/framework/core/package.json'
|
||||||
- '.size-limit.json'
|
- '.size-limit.json'
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
@@ -36,7 +36,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Build core package
|
- name: Build core package
|
||||||
run: |
|
run: |
|
||||||
cd packages/core
|
cd packages/framework/core
|
||||||
pnpm run build:npm
|
pnpm run build:npm
|
||||||
|
|
||||||
- name: Check bundle size
|
- name: Check bundle size
|
||||||
|
|||||||
293
README.md
@@ -5,7 +5,7 @@
|
|||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<strong>Cross-platform 2D Game Engine</strong>
|
<strong>Modular Game Framework for TypeScript</strong>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
@@ -23,55 +23,35 @@
|
|||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://esengine.cn/">Documentation</a> ·
|
<a href="https://esengine.cn/">Documentation</a> ·
|
||||||
<a href="https://esengine.cn/api/README">API Reference</a> ·
|
<a href="https://esengine.cn/api/README">API Reference</a> ·
|
||||||
<a href="https://github.com/esengine/esengine/releases">Download Editor</a> ·
|
|
||||||
<a href="./examples/">Examples</a>
|
<a href="./examples/">Examples</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
> **Just need ECS?** The core ECS framework [`@esengine/ecs-framework`](./packages/core/) can be used standalone with Cocos Creator, Laya, or any JS engine. [View ECS Documentation](./packages/core/README.md)
|
## What is ESEngine?
|
||||||
|
|
||||||
## Overview
|
ESEngine is a collection of **engine-agnostic game development modules** for TypeScript. Use them with Cocos Creator, Laya, Phaser, PixiJS, or any JavaScript game engine.
|
||||||
|
|
||||||
ESEngine is a cross-platform 2D game engine built from the ground up with modern web technologies. It provides a comprehensive toolset that enables developers to focus on creating games rather than building infrastructure.
|
The core is a high-performance **ECS (Entity-Component-System)** framework, accompanied by optional modules for AI, networking, physics, and more.
|
||||||
|
|
||||||
Export your games to multiple platforms including web browsers, WeChat Mini Games, and other mini-game platforms from a single codebase.
|
|
||||||
|
|
||||||
## Key Features
|
|
||||||
|
|
||||||
| Feature | Description |
|
|
||||||
|---------|-------------|
|
|
||||||
| **ECS Architecture** | Data-driven Entity-Component-System pattern for flexible and cache-friendly game logic |
|
|
||||||
| **High-Performance Rendering** | Rust/WebAssembly 2D renderer with automatic sprite batching and WebGL 2.0 backend |
|
|
||||||
| **Visual Editor** | Cross-platform desktop editor built with Tauri for scene management and asset workflows |
|
|
||||||
| **Modular Design** | Import only what you need - each feature is a standalone package |
|
|
||||||
| **Multi-Platform Export** | Deploy to Web, WeChat Mini Games, and more from one codebase |
|
|
||||||
| **Physics Integration** | 2D physics powered by Rapier with editor visualization |
|
|
||||||
| **Visual Scripting** | Behavior trees and blueprint system for designers |
|
|
||||||
|
|
||||||
## Tech Stack
|
|
||||||
|
|
||||||
- **Runtime**: TypeScript, Rust, WebAssembly
|
|
||||||
- **Renderer**: WebGL 2.0, WGPU (planned)
|
|
||||||
- **Editor**: Tauri, React, Zustand
|
|
||||||
- **Physics**: Rapier2D
|
|
||||||
- **Build**: pnpm, Turborepo, Rollup
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
ESEngine is **free and open source** under the [MIT License](LICENSE). No royalties, no strings attached.
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
### npm
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
npm install @esengine/ecs-framework
|
npm install @esengine/ecs-framework
|
||||||
```
|
```
|
||||||
|
|
||||||
### Editor
|
## Features
|
||||||
|
|
||||||
Download pre-built binaries from the [Releases](https://github.com/esengine/esengine/releases) page (Windows, macOS).
|
| Module | Description | Engine Required |
|
||||||
|
|--------|-------------|:---------------:|
|
||||||
|
| **ECS Core** | Entity-Component-System framework with reactive queries | No |
|
||||||
|
| **Behavior Tree** | AI behavior trees with visual editor support | No |
|
||||||
|
| **Blueprint** | Visual scripting system | No |
|
||||||
|
| **FSM** | Finite state machine | No |
|
||||||
|
| **Timer** | Timer and cooldown systems | No |
|
||||||
|
| **Spatial** | Spatial indexing and queries (QuadTree, Grid) | No |
|
||||||
|
| **Pathfinding** | A* and navigation mesh pathfinding | No |
|
||||||
|
| **Network** | Client/server networking with TSRPC | No |
|
||||||
|
|
||||||
|
> All framework modules can be used standalone with any rendering engine.
|
||||||
|
|
||||||
## Quick Start
|
## Quick Start
|
||||||
|
|
||||||
@@ -81,6 +61,7 @@ import {
|
|||||||
Matcher, Time, ECSComponent, ECSSystem
|
Matcher, Time, ECSComponent, ECSSystem
|
||||||
} from '@esengine/ecs-framework';
|
} from '@esengine/ecs-framework';
|
||||||
|
|
||||||
|
// Define components (data only)
|
||||||
@ECSComponent('Position')
|
@ECSComponent('Position')
|
||||||
class Position extends Component {
|
class Position extends Component {
|
||||||
x = 0;
|
x = 0;
|
||||||
@@ -93,6 +74,7 @@ class Velocity extends Component {
|
|||||||
dy = 0;
|
dy = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Define system (logic)
|
||||||
@ECSSystem('Movement')
|
@ECSSystem('Movement')
|
||||||
class MovementSystem extends EntitySystem {
|
class MovementSystem extends EntitySystem {
|
||||||
constructor() {
|
constructor() {
|
||||||
@@ -120,7 +102,7 @@ player.addComponent(new Velocity());
|
|||||||
|
|
||||||
Core.setScene(scene);
|
Core.setScene(scene);
|
||||||
|
|
||||||
// Game loop
|
// Integrate with your game loop
|
||||||
function gameLoop(currentTime: number) {
|
function gameLoop(currentTime: number) {
|
||||||
Core.update(currentTime / 1000);
|
Core.update(currentTime / 1000);
|
||||||
requestAnimationFrame(gameLoop);
|
requestAnimationFrame(gameLoop);
|
||||||
@@ -128,109 +110,126 @@ function gameLoop(currentTime: number) {
|
|||||||
requestAnimationFrame(gameLoop);
|
requestAnimationFrame(gameLoop);
|
||||||
```
|
```
|
||||||
|
|
||||||
## Packages
|
## Using with Other Engines
|
||||||
|
|
||||||
ESEngine is organized as a monorepo with 50+ modular packages. Install only what you need.
|
ESEngine's framework modules are designed to work alongside your preferred rendering engine:
|
||||||
|
|
||||||
### Essential
|
### With Cocos Creator
|
||||||
|
|
||||||
```bash
|
```typescript
|
||||||
npm install @esengine/ecs-framework # Core ECS (can be used standalone)
|
import { Component as CCComponent, _decorator } from 'cc';
|
||||||
npm install @esengine/engine-core # Full engine with module system
|
import { Core, Scene, Matcher, EntitySystem } from '@esengine/ecs-framework';
|
||||||
|
import { BehaviorTreeExecutionSystem } from '@esengine/behavior-tree';
|
||||||
|
|
||||||
|
const { ccclass } = _decorator;
|
||||||
|
|
||||||
|
@ccclass('GameManager')
|
||||||
|
export class GameManager extends CCComponent {
|
||||||
|
private ecsScene!: Scene;
|
||||||
|
|
||||||
|
start() {
|
||||||
|
Core.create();
|
||||||
|
this.ecsScene = new Scene();
|
||||||
|
|
||||||
|
// Add ECS systems
|
||||||
|
this.ecsScene.addSystem(new BehaviorTreeExecutionSystem());
|
||||||
|
this.ecsScene.addSystem(new MyGameSystem());
|
||||||
|
|
||||||
|
Core.setScene(this.ecsScene);
|
||||||
|
}
|
||||||
|
|
||||||
|
update(dt: number) {
|
||||||
|
Core.update(dt);
|
||||||
|
}
|
||||||
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Popular Modules
|
### With Laya
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import { Core, Scene } from '@esengine/ecs-framework';
|
||||||
|
import { FSMSystem } from '@esengine/fsm';
|
||||||
|
|
||||||
|
class Main {
|
||||||
|
constructor() {
|
||||||
|
Core.create();
|
||||||
|
const scene = new Scene();
|
||||||
|
scene.addSystem(new FSMSystem());
|
||||||
|
Core.setScene(scene);
|
||||||
|
|
||||||
|
Laya.timer.frameLoop(1, this, this.update);
|
||||||
|
}
|
||||||
|
|
||||||
|
update() {
|
||||||
|
Core.update(Laya.timer.delta / 1000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Packages
|
||||||
|
|
||||||
|
### Framework (Engine-Agnostic)
|
||||||
|
|
||||||
|
These packages have **zero rendering dependencies** and work with any engine:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install @esengine/ecs-framework # Core ECS
|
||||||
|
npm install @esengine/behavior-tree # AI behavior trees
|
||||||
|
npm install @esengine/blueprint # Visual scripting
|
||||||
|
npm install @esengine/fsm # State machines
|
||||||
|
npm install @esengine/timer # Timers & cooldowns
|
||||||
|
npm install @esengine/spatial # Spatial indexing
|
||||||
|
npm install @esengine/pathfinding # Pathfinding
|
||||||
|
npm install @esengine/network # Networking
|
||||||
|
```
|
||||||
|
|
||||||
|
### ESEngine Runtime (Optional)
|
||||||
|
|
||||||
|
If you want a complete engine solution with rendering:
|
||||||
|
|
||||||
| Category | Packages |
|
| Category | Packages |
|
||||||
|----------|----------|
|
|----------|----------|
|
||||||
| **Rendering** | `sprite`, `tilemap`, `particle`, `mesh-3d`, `fairygui` |
|
| **Core** | `engine-core`, `asset-system`, `material-system` |
|
||||||
|
| **Rendering** | `sprite`, `tilemap`, `particle`, `camera`, `mesh-3d` |
|
||||||
| **Physics** | `physics-rapier2d` |
|
| **Physics** | `physics-rapier2d` |
|
||||||
| **AI & Logic** | `behavior-tree`, `blueprint` |
|
|
||||||
| **Network** | `network`, `network-server` |
|
|
||||||
| **Platform** | `platform-web`, `platform-wechat` |
|
| **Platform** | `platform-web`, `platform-wechat` |
|
||||||
|
|
||||||
<details>
|
### Editor (Optional)
|
||||||
<summary><b>View all 50+ packages</b></summary>
|
|
||||||
|
|
||||||
#### Core
|
A visual editor built with Tauri for scene management:
|
||||||
- `@esengine/ecs-framework` - ECS framework core
|
|
||||||
- `@esengine/math` - Vector, matrix utilities
|
|
||||||
- `@esengine/engine` - Rust/WASM renderer
|
|
||||||
- `@esengine/engine-core` - Module lifecycle
|
|
||||||
|
|
||||||
#### Runtime
|
- Download from [Releases](https://github.com/esengine/esengine/releases)
|
||||||
- `@esengine/sprite` - 2D sprites & animation
|
- Supports behavior tree editing, tilemap painting, visual scripting
|
||||||
- `@esengine/tilemap` - Tile-based maps
|
|
||||||
- `@esengine/particle` - Particle effects
|
|
||||||
- `@esengine/physics-rapier2d` - 2D physics
|
|
||||||
- `@esengine/behavior-tree` - AI behavior trees
|
|
||||||
- `@esengine/blueprint` - Visual scripting
|
|
||||||
- `@esengine/camera` - Camera system
|
|
||||||
- `@esengine/audio` - Audio playback
|
|
||||||
- `@esengine/fairygui` - FairyGUI integration
|
|
||||||
- `@esengine/mesh-3d` - 3D mesh (FBX/GLTF/OBJ)
|
|
||||||
- `@esengine/material-system` - Materials & shaders
|
|
||||||
- `@esengine/asset-system` - Asset management
|
|
||||||
- `@esengine/world-streaming` - Large world streaming
|
|
||||||
|
|
||||||
#### Network
|
## Project Structure
|
||||||
- `@esengine/network` - Client (TSRPC)
|
|
||||||
- `@esengine/network-server` - Server runtime
|
|
||||||
- `@esengine/network-protocols` - Shared protocols
|
|
||||||
|
|
||||||
#### Editor Extensions
|
```
|
||||||
All runtime modules have corresponding `-editor` packages for visual editing.
|
esengine/
|
||||||
|
├── packages/
|
||||||
#### Platform
|
│ ├── framework/ # Engine-agnostic modules (NPM publishable)
|
||||||
- `@esengine/platform-common` - Platform abstraction
|
│ │ ├── core/ # ECS Framework
|
||||||
- `@esengine/platform-web` - Web runtime
|
│ │ ├── math/ # Math utilities
|
||||||
- `@esengine/platform-wechat` - WeChat Mini Game
|
│ │ ├── behavior-tree/ # AI behavior trees
|
||||||
|
│ │ ├── blueprint/ # Visual scripting
|
||||||
</details>
|
│ │ ├── fsm/ # Finite state machine
|
||||||
|
│ │ ├── timer/ # Timer system
|
||||||
## Editor
|
│ │ ├── spatial/ # Spatial queries
|
||||||
|
│ │ ├── pathfinding/ # Pathfinding
|
||||||
The ESEngine Editor is a cross-platform desktop application built with Tauri and React.
|
│ │ ├── procgen/ # Procedural generation
|
||||||
|
│ │ └── network/ # Networking
|
||||||
### Features
|
│ │
|
||||||
|
│ ├── engine/ # ESEngine runtime
|
||||||
- Scene hierarchy and entity management
|
│ ├── rendering/ # Rendering modules
|
||||||
- Component inspector with custom property editors
|
│ ├── physics/ # Physics modules
|
||||||
- Asset browser with drag-and-drop
|
│ ├── editor/ # Visual editor
|
||||||
- Tilemap editor with paint and fill tools
|
│ └── rust/ # WASM renderer
|
||||||
- Behavior tree visual editor
|
│
|
||||||
- Blueprint visual scripting
|
├── docs/ # Documentation
|
||||||
- Material and shader editing
|
└── examples/ # Examples
|
||||||
- Built-in performance profiler
|
```
|
||||||
- Localization (English, Chinese)
|
|
||||||
|
|
||||||
### Screenshot
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
## Platform Support
|
|
||||||
|
|
||||||
| Platform | Runtime | Editor |
|
|
||||||
|----------|:-------:|:------:|
|
|
||||||
| Web Browser | ✓ | - |
|
|
||||||
| Windows | - | ✓ |
|
|
||||||
| macOS | - | ✓ |
|
|
||||||
| WeChat Mini Game | In Progress | - |
|
|
||||||
| Playable Ads | Planned | - |
|
|
||||||
| Android | Planned | - |
|
|
||||||
| iOS | Planned | - |
|
|
||||||
|
|
||||||
## Building from Source
|
## Building from Source
|
||||||
|
|
||||||
### Prerequisites
|
|
||||||
|
|
||||||
- Node.js 18+
|
|
||||||
- pnpm 10+
|
|
||||||
- Rust toolchain (for WASM renderer)
|
|
||||||
- wasm-pack
|
|
||||||
|
|
||||||
### Setup
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone https://github.com/esengine/esengine.git
|
git clone https://github.com/esengine/esengine.git
|
||||||
cd esengine
|
cd esengine
|
||||||
@@ -238,54 +237,28 @@ cd esengine
|
|||||||
pnpm install
|
pnpm install
|
||||||
pnpm build
|
pnpm build
|
||||||
|
|
||||||
# Optional: Build WASM renderer
|
# Type check framework packages
|
||||||
pnpm build:wasm
|
pnpm type-check:framework
|
||||||
|
|
||||||
|
# Run tests
|
||||||
|
pnpm test
|
||||||
```
|
```
|
||||||
|
|
||||||
### Run Editor
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd packages/editor-app
|
|
||||||
pnpm tauri:dev
|
|
||||||
```
|
|
||||||
|
|
||||||
### Project Structure
|
|
||||||
|
|
||||||
```
|
|
||||||
esengine/
|
|
||||||
├── packages/
|
|
||||||
│ ├── core/ # ECS Framework (@esengine/ecs-framework)
|
|
||||||
│ ├── math/ # Math library (@esengine/math)
|
|
||||||
│ ├── engine-core/ # Engine lifecycle management
|
|
||||||
│ ├── sprite/ # 2D sprite rendering
|
|
||||||
│ ├── tilemap/ # Tilemap system
|
|
||||||
│ ├── physics-rapier2d/ # Physics engine
|
|
||||||
│ ├── behavior-tree/ # AI behavior trees
|
|
||||||
│ ├── editor-app/ # Desktop editor (Tauri)
|
|
||||||
│ └── ... # Other modules
|
|
||||||
├── docs/ # Documentation source
|
|
||||||
├── examples/ # Example projects
|
|
||||||
├── scripts/ # Build utilities
|
|
||||||
└── thirdparty/ # Third-party dependencies
|
|
||||||
```
|
|
||||||
|
|
||||||
> **Looking for ECS source code?** The ECS framework is in `packages/core/`
|
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
|
|
||||||
- [Getting Started](https://esengine.cn/guide/getting-started.html)
|
- [ECS Framework Guide](./packages/framework/core/README.md)
|
||||||
- [Architecture Guide](https://esengine.cn/guide/)
|
- [Behavior Tree Guide](./packages/framework/behavior-tree/README.md)
|
||||||
- [API Reference](https://esengine.cn/api/README)
|
- [API Reference](https://esengine.cn/api/README)
|
||||||
|
|
||||||
## Community
|
## Community
|
||||||
|
|
||||||
- [Discord](https://discord.gg/gCAgzXFW) - Chat with the community
|
|
||||||
- [GitHub Issues](https://github.com/esengine/esengine/issues) - Bug reports and feature requests
|
- [GitHub Issues](https://github.com/esengine/esengine/issues) - Bug reports and feature requests
|
||||||
- [GitHub Discussions](https://github.com/esengine/esengine/discussions) - Questions and ideas
|
- [GitHub Discussions](https://github.com/esengine/esengine/discussions) - Questions and ideas
|
||||||
|
- [Discord](https://discord.gg/gCAgzXFW) - Chat with the community
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
Contributions are welcome. Please read the contributing guidelines before submitting a pull request.
|
Contributions are welcome! Please read our contributing guidelines before submitting a pull request.
|
||||||
|
|
||||||
1. Fork the repository
|
1. Fork the repository
|
||||||
2. Create a feature branch (`git checkout -b feature/amazing-feature`)
|
2. Create a feature branch (`git checkout -b feature/amazing-feature`)
|
||||||
@@ -295,10 +268,10 @@ Contributions are welcome. Please read the contributing guidelines before submit
|
|||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
ESEngine is licensed under the [MIT License](LICENSE).
|
ESEngine is licensed under the [MIT License](LICENSE). Free for personal and commercial use.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
Made with ❤️ by the ESEngine team
|
Made with care by the ESEngine community
|
||||||
</p>
|
</p>
|
||||||
|
|||||||
293
README_CN.md
@@ -5,7 +5,7 @@
|
|||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<strong>跨平台 2D 游戏引擎</strong>
|
<strong>TypeScript 模块化游戏框架</strong>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
@@ -23,55 +23,35 @@
|
|||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://esengine.cn/">文档</a> ·
|
<a href="https://esengine.cn/">文档</a> ·
|
||||||
<a href="https://esengine.cn/api/README">API 参考</a> ·
|
<a href="https://esengine.cn/api/README">API 参考</a> ·
|
||||||
<a href="https://github.com/esengine/esengine/releases">下载编辑器</a> ·
|
|
||||||
<a href="./examples/">示例</a>
|
<a href="./examples/">示例</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
> **只需要 ECS?** 核心 ECS 框架 [`@esengine/ecs-framework`](./packages/core/) 可独立使用,支持 Cocos Creator、Laya 或任何 JS 引擎。[查看 ECS 文档](./packages/core/README_CN.md)
|
## ESEngine 是什么?
|
||||||
|
|
||||||
## 概述
|
ESEngine 是一套**引擎无关的游戏开发模块**,可与 Cocos Creator、Laya、Phaser、PixiJS 等任何 JavaScript 游戏引擎配合使用。
|
||||||
|
|
||||||
ESEngine 是一款基于现代 Web 技术从零构建的跨平台 2D 游戏引擎。它提供完整的工具集,让开发者专注于游戏创作而非基础设施搭建。
|
核心是一个高性能的 **ECS(实体-组件-系统)** 框架,配套 AI、网络、物理等可选模块。
|
||||||
|
|
||||||
一套代码即可导出到 Web 浏览器、微信小游戏等多个平台。
|
|
||||||
|
|
||||||
## 核心特性
|
|
||||||
|
|
||||||
| 特性 | 描述 |
|
|
||||||
|-----|------|
|
|
||||||
| **ECS 架构** | 数据驱动的实体-组件-系统模式,提供灵活且缓存友好的游戏逻辑 |
|
|
||||||
| **高性能渲染** | Rust/WebAssembly 2D 渲染器,支持自动精灵批处理和 WebGL 2.0 |
|
|
||||||
| **可视化编辑器** | 基于 Tauri 的跨平台桌面编辑器,支持场景管理和资源工作流 |
|
|
||||||
| **模块化设计** | 按需引入,每个功能都是独立的包 |
|
|
||||||
| **多平台导出** | 一套代码部署到 Web、微信小游戏等平台 |
|
|
||||||
| **物理集成** | 基于 Rapier 的 2D 物理,支持编辑器可视化 |
|
|
||||||
| **可视化脚本** | 行为树和蓝图系统,适合策划使用 |
|
|
||||||
|
|
||||||
## 技术栈
|
|
||||||
|
|
||||||
- **运行时**: TypeScript, Rust, WebAssembly
|
|
||||||
- **渲染器**: WebGL 2.0, WGPU (计划中)
|
|
||||||
- **编辑器**: Tauri, React, Zustand
|
|
||||||
- **物理**: Rapier2D
|
|
||||||
- **构建**: pnpm, Turborepo, Rollup
|
|
||||||
|
|
||||||
## 许可证
|
|
||||||
|
|
||||||
ESEngine **完全免费开源**,采用 [MIT 协议](LICENSE)。无版税,无附加条件。
|
|
||||||
|
|
||||||
## 安装
|
|
||||||
|
|
||||||
### npm
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
npm install @esengine/ecs-framework
|
npm install @esengine/ecs-framework
|
||||||
```
|
```
|
||||||
|
|
||||||
### 编辑器
|
## 功能模块
|
||||||
|
|
||||||
从 [Releases](https://github.com/esengine/esengine/releases) 页面下载预编译版本(支持 Windows、macOS)。
|
| 模块 | 描述 | 需要渲染引擎 |
|
||||||
|
|------|------|:----------:|
|
||||||
|
| **ECS 核心** | 实体-组件-系统框架,支持响应式查询 | 否 |
|
||||||
|
| **行为树** | AI 行为树,支持可视化编辑 | 否 |
|
||||||
|
| **蓝图** | 可视化脚本系统 | 否 |
|
||||||
|
| **状态机** | 有限状态机 | 否 |
|
||||||
|
| **定时器** | 定时器和冷却系统 | 否 |
|
||||||
|
| **空间索引** | 空间查询(四叉树、网格) | 否 |
|
||||||
|
| **寻路** | A* 和导航网格寻路 | 否 |
|
||||||
|
| **网络** | 客户端/服务端网络通信 (TSRPC) | 否 |
|
||||||
|
|
||||||
|
> 所有框架模块都可以独立使用,无需依赖特定渲染引擎。
|
||||||
|
|
||||||
## 快速开始
|
## 快速开始
|
||||||
|
|
||||||
@@ -81,6 +61,7 @@ import {
|
|||||||
Matcher, Time, ECSComponent, ECSSystem
|
Matcher, Time, ECSComponent, ECSSystem
|
||||||
} from '@esengine/ecs-framework';
|
} from '@esengine/ecs-framework';
|
||||||
|
|
||||||
|
// 定义组件(纯数据)
|
||||||
@ECSComponent('Position')
|
@ECSComponent('Position')
|
||||||
class Position extends Component {
|
class Position extends Component {
|
||||||
x = 0;
|
x = 0;
|
||||||
@@ -93,6 +74,7 @@ class Velocity extends Component {
|
|||||||
dy = 0;
|
dy = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 定义系统(逻辑)
|
||||||
@ECSSystem('Movement')
|
@ECSSystem('Movement')
|
||||||
class MovementSystem extends EntitySystem {
|
class MovementSystem extends EntitySystem {
|
||||||
constructor() {
|
constructor() {
|
||||||
@@ -120,7 +102,7 @@ player.addComponent(new Velocity());
|
|||||||
|
|
||||||
Core.setScene(scene);
|
Core.setScene(scene);
|
||||||
|
|
||||||
// 游戏循环
|
// 集成到你的游戏循环
|
||||||
function gameLoop(currentTime: number) {
|
function gameLoop(currentTime: number) {
|
||||||
Core.update(currentTime / 1000);
|
Core.update(currentTime / 1000);
|
||||||
requestAnimationFrame(gameLoop);
|
requestAnimationFrame(gameLoop);
|
||||||
@@ -128,109 +110,126 @@ function gameLoop(currentTime: number) {
|
|||||||
requestAnimationFrame(gameLoop);
|
requestAnimationFrame(gameLoop);
|
||||||
```
|
```
|
||||||
|
|
||||||
## 模块
|
## 与其他引擎配合使用
|
||||||
|
|
||||||
ESEngine 采用 Monorepo 组织,包含 50+ 个模块化包。按需引入即可。
|
ESEngine 的框架模块设计为可与你喜欢的渲染引擎配合使用:
|
||||||
|
|
||||||
### 核心安装
|
### 与 Cocos Creator 配合
|
||||||
|
|
||||||
```bash
|
```typescript
|
||||||
npm install @esengine/ecs-framework # ECS 核心(可独立使用)
|
import { Component as CCComponent, _decorator } from 'cc';
|
||||||
npm install @esengine/engine-core # 完整引擎模块系统
|
import { Core, Scene, Matcher, EntitySystem } from '@esengine/ecs-framework';
|
||||||
|
import { BehaviorTreeExecutionSystem } from '@esengine/behavior-tree';
|
||||||
|
|
||||||
|
const { ccclass } = _decorator;
|
||||||
|
|
||||||
|
@ccclass('GameManager')
|
||||||
|
export class GameManager extends CCComponent {
|
||||||
|
private ecsScene!: Scene;
|
||||||
|
|
||||||
|
start() {
|
||||||
|
Core.create();
|
||||||
|
this.ecsScene = new Scene();
|
||||||
|
|
||||||
|
// 添加 ECS 系统
|
||||||
|
this.ecsScene.addSystem(new BehaviorTreeExecutionSystem());
|
||||||
|
this.ecsScene.addSystem(new MyGameSystem());
|
||||||
|
|
||||||
|
Core.setScene(this.ecsScene);
|
||||||
|
}
|
||||||
|
|
||||||
|
update(dt: number) {
|
||||||
|
Core.update(dt);
|
||||||
|
}
|
||||||
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### 常用模块
|
### 与 Laya 配合
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import { Core, Scene } from '@esengine/ecs-framework';
|
||||||
|
import { FSMSystem } from '@esengine/fsm';
|
||||||
|
|
||||||
|
class Main {
|
||||||
|
constructor() {
|
||||||
|
Core.create();
|
||||||
|
const scene = new Scene();
|
||||||
|
scene.addSystem(new FSMSystem());
|
||||||
|
Core.setScene(scene);
|
||||||
|
|
||||||
|
Laya.timer.frameLoop(1, this, this.update);
|
||||||
|
}
|
||||||
|
|
||||||
|
update() {
|
||||||
|
Core.update(Laya.timer.delta / 1000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 包列表
|
||||||
|
|
||||||
|
### 框架包(引擎无关)
|
||||||
|
|
||||||
|
这些包**零渲染依赖**,可与任何引擎配合使用:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install @esengine/ecs-framework # ECS 核心
|
||||||
|
npm install @esengine/behavior-tree # AI 行为树
|
||||||
|
npm install @esengine/blueprint # 可视化脚本
|
||||||
|
npm install @esengine/fsm # 状态机
|
||||||
|
npm install @esengine/timer # 定时器和冷却
|
||||||
|
npm install @esengine/spatial # 空间索引
|
||||||
|
npm install @esengine/pathfinding # 寻路
|
||||||
|
npm install @esengine/network # 网络
|
||||||
|
```
|
||||||
|
|
||||||
|
### ESEngine 运行时(可选)
|
||||||
|
|
||||||
|
如果你需要完整的引擎解决方案:
|
||||||
|
|
||||||
| 分类 | 包名 |
|
| 分类 | 包名 |
|
||||||
|------|------|
|
|------|------|
|
||||||
| **渲染** | `sprite`, `tilemap`, `particle`, `mesh-3d`, `fairygui` |
|
| **核心** | `engine-core`, `asset-system`, `material-system` |
|
||||||
|
| **渲染** | `sprite`, `tilemap`, `particle`, `camera`, `mesh-3d` |
|
||||||
| **物理** | `physics-rapier2d` |
|
| **物理** | `physics-rapier2d` |
|
||||||
| **AI 逻辑** | `behavior-tree`, `blueprint` |
|
|
||||||
| **网络** | `network`, `network-server` |
|
|
||||||
| **平台** | `platform-web`, `platform-wechat` |
|
| **平台** | `platform-web`, `platform-wechat` |
|
||||||
|
|
||||||
<details>
|
### 编辑器(可选)
|
||||||
<summary><b>查看全部 50+ 个包</b></summary>
|
|
||||||
|
|
||||||
#### 核心
|
基于 Tauri 构建的可视化编辑器:
|
||||||
- `@esengine/ecs-framework` - ECS 框架核心
|
|
||||||
- `@esengine/math` - 向量、矩阵工具
|
|
||||||
- `@esengine/engine` - Rust/WASM 渲染器
|
|
||||||
- `@esengine/engine-core` - 模块生命周期
|
|
||||||
|
|
||||||
#### 运行时
|
- 从 [Releases](https://github.com/esengine/esengine/releases) 下载
|
||||||
- `@esengine/sprite` - 2D 精灵和动画
|
- 支持行为树编辑、Tilemap 绘制、可视化脚本
|
||||||
- `@esengine/tilemap` - 瓦片地图
|
|
||||||
- `@esengine/particle` - 粒子特效
|
|
||||||
- `@esengine/physics-rapier2d` - 2D 物理
|
|
||||||
- `@esengine/behavior-tree` - AI 行为树
|
|
||||||
- `@esengine/blueprint` - 可视化脚本
|
|
||||||
- `@esengine/camera` - 相机系统
|
|
||||||
- `@esengine/audio` - 音频播放
|
|
||||||
- `@esengine/fairygui` - FairyGUI 集成
|
|
||||||
- `@esengine/mesh-3d` - 3D 模型 (FBX/GLTF/OBJ)
|
|
||||||
- `@esengine/material-system` - 材质和着色器
|
|
||||||
- `@esengine/asset-system` - 资源管理
|
|
||||||
- `@esengine/world-streaming` - 大世界流式加载
|
|
||||||
|
|
||||||
#### 网络
|
## 项目结构
|
||||||
- `@esengine/network` - 客户端 (TSRPC)
|
|
||||||
- `@esengine/network-server` - 服务端运行时
|
|
||||||
- `@esengine/network-protocols` - 共享协议
|
|
||||||
|
|
||||||
#### 编辑器扩展
|
```
|
||||||
所有运行时模块都有对应的 `-editor` 包用于可视化编辑。
|
esengine/
|
||||||
|
├── packages/
|
||||||
#### 平台
|
│ ├── framework/ # 引擎无关模块(可发布到 NPM)
|
||||||
- `@esengine/platform-common` - 平台抽象层
|
│ │ ├── core/ # ECS 框架
|
||||||
- `@esengine/platform-web` - Web 运行时
|
│ │ ├── math/ # 数学工具
|
||||||
- `@esengine/platform-wechat` - 微信小游戏
|
│ │ ├── behavior-tree/ # AI 行为树
|
||||||
|
│ │ ├── blueprint/ # 可视化脚本
|
||||||
</details>
|
│ │ ├── fsm/ # 有限状态机
|
||||||
|
│ │ ├── timer/ # 定时器系统
|
||||||
## 编辑器
|
│ │ ├── spatial/ # 空间查询
|
||||||
|
│ │ ├── pathfinding/ # 寻路
|
||||||
ESEngine 编辑器是基于 Tauri 和 React 构建的跨平台桌面应用。
|
│ │ ├── procgen/ # 程序化生成
|
||||||
|
│ │ └── network/ # 网络
|
||||||
### 功能
|
│ │
|
||||||
|
│ ├── engine/ # ESEngine 运行时
|
||||||
- 场景层级和实体管理
|
│ ├── rendering/ # 渲染模块
|
||||||
- 组件检视器,支持自定义属性编辑器
|
│ ├── physics/ # 物理模块
|
||||||
- 资源浏览器,支持拖放
|
│ ├── editor/ # 可视化编辑器
|
||||||
- Tilemap 编辑器,支持绘制和填充工具
|
│ └── rust/ # WASM 渲染器
|
||||||
- 行为树可视化编辑器
|
│
|
||||||
- 蓝图可视化脚本
|
├── docs/ # 文档
|
||||||
- 材质和着色器编辑
|
└── examples/ # 示例
|
||||||
- 内置性能分析器
|
```
|
||||||
- 多语言支持(英文、中文)
|
|
||||||
|
|
||||||
### 截图
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
## 平台支持
|
|
||||||
|
|
||||||
| 平台 | 运行时 | 编辑器 |
|
|
||||||
|------|:------:|:------:|
|
|
||||||
| Web 浏览器 | ✓ | - |
|
|
||||||
| Windows | - | ✓ |
|
|
||||||
| macOS | - | ✓ |
|
|
||||||
| 微信小游戏 | 开发中 | - |
|
|
||||||
| Playable 可玩广告 | 计划中 | - |
|
|
||||||
| Android | 计划中 | - |
|
|
||||||
| iOS | 计划中 | - |
|
|
||||||
|
|
||||||
## 从源码构建
|
## 从源码构建
|
||||||
|
|
||||||
### 前置要求
|
|
||||||
|
|
||||||
- Node.js 18+
|
|
||||||
- pnpm 10+
|
|
||||||
- Rust 工具链(用于 WASM 渲染器)
|
|
||||||
- wasm-pack
|
|
||||||
|
|
||||||
### 安装
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone https://github.com/esengine/esengine.git
|
git clone https://github.com/esengine/esengine.git
|
||||||
cd esengine
|
cd esengine
|
||||||
@@ -238,55 +237,29 @@ cd esengine
|
|||||||
pnpm install
|
pnpm install
|
||||||
pnpm build
|
pnpm build
|
||||||
|
|
||||||
# 可选:构建 WASM 渲染器
|
# 框架包类型检查
|
||||||
pnpm build:wasm
|
pnpm type-check:framework
|
||||||
|
|
||||||
|
# 运行测试
|
||||||
|
pnpm test
|
||||||
```
|
```
|
||||||
|
|
||||||
### 运行编辑器
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd packages/editor-app
|
|
||||||
pnpm tauri:dev
|
|
||||||
```
|
|
||||||
|
|
||||||
### 项目结构
|
|
||||||
|
|
||||||
```
|
|
||||||
esengine/
|
|
||||||
├── packages/
|
|
||||||
│ ├── core/ # ECS 框架 (@esengine/ecs-framework)
|
|
||||||
│ ├── math/ # 数学库 (@esengine/math)
|
|
||||||
│ ├── engine-core/ # 引擎生命周期管理
|
|
||||||
│ ├── sprite/ # 2D 精灵渲染
|
|
||||||
│ ├── tilemap/ # Tilemap 系统
|
|
||||||
│ ├── physics-rapier2d/ # 物理引擎
|
|
||||||
│ ├── behavior-tree/ # AI 行为树
|
|
||||||
│ ├── editor-app/ # 桌面编辑器 (Tauri)
|
|
||||||
│ └── ... # 其他模块
|
|
||||||
├── docs/ # 文档源码
|
|
||||||
├── examples/ # 示例项目
|
|
||||||
├── scripts/ # 构建工具
|
|
||||||
└── thirdparty/ # 第三方依赖
|
|
||||||
```
|
|
||||||
|
|
||||||
> **寻找 ECS 源码?** ECS 框架位于 `packages/core/`
|
|
||||||
|
|
||||||
## 文档
|
## 文档
|
||||||
|
|
||||||
- [快速入门](https://esengine.cn/guide/getting-started.html)
|
- [ECS 框架指南](./packages/framework/core/README.md)
|
||||||
- [架构指南](https://esengine.cn/guide/)
|
- [行为树指南](./packages/framework/behavior-tree/README.md)
|
||||||
- [API 参考](https://esengine.cn/api/README)
|
- [API 参考](https://esengine.cn/api/README)
|
||||||
|
|
||||||
## 社区
|
## 社区
|
||||||
|
|
||||||
- [Discord](https://discord.gg/gCAgzXFW) - 国际社区
|
|
||||||
- [QQ 交流群](https://jq.qq.com/?_wv=1027&k=29w1Nud6) - 中文社区
|
- [QQ 交流群](https://jq.qq.com/?_wv=1027&k=29w1Nud6) - 中文社区
|
||||||
|
- [Discord](https://discord.gg/gCAgzXFW) - 国际社区
|
||||||
- [GitHub Issues](https://github.com/esengine/esengine/issues) - Bug 反馈和功能建议
|
- [GitHub Issues](https://github.com/esengine/esengine/issues) - Bug 反馈和功能建议
|
||||||
- [GitHub Discussions](https://github.com/esengine/esengine/discussions) - 问题和想法
|
- [GitHub Discussions](https://github.com/esengine/esengine/discussions) - 问题和想法
|
||||||
|
|
||||||
## 贡献
|
## 贡献
|
||||||
|
|
||||||
欢迎贡献代码。提交 PR 前请阅读贡献指南。
|
欢迎贡献代码!提交 PR 前请阅读贡献指南。
|
||||||
|
|
||||||
1. Fork 仓库
|
1. Fork 仓库
|
||||||
2. 创建功能分支 (`git checkout -b feature/amazing-feature`)
|
2. 创建功能分支 (`git checkout -b feature/amazing-feature`)
|
||||||
@@ -296,10 +269,10 @@ esengine/
|
|||||||
|
|
||||||
## 许可证
|
## 许可证
|
||||||
|
|
||||||
ESEngine 基于 [MIT 协议](LICENSE) 开源。
|
ESEngine 基于 [MIT 协议](LICENSE) 开源,个人和商业使用均免费。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
由 ESEngine 团队用 ❤️ 打造
|
由 ESEngine 社区用心打造
|
||||||
</p>
|
</p>
|
||||||
|
|||||||
32
package.json
@@ -5,7 +5,16 @@
|
|||||||
"private": true,
|
"private": true,
|
||||||
"packageManager": "pnpm@10.22.0",
|
"packageManager": "pnpm@10.22.0",
|
||||||
"workspaces": [
|
"workspaces": [
|
||||||
"packages/*"
|
"packages/framework/*",
|
||||||
|
"packages/engine/*",
|
||||||
|
"packages/rendering/*",
|
||||||
|
"packages/physics/*",
|
||||||
|
"packages/streaming/*",
|
||||||
|
"packages/network-ext/*",
|
||||||
|
"packages/editor/*",
|
||||||
|
"packages/editor/plugins/*",
|
||||||
|
"packages/rust/*",
|
||||||
|
"packages/tools/*"
|
||||||
],
|
],
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"ecs",
|
"ecs",
|
||||||
@@ -28,23 +37,24 @@
|
|||||||
"build:math": "turbo run build --filter=@esengine/ecs-framework-math",
|
"build:math": "turbo run build --filter=@esengine/ecs-framework-math",
|
||||||
"build:editor": "turbo run build --filter=@esengine/editor-app...",
|
"build:editor": "turbo run build --filter=@esengine/editor-app...",
|
||||||
"build:npm": "turbo run build:npm",
|
"build:npm": "turbo run build:npm",
|
||||||
"build:npm:core": "cd packages/core && npm run build:npm",
|
"build:npm:core": "cd packages/framework/core && npm run build:npm",
|
||||||
"build:npm:math": "cd packages/math && npm run build:npm",
|
"build:npm:math": "cd packages/framework/math && npm run build:npm",
|
||||||
"test": "turbo run test",
|
"test": "turbo run test",
|
||||||
"test:coverage": "turbo run test:coverage",
|
"test:coverage": "turbo run test:coverage",
|
||||||
"test:ci": "turbo run test:ci",
|
"test:ci": "turbo run test:ci",
|
||||||
|
"test:ci:framework": "turbo run test:ci --filter=@esengine/ecs-framework --filter=@esengine/ecs-framework-math --filter=@esengine/behavior-tree --filter=@esengine/blueprint --filter=@esengine/fsm --filter=@esengine/timer --filter=@esengine/spatial --filter=@esengine/procgen --filter=@esengine/pathfinding --filter=@esengine/network-protocols --filter=@esengine/network",
|
||||||
"prepare:publish": "npm run build:npm && node scripts/pre-publish-check.cjs",
|
"prepare:publish": "npm run build:npm && node scripts/pre-publish-check.cjs",
|
||||||
"sync:versions": "node scripts/sync-versions.cjs",
|
"sync:versions": "node scripts/sync-versions.cjs",
|
||||||
"publish:all": "npm run prepare:publish && npm run publish:all:dist",
|
"publish:all": "npm run prepare:publish && npm run publish:all:dist",
|
||||||
"publish:all:dist": "npm run publish:core && npm run publish:math",
|
"publish:all:dist": "npm run publish:core && npm run publish:math",
|
||||||
"publish:core": "cd packages/core && npm run publish:npm",
|
"publish:core": "cd packages/framework/core && npm run publish:npm",
|
||||||
"publish:core:patch": "cd packages/core && npm run publish:patch",
|
"publish:core:patch": "cd packages/framework/core && npm run publish:patch",
|
||||||
"publish:math": "cd packages/math && npm run publish:npm",
|
"publish:math": "cd packages/framework/math && npm run publish:npm",
|
||||||
"publish:math:patch": "cd packages/math && npm run publish:patch",
|
"publish:math:patch": "cd packages/framework/math && npm run publish:patch",
|
||||||
"publish": "lerna publish",
|
"publish": "lerna publish",
|
||||||
"version": "lerna version",
|
"version": "lerna version",
|
||||||
"release": "semantic-release",
|
"release": "semantic-release",
|
||||||
"release:core": "cd packages/core && semantic-release",
|
"release:core": "cd packages/framework/core && semantic-release",
|
||||||
"contributors:add": "all-contributors add",
|
"contributors:add": "all-contributors add",
|
||||||
"contributors:generate": "all-contributors generate",
|
"contributors:generate": "all-contributors generate",
|
||||||
"contributors:check": "all-contributors check",
|
"contributors:check": "all-contributors check",
|
||||||
@@ -58,10 +68,12 @@
|
|||||||
"format": "prettier --write \"packages/**/src/**/*.{ts,tsx,js,jsx}\"",
|
"format": "prettier --write \"packages/**/src/**/*.{ts,tsx,js,jsx}\"",
|
||||||
"format:check": "prettier --check \"packages/**/src/**/*.{ts,tsx,js,jsx}\"",
|
"format:check": "prettier --check \"packages/**/src/**/*.{ts,tsx,js,jsx}\"",
|
||||||
"type-check": "turbo run type-check",
|
"type-check": "turbo run type-check",
|
||||||
|
"type-check:framework": "turbo run type-check --filter=@esengine/ecs-framework --filter=@esengine/ecs-framework-math --filter=@esengine/behavior-tree --filter=@esengine/blueprint --filter=@esengine/fsm --filter=@esengine/timer --filter=@esengine/spatial --filter=@esengine/procgen --filter=@esengine/pathfinding --filter=@esengine/network-protocols --filter=@esengine/network",
|
||||||
"lint": "turbo run lint",
|
"lint": "turbo run lint",
|
||||||
|
"lint:framework": "turbo run lint --filter=@esengine/ecs-framework --filter=@esengine/ecs-framework-math --filter=@esengine/behavior-tree --filter=@esengine/blueprint --filter=@esengine/fsm --filter=@esengine/timer --filter=@esengine/spatial --filter=@esengine/procgen --filter=@esengine/pathfinding --filter=@esengine/network-protocols --filter=@esengine/network",
|
||||||
"lint:fix": "turbo run lint:fix",
|
"lint:fix": "turbo run lint:fix",
|
||||||
"build:wasm": "cd packages/engine && wasm-pack build --dev --out-dir pkg",
|
"build:wasm": "cd packages/rust/engine && wasm-pack build --dev --out-dir pkg",
|
||||||
"build:wasm:release": "cd packages/engine && wasm-pack build --release --out-dir pkg",
|
"build:wasm:release": "cd packages/rust/engine && wasm-pack build --release --out-dir pkg",
|
||||||
"copy-modules": "node scripts/copy-engine-modules.mjs"
|
"copy-modules": "node scripts/copy-engine-modules.mjs"
|
||||||
},
|
},
|
||||||
"author": "yhh",
|
"author": "yhh",
|
||||||
|
|||||||
@@ -1,13 +0,0 @@
|
|||||||
{
|
|
||||||
"extends": "../../tsconfig.base.json",
|
|
||||||
"compilerOptions": {
|
|
||||||
"composite": true,
|
|
||||||
"outDir": "./dist",
|
|
||||||
"rootDir": "./src"
|
|
||||||
},
|
|
||||||
"include": ["src/**/*"],
|
|
||||||
"exclude": ["node_modules", "dist"],
|
|
||||||
"references": [
|
|
||||||
{ "path": "../core" }
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
{
|
|
||||||
"extends": "../../tsconfig.base.json",
|
|
||||||
"compilerOptions": {
|
|
||||||
"composite": true,
|
|
||||||
"outDir": "./dist",
|
|
||||||
"rootDir": "./src",
|
|
||||||
"declaration": true,
|
|
||||||
"jsx": "react-jsx"
|
|
||||||
},
|
|
||||||
"include": ["src/**/*"],
|
|
||||||
"exclude": ["node_modules", "dist"],
|
|
||||||
"references": [
|
|
||||||
{ "path": "../core" },
|
|
||||||
{ "path": "../editor-core" },
|
|
||||||
{ "path": "../behavior-tree" }
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
/**
|
|
||||||
* @esengine/behavior-tree
|
|
||||||
*
|
|
||||||
* AI Behavior Tree System with runtime execution and visual editor support
|
|
||||||
* AI 行为树系统,支持运行时执行和可视化编辑
|
|
||||||
*
|
|
||||||
* @packageDocumentation
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Constants
|
|
||||||
export { BehaviorTreeAssetType } from './constants';
|
|
||||||
|
|
||||||
// Types
|
|
||||||
export * from './Types/TaskStatus';
|
|
||||||
|
|
||||||
// Execution (runtime core)
|
|
||||||
export * from './execution';
|
|
||||||
|
|
||||||
// Utilities
|
|
||||||
export * from './BehaviorTreeStarter';
|
|
||||||
export * from './BehaviorTreeBuilder';
|
|
||||||
|
|
||||||
// Serialization
|
|
||||||
export * from './Serialization/NodeTemplates';
|
|
||||||
export * from './Serialization/BehaviorTreeAsset';
|
|
||||||
export * from './Serialization/EditorFormatConverter';
|
|
||||||
export * from './Serialization/BehaviorTreeAssetSerializer';
|
|
||||||
export * from './Serialization/EditorToBehaviorTreeDataConverter';
|
|
||||||
|
|
||||||
// Services
|
|
||||||
export * from './Services/GlobalBlackboardService';
|
|
||||||
|
|
||||||
// Blackboard types (excluding BlackboardValueType which is already exported from TaskStatus)
|
|
||||||
export type { BlackboardTypeDefinition } from './Blackboard/BlackboardTypes';
|
|
||||||
export { BlackboardTypes } from './Blackboard/BlackboardTypes';
|
|
||||||
|
|
||||||
// Runtime module and plugin
|
|
||||||
export { BehaviorTreeRuntimeModule, BehaviorTreePlugin } from './BehaviorTreeRuntimeModule';
|
|
||||||
|
|
||||||
// Service tokens | 服务令牌
|
|
||||||
export { BehaviorTreeSystemToken } from './tokens';
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
/**
|
|
||||||
* @esengine/blueprint - Visual scripting system for ECS Framework
|
|
||||||
* 蓝图可视化脚本系统
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Types
|
|
||||||
export * from './types';
|
|
||||||
|
|
||||||
// Runtime
|
|
||||||
export * from './runtime';
|
|
||||||
|
|
||||||
// Triggers
|
|
||||||
export * from './triggers';
|
|
||||||
|
|
||||||
// Composition
|
|
||||||
export * from './composition';
|
|
||||||
|
|
||||||
// Nodes (import to register)
|
|
||||||
import './nodes';
|
|
||||||
|
|
||||||
// Re-export commonly used items
|
|
||||||
export { NodeRegistry, RegisterNode } from './runtime/NodeRegistry';
|
|
||||||
export { BlueprintVM } from './runtime/BlueprintVM';
|
|
||||||
export {
|
|
||||||
createBlueprintComponentData,
|
|
||||||
initializeBlueprintVM,
|
|
||||||
startBlueprint,
|
|
||||||
stopBlueprint,
|
|
||||||
tickBlueprint,
|
|
||||||
cleanupBlueprint
|
|
||||||
} from './runtime/BlueprintComponent';
|
|
||||||
export {
|
|
||||||
createBlueprintSystem,
|
|
||||||
triggerBlueprintEvent,
|
|
||||||
triggerCustomBlueprintEvent
|
|
||||||
} from './runtime/BlueprintSystem';
|
|
||||||
export { createEmptyBlueprint, validateBlueprintAsset } from './types/blueprint';
|
|
||||||
|
|
||||||
// Plugin
|
|
||||||
export { BlueprintPlugin } from './BlueprintPlugin';
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
{
|
|
||||||
"extends": "../../tsconfig.base.json",
|
|
||||||
"compilerOptions": {
|
|
||||||
"composite": true,
|
|
||||||
"outDir": "./dist",
|
|
||||||
"rootDir": "./src",
|
|
||||||
"jsx": "react-jsx"
|
|
||||||
},
|
|
||||||
"include": ["src/**/*"],
|
|
||||||
"exclude": ["node_modules", "dist"],
|
|
||||||
"references": [
|
|
||||||
{ "path": "../core" },
|
|
||||||
{ "path": "../camera" },
|
|
||||||
{ "path": "../editor-core" }
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
{
|
|
||||||
"extends": "../../tsconfig.base.json",
|
|
||||||
"compilerOptions": {
|
|
||||||
"composite": true,
|
|
||||||
"outDir": "./dist",
|
|
||||||
"rootDir": "./src"
|
|
||||||
},
|
|
||||||
"include": ["src/**/*"],
|
|
||||||
"exclude": ["node_modules", "dist"],
|
|
||||||
"references": [
|
|
||||||
{ "path": "../core" }
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
import { defineConfig } from 'tsup';
|
|
||||||
import { runtimeOnlyPreset } from '../build-config/src/presets/plugin-tsup';
|
|
||||||
|
|
||||||
export default defineConfig({
|
|
||||||
...runtimeOnlyPreset(),
|
|
||||||
tsconfig: 'tsconfig.build.json'
|
|
||||||
});
|
|
||||||
|
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 915 B After Width: | Height: | Size: 915 B |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 5.1 KiB After Width: | Height: | Size: 5.1 KiB |
|
Before Width: | Height: | Size: 5.6 KiB After Width: | Height: | Size: 5.6 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 888 B After Width: | Height: | Size: 888 B |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 6.0 KiB After Width: | Height: | Size: 6.0 KiB |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 8.8 KiB After Width: | Height: | Size: 8.8 KiB |
|
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 5.5 KiB After Width: | Height: | Size: 5.5 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 5.5 KiB After Width: | Height: | Size: 5.5 KiB |
|
Before Width: | Height: | Size: 7.3 KiB After Width: | Height: | Size: 7.3 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 7.3 KiB After Width: | Height: | Size: 7.3 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 512 B After Width: | Height: | Size: 512 B |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 847 B After Width: | Height: | Size: 847 B |
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 7.0 KiB After Width: | Height: | Size: 7.0 KiB |
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 5.8 KiB |
|
Before Width: | Height: | Size: 6.5 KiB After Width: | Height: | Size: 6.5 KiB |