# Cocos Creator 3D ### 生命周期函數 按以下順序調用 | Function | 調用時機 | |:----------:| -------------------------------------------- | | onLoad | 腳本初始化時調用 | | onEnable | 組件的 enabled 屬性從 false 變為 true 時調用 | | start | 組件第一次激活時調用 | | update | 每一幀渲染前更新物體調用 | | lateUpdate | 在所有組件的 update 都執行完之後調用 | | onDisable | 組件的 enabled 屬性從 true 變為 false 時調用 | | onDestroy | 組件或者所在節點銷毀時調用 | ### 3D向量計算 :::success pseudo code ``` Vec3(0, 0, 0) + Vec3(0, 0, 1) * 10 ``` cocos ``` let startPos:Vec3 = new Vec3(0, 0, 0); let moveDir:Vec3 = new Vec3(0, 0, 1); let endPos:Vec3 = new Vec3(); Vec3.multiplyScalar(endPos, moveDir, 10); Vec3.add(endPos, startPos, endPos) // 方法二 out = A + B x scale Vec3.scaleAndAdd(endPos, startPos, moveDir, 10); ``` ::: ### UI - [alignOnce](https://docs.cocos.com/creator3d/manual/zh/ui-system/components/engine/widget-align.html#%E8%BF%90%E8%A1%8C%E6%97%B6%E6%AF%8F%E5%B8%A7%E6%9B%B4%E6%96%B0%E5%AF%B9%E9%BD%90%E5%92%8C%E4%BC%98%E5%8C%96%E7%AD%96%E7%95%A5) - Widget效能 - [对节点位置、尺寸的限制](https://docs.cocos.com/creator3d/manual/zh/ui-system/components/editor/widget.html#%E5%AF%B9%E8%8A%82%E7%82%B9%E4%BD%8D%E7%BD%AE%E3%80%81%E5%B0%BA%E5%AF%B8%E7%9A%84%E9%99%90%E5%88%B6)- runtime 修改 Widget 的限制 - [文本缓存类型(Cache Mode)](https://docs.cocos.com/creator3d/manual/zh/ui-system/components/editor/label.html#%E6%96%87%E6%9C%AC%E7%BC%93%E5%AD%98%E7%B1%BB%E5%9E%8B%EF%BC%88cache-mode%EF%BC%89) - 經常修改的 Label 選用 `CHAR` 可能較佳 ### Script - 使用 [babel](https://babeljs.io/) 而非 [tsc](https://www.typescriptlang.org/) 编译 TypeScript 脚本。 - 不吃 `tsconfig.json` - `@property({ type: AnimationComponent })` 在大多情況下直接寫成 `@property(AnimationComponent)` 即可. ### 物理 #### 分組與掩碼 (Group and Mask) 只要符合 >GroupA & MaskB > 0 >GroupB & MaskA > 0 > A 與 B 才會檢測碰撞 範例 Cube: >Layer = 4 >Group = 272 `// (1 << 4) + (1 << 8)` >Mask = 256 `Plane 的 Layer` Plane: >Layer = 8 >Group = 272 `// (1 << 4) + (1 << 8)` >Mask = 16 `Cube 的 Layer` 在這個情況下,Cube與Plane可以互相碰撞,但是無法與其他物體的 Collider 碰撞 --- ### 解決 rigidbody 接觸 kinematic rigidbody 會穿過去 問題 :::info rigidbody A -> isKinematic = false rigidbody B -> isKinematic = true A 完全靜止時, B 接觸到 A 會直接穿過去 ::: 解法 :::success 避免讓 A 進入休眠 (回收再強制設成休眠) ``` allowSleep = false ``` ::: --- ### VS 和 VS Code 隱藏 meta 檔 :::success 打開 **.gitignore** 在 Cocos Creator 3D Project 區塊新增 ``` *.meta ``` ::: --- ### 集合 Module 當我們需要引用特定 module 時 ```typescript= import aModule from "aModule" ``` 但如果我們需要引用到多個 module 時 ```typescript= import aModule from "aModule" import bModule from "bModule" import cModule from "cModule" import dModule from "dModule" import eModule from "eModule" import fModule from "fModule" ... ``` 一來看起來不夠整潔,二來很麻煩(你必須要指定每個 module path) 這時候可以透過集合 module(若這些 module 隸屬於同一體系,類似同一個 namespace 的概念) 來讓外部取用方便些 ```typescript= // myModule.ts import aModule from "aModule" import bModule from "bModule" import cModule from "cModule" import dModule from "dModule" import eModule from "eModule" import fModule from "fModule" ... export default { aModule, bModule, cModule, dModule, eModule, fModule, ... } ``` 這時引入 myModule 就可以直接使用那些零碎的 module ```typescript= import myModule from "myModule" myModule.aModule myModule.bModule etc.. ``` 或者是 ```typescript= // myModule.ts import aModule from "aModule" import bModule from "bModule" import cModule from "cModule" import dModule from "dModule" import eModule from "eModule" import fModule from "fModule" ... export { aModule, bModule, cModule, ... } ``` ```typescript= import { aModule, bModule, etc.. } from "myModule" ``` --- ### Path Mapping 上面的集合 Module 還是有一個不方便的地方,就是路徑問題, 要引用 Module 還得知道他的存放位置,若結構深一點看起來也很醜 ```typescript= import myModule from "./first/second/third/.../myModule" ``` 為了解決這個問題,可以透過 tsconfig 設定路徑 map ```typescript= { /* Base configuration. Do not edit this field. */ "extends": "./temp/tsconfig.cocos.json" , /* Add your custom configuration here. */ "compilerOptions": { "baseUrl": ".", "paths": { "myModule": ["assets/first/second/third/.../myModule"], } } } ``` 設定完就可以直接透過名稱取用 ```typescript= import myModule from "myModule" ``` 也可以指定資料夾位置 ```typescript= { /* Base configuration. Do not edit this field. */ "extends": "./temp/tsconfig.cocos.json" , /* Add your custom configuration here. */ "compilerOptions": { "baseUrl": ".", "paths": { "myModules/*": ["assets/first/second/third/.../myModules/*"], } } } ``` ```typescript= import aModule from "myModules/aModule" ``` PS.以上寫法在純TypeScript專案正常,但cocos專案會噴錯 --- ### import error 假設如下code aModule內容: ```typescript= import { bModule } from "myModules"; //PS: import方式需對應測試方式 export class aModule { public static enabled:boolean = bModule.EnableLog; public static warning:boolean = bModule.EnableLog; } ``` bModule內容: ```typescript= export class bModule { public static EnableLog: boolean = false; } ``` myModules錯誤的格式 :::danger ```typescript= import { aModule } from "./aModule" import { bModule } from "./bModule" export { aModule, bModule } ``` ::: 不論tsconfig怎麼設定paths都會噴錯 **Uncaught (in promise) Error:: Error loading xxx** 正確的內容: ::: success ```typescript= export { aModule } from "./aModule" export { bModule } from "./bModule" ``` ::: 測試tsconfig的設定 **測試1:** tsconfig設定用如下的編譯路徑: ```typescript= "compilerOptions": { "baseUrl": ".", "paths": { "myModules": ["assets/Module/myModules"], } } ``` **執行結果正常** **測試2** tsconfig設定用如下的編譯路徑: ```typescript= "compilerOptions": { "baseUrl": ".", "paths": { "@myModules/*": ["assets/Module/*"], } } ``` **執行結果正常** **測試3** tsconfig設定同時使用範例1和2的編譯路徑: ```typescript= "compilerOptions": { "baseUrl": ".", "paths": { "myModules": ["assets/Module/myModules"], "@myModules/*": ["assets/Module/*"], } } ``` 會出現如下錯誤: :::danger [Scene] Possible circular-reference in {asset(db://assets/Module/aModule.ts)}: when import Module from myModules. [Build] Error: Error loading project:///assets/Module/myModules.js from project:///assets/Module/myModules.js ::: PS. 一旦出現上述錯誤,直接修改code到正常版本,並執行也不會正常。 **需重新啟動Creator 3D** --- 參考連結: [Path Mapping](https://www.typescriptlang.org/docs/handbook/module-resolution.html#path-mapping) [Path Aliases](https://medium.com/zero-equals-false/how-to-use-module-path-aliases-in-visual-studio-typescript-and-javascript-e7851df8eeaa) [CC Manual](https://docs.cocos.com/creator3d/manual/zh/scripting/language-support.html#%E6%A8%A1%E5%9D%97%E8%A7%A3%E6%9E%90) --- ###### tags: `Creator3D`