# 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`