# Egret 3D
---
### 環境準備(發佈用)
* 安裝 [NodeJS](https://nodejs.org/)
* 在 console 輸入 **npm install**
* 安裝 static-server, 輸入 **npm -g install static-server**
---
### 發佈專案到 web
:::success
在專案 console 輸入
```
npm run bake
npm run build:web
```
:::
:::success
預覽結果
```
static-server ./dist
```
dist 是預設的發佈路徑
相關設定在 egretpro.json 的 projectRoot
:::
:::success
打開瀏覽器輸入
```
localhost:9080
```
:::
---
### scene 基本操作
* 旋轉畫面: 右鍵
* 平移畫面: Ctrl+右鍵
---
### egret pro 的陷阱
在某些情況下, scene 的資料可能會被清空
:::warning
開始寫 code 之前, 記得先把所有的 scene 用 git commit 到本機做備份
:::
---
### 向量運算
:::info
unity
```
Vector3 startPos = new Vector3(0, 0, 0);
Vector3 forward = new Vector3(0, 0, 1f);
Vector3 endPos = startPos + forward * 10f;
```
:::
:::success
egret pro
```
let startPos:Vector3 = Vector3.create(0, 0, 0);
let forward:Vector3 = Vector3.create(0, 0, 1);
let endPos:Vector3 = Vector3.create();
endPos.copy(forward).multiplyScalar(10).add(startPos);
```
:::
:::danger
**容易弄錯的部分**
```
endPos.copy(startPos).add(forward.multiplyScalar(10));
```
**forward** 經過計算後, **forward** 本身的資料會被改變
然後 Vector3 是 **call by reference**
**在這個例子需要先將 forward 複製出來另外做計算**
:::
---
### 實例化Prefab
:::info
需先import **EngineFactory**
path為相對於resource的路徑 ex: resource/assets/test.prefab.json
```
let entity = await EngineFactory.createPrefab("path/xxx.prefab.json");
```
:::
---
### 執行static-server失敗
預覽發布結果 (https://docs.egret.com/egretpro/docs/publish/web)
以PowerShell執行
```
static-server ./dist
```
出現錯誤:
:::danger
因為這個系統上已停用指令碼執行,所以無法載入
:::
此時用**系統管理員**身分執行PowerShell
並輸入 `Set-ExecutionPolicy RemoteSigned`
選擇(Y) 讓系統接受所有自訂或是信任來源的腳本檔案即可。
---
### 移除從3D導入至2D專案的Scene
前言: 照官方教學可以從3D場景導入至2D專案
https://docs.egret.com/engine/docs/pro/add-3d-content
但是產生的texture直接下dispose後沒有效果
需從pro端將scene移除
2D端
```
egret.pro.dispatch("RemoveScene", 1);
```
3D端
```
註冊事件:
Application.instance.egretProUtil.addEventListener("RemoveScene", 1, this.removeScene, this);
private removeScene(): void {
let currentScene = this.sceneMgr.activeScene;
this.sceneMgr.removeScene(currentScene);
}
```
滑鼠事件
2D
```
this.stage.addEventListener(egret.TouchEvent.TOUCH_BEGIN, this.onTouchBegin, this);
```
```
onTouchBegin(evt: egret.TouchEvent): void {
egret.pro.dispatch("touchBegin", 1, evt.stageX, evt.stageY);
}
```
3D
```
Application.instance.egretProUtil.addEventListener("touchBegin", 1, this.onTouchBegin, this);
```
```
onTouchBegin(x: float, y: float) {
let pos: Vector3 = Vector3.create(x, y);
//do something
}
```
---
### 取得 OIMO Rigidbody
:::success
先 import module
```
import { Rigidbody } from "@egret/oimo";
```
再透過 transform 的 entity 取得
```
xxx.entity.getComponent(Rigidbody);
```
:::
---
###### tags: `Egret`