<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          官方出品丨Cocos Creator 3.x 升級(jí)指南,常見(jiàn)問(wèn)題一文全解

          共 8929字,需瀏覽 18分鐘

           ·

          2021-08-22 11:14

          Cocos Creator 3.x 作為 Creator 的主力版本,經(jīng)過(guò)引擎組的不斷努力,目前已經(jīng)逐漸趨于成熟與穩(wěn)定,可以為開(kāi)發(fā)者提供更好的服務(wù)。現(xiàn)為開(kāi)發(fā)者提供升級(jí) Cocos Creator 2.x 到 3.x 的詳細(xì)方式,含項(xiàng)目升級(jí)、代碼升級(jí)、材質(zhì)升級(jí)、常見(jiàn)問(wèn)題及解決

          注意: 目前我們不建議開(kāi)發(fā)中的項(xiàng)目,特別是即將上線的項(xiàng)目強(qiáng)升 v3.x。

          項(xiàng)目升級(jí)

          目前針對(duì) v2.4.3 以下的版本,我們推薦先將舊項(xiàng)目升級(jí)到 v2.4.3 或以上版本,然后再導(dǎo)入到 v3.x,否則無(wú)法確保導(dǎo)入結(jié)果的正確性。

          因此升級(jí)的第一步是先將舊項(xiàng)目升級(jí)到 v2.4.3 或以上版本,再對(duì)舊項(xiàng)目進(jìn)行排查,檢查是否有出現(xiàn)問(wèn)題。關(guān)于更多 v2.4.x 的升級(jí)問(wèn)題可以查看 [v2.4 升級(jí)指南]

          在成功升級(jí)為 v2.4.3 或以上版本后,接下來(lái)可以在 Cocos Dashboard 中新建一個(gè)空項(xiàng)目并打開(kāi)。如下圖:


          update-dashboard


          然后便可以在新建的空項(xiàng)目中通過(guò) Creator 的導(dǎo)入插件對(duì)項(xiàng)目進(jìn)行升級(jí)。

          開(kāi)發(fā)者只需要點(diǎn)擊主菜單中的 文件 -> 導(dǎo)入 Cocos Creator 2.x 項(xiàng)目


          import-menu


          然后在彈出的文件瀏覽對(duì)話框中選擇 v2.x 項(xiàng)目的根目錄。


          import-menu


          v2.x 項(xiàng)目中所有的資源便會(huì)自動(dòng)呈現(xiàn)在彈出的 導(dǎo)入 Cocos Creator 2.x 項(xiàng)目 面板中,開(kāi)發(fā)者可以再次確認(rèn)要導(dǎo)入的資源,然后點(diǎn)擊面板右下角的 導(dǎo)入 按鈕完成導(dǎo)入。若開(kāi)發(fā)者想要切換導(dǎo)入的 v2.x 項(xiàng)目,點(diǎn)擊下圖中的搜索圖標(biāo)按鈕,即可重新選擇項(xiàng)目。


          import-project


          面板左下角的 使用說(shuō)明 按鈕可跳轉(zhuǎn)到導(dǎo)入項(xiàng)目插件的 GitHub 倉(cāng)庫(kù),用于 [更新導(dǎo)入插件] 或者提交反饋。

          選擇導(dǎo)入之后,項(xiàng)目就已經(jīng)被生成到之前新建的空項(xiàng)目中,并且 不會(huì)改動(dòng) 到原有的舊項(xiàng)目。項(xiàng)目的 資源部分 就已經(jīng)成功導(dǎo)入啦。

          代碼升級(jí)

          對(duì)于項(xiàng)目的代碼,Creator 的導(dǎo)入插件提供了很好的代碼遷移輔助。如果開(kāi)發(fā)者的舊項(xiàng)目是使用 JavaScript 進(jìn)行開(kāi)發(fā)的,那么導(dǎo)入插件會(huì)先將 JavaScript 轉(zhuǎn)換成 TypeScript,再統(tǒng)一進(jìn)行代碼的輔助遷移。

          例如下面的一段代碼:

          // AudioController.ts
          @ccclass("AudioController")
          export class AudioController extends Component { 
              
              @property(cc.AudioSource)
              public audioSource: cc.AudioSource = null!;
              private _isPlay:boolean = false;

              play () {
                  this.audioSource.play();
                  this._isPlay =true;
              }

              pause () {
                  this.audioSource.pause();
                  this._isPlay =false;
              }
          }

          由于各個(gè)項(xiàng)目代碼的復(fù)雜度與寫法的差異性,目前導(dǎo)入插件對(duì)代碼的升級(jí)僅添加 組件類型聲明、屬性聲明及函數(shù)聲明,而組件在場(chǎng)景中的引用都會(huì)得到 保留,并且函數(shù)內(nèi)部的代碼在遷移后會(huì)以 注釋 的形式保留。

          在經(jīng)過(guò)導(dǎo)入插件的代碼 輔助遷移 之后,結(jié)果如下圖所示。最下方的注釋部分是項(xiàng)目的原代碼,方便開(kāi)發(fā)者在進(jìn)行代碼升級(jí)時(shí)作為參考:

          // AudioController.ts
          import { _decorator, AudioSource } from 'cc';
          @ccclass("AudioController")
          export class AudioController extends Component { 
              
              @property(AudioSource)
              public audioSource: AudioSource = null!;
              private _isPlay:boolean = false;

              play () {
                  //this.audioSource.play();
                  //  this._isPlay =true;
              }

              pause () {
                  //this.audioSource.pause();
                  // this._isPlay =false;
              }
          }

          /**
           * 注意:原來(lái)的腳本已經(jīng)注釋掉了,由于腳本中的大量更改,轉(zhuǎn)換過(guò)程中可能會(huì)丟失,需要手動(dòng)轉(zhuǎn)換
           */


          // // AudioController.ts
          // @ccclass("AudioController")
          // export class AudioController extends Component { 
              
          //      @property(cc.AudioSource)
              // public audioSource: cc.AudioSource = null!;
              // private _isPlay:boolean = false;

              // play () {
              //     this.audioSource.play();
              //     this._isPlay =true;
              // }

              // pause () {
              //     this.audioSource.pause();
              //     this._isPlay =false;
              // }
          // }

          通過(guò)這樣的方式,減輕開(kāi)發(fā)者的升級(jí)難度,為開(kāi)發(fā)者提供更好的升級(jí)方式。

          需要注意的是:

          • 如果是從 JavaScript 轉(zhuǎn)換為 TypeScript 的。需要在 TypeScript 中聲明 所有屬性 并設(shè)置默認(rèn)值。

          • 如果 屬性檢查器 面板數(shù)據(jù)丟失,則需要檢查屬性類型是否與 v2.x 相同。

          • 如果 JavaScript 代碼使用外部類型,TypeScript 會(huì)提示:通過(guò)導(dǎo)入外部源文件或聲明進(jìn)行修復(fù)。

          關(guān)于更多將代碼從 JavaScript 升級(jí)到 TypeScript 問(wèn)題和 Cocos Creator v3.x 中 TypeScript 的使用問(wèn)題,可以在[3.0 TypeScript 問(wèn)題答疑及經(jīng)驗(yàn)分享]中進(jìn)行了解。

          材質(zhì)升級(jí)

          除了代碼升級(jí)以外,目前 Effect 材質(zhì)資源內(nèi)的 Shader 代碼還無(wú)法被自動(dòng)升級(jí),需要大家根據(jù)升級(jí)文檔來(lái)手動(dòng)升級(jí)。具體請(qǐng)參考:

          Cocos Creator 2.x 的材質(zhì)升級(jí)到 v3.0 的注意事項(xiàng):

          https://docs.cocos.com/creator/3.1/manual/zh/material-system/effect-2.x-to-3.0.html

          Cocos Creator 3.0 的材質(zhì)升級(jí)到 v3.1 的注意事項(xiàng):

          https://docs.cocos.com/creator/3.1/manual/zh/material-system/Material-upgrade-documentation-for-v3.0-to-v3.1.html

          常見(jiàn)問(wèn)題(FAQ)

          • 正常的綁定組件定義等一些操作,會(huì)導(dǎo)致 Visual Studio Code 爆紅

          因?yàn)樵?Creator v3.x 支持代碼嚴(yán)格模式,會(huì)對(duì)代碼進(jìn)行更嚴(yán)格的審查。排除掉開(kāi)發(fā)過(guò)程中可能會(huì)出現(xiàn)的一些因?yàn)槭韬龆鴮?dǎo)致的 bug。
          關(guān)于嚴(yán)格模式下的書寫規(guī)范,可以參照官方案例 快上車 3DGitHub | Gitee
          如果需要關(guān)閉嚴(yán)格模式,可以在 Creator 主菜單的 項(xiàng)目 -> 項(xiàng)目設(shè)置 -> 腳本 中勾選 啟用寬松模式
          注意: 我們更推薦開(kāi)發(fā)者采用嚴(yán)格模式,進(jìn)行書寫代碼。
          • Action 動(dòng)作全都失效

          這是因?yàn)?Action 動(dòng)作系統(tǒng)在 v3.0 之后已經(jīng)被移除,目前只支持 Tween 緩動(dòng)系統(tǒng)。
          • 修改 2D 節(jié)點(diǎn)的 size 和 anchor 不生效

          需要先獲取節(jié)點(diǎn)上的 UITransform 組件,再使用對(duì)應(yīng)的接口,例如:
              const uiTrans = node.getComponent(UITransform)!;
              uiTrans.anchorX = 0.5;
              uiTrans.setContentSize(size);
          • 修改 2D 節(jié)點(diǎn)的 color 不生效

          需要先獲取節(jié)點(diǎn)上的渲染組件(例如:Sprite 組件),再使用對(duì)應(yīng)的接口,例如:

              const uiColor = node.getComponent(Sprite)!;
              uiColor.color = color(255,255,255);

          • 修改 2D 節(jié)點(diǎn)的 skew 不生效

          在 v3.0 中 skew 接口已經(jīng)被移除。
          • 無(wú)法獲取分組,但 Creator 的項(xiàng)目設(shè)置中仍有分組設(shè)置

          在 v3.0 開(kāi)始,group 分組變更為 layer,在 v2.x 中通過(guò) node.group 獲取到的是分組名,而 v3.x 通過(guò) node.layer 獲取到的是 分組值。并且分組值是以2的指數(shù)冪進(jìn)行設(shè)定,例如下圖:

          update-setting

          User Layer 0 的 layer 值為 2 的 0 次方,為 1。
          User Layer 1 的 layer 值為 2 的 1 次方,為 2。
          User Layer 6 的 layer 值為 2 的 6 次方,為 64。
          • 通過(guò) zIndex 設(shè)置同級(jí)節(jié)點(diǎn)失效

          在 v3.0 中 zIndex 接口已經(jīng)被移除,若需要調(diào)整節(jié)點(diǎn)樹(shù)的順序請(qǐng)使用 setSiblingIndex 方法來(lái)替換使用。
          • 通過(guò) getComponent() 無(wú)法獲取到節(jié)點(diǎn)上掛載的腳本

          請(qǐng)查詢對(duì)應(yīng)腳本的類名,而不是腳本名,在 v3.x 中的腳本組件是以腳本中定義的類名為準(zhǔn)的,而不是腳本名。腳本的類名會(huì)與創(chuàng)建腳本時(shí)的腳本名一致,但后續(xù)若修改腳本名不會(huì)自動(dòng)同步更新腳本類名,也常常出現(xiàn)因?yàn)榇笮懚鴮?dǎo)致腳本找不到的問(wèn)題。
          • 在 resources 文件夾下的圖片使用動(dòng)態(tài)加載提示找不到

          圖片設(shè)置為 sprite-frame 或 texture 或其他圖片類型后,將會(huì)在資源管理器中生成一個(gè)對(duì)應(yīng)類型的資源。但如果直接加載 testAssets/image,得到的類型將會(huì)是 ImageAsset。你必須指定路徑到具體的子資源。例如一張圖片在 resources 文件夾下的地址為 testAssets/image 那么要加載 SpriteFrame 應(yīng)該這么書寫:

              resources.load("testAssets/image/spriteFrame", SpriteFrame, (err, spriteFrame) => {
              this.node.getComponent(Sprite).spriteFrame = spriteFrame;
          });

          要加載 texture 類型,則將后綴改為 texture 即可。
          • 物體產(chǎn)生物理碰撞之后,原有的物理碰撞回調(diào)沒(méi)有了

          在 v3.x 中對(duì)于碰撞體回調(diào)需要在開(kāi)始的時(shí)候進(jìn)行注冊(cè),與原先會(huì)直接產(chǎn)生回調(diào)不同。因此開(kāi)發(fā)者需要在物理回調(diào)的腳本中,新增對(duì)回調(diào)函數(shù)的注冊(cè)。例如:

              let collider = this.getComponent(Collider2D);
              if (collider) {
                  //只在兩個(gè)碰撞體開(kāi)始接觸時(shí)被調(diào)用一次
                  collider.on(Contact2DType.BEGIN_CONTACT, this.onBeginContact, this);
                  // 只在兩個(gè)碰撞體結(jié)束接觸時(shí)被調(diào)用一次
                  collider.on(Contact2DType.END_CONTACT, this.onEndContact, this);
                  // 每次將要處理碰撞體接觸邏輯時(shí)被調(diào)用
                  collider.on(Contact2DType.PRE_SOLVE, this.onPreSolve, this);
                   // 每次處理完碰撞體接觸邏輯時(shí)被調(diào)用
                  collider.on(Contact2DType.POST_SOLVE, this.onPostSolve, this);
                  }
          });

          • 升級(jí)之后,物理碰撞分組不見(jiàn)了

          目前導(dǎo)入插件還不支持物理碰撞矩陣,因此暫時(shí)需要開(kāi)發(fā)者手動(dòng)設(shè)置碰撞矩陣,可在 Creator 主菜單的 項(xiàng)目 -> 項(xiàng)目設(shè)置 -> 物理 中重新設(shè)置。
          • 音頻 audioEngine 接口失效,無(wú)法播放音樂(lè)

          在 v3.x 中已經(jīng)移除了 audioEngine 接口,目前采用通過(guò)聲音組件 AudioSource 來(lái)播放聲音。通過(guò)將 AudioSource 組件設(shè)置為常駐節(jié)點(diǎn)來(lái)進(jìn)行音樂(lè)的播放與控制。詳細(xì)例子可以查詢官方案例 快上車 3DGitHub | Gitee)。
          注意: 如果設(shè)置成常駐節(jié)點(diǎn)需要注意一個(gè)問(wèn)題:常駐節(jié)點(diǎn)在切場(chǎng)景時(shí)會(huì)暫停音樂(lè),需要在 onEnable 中繼續(xù)播放(之后會(huì)在引擎?zhèn)冉鉀Q這個(gè)問(wèn)題)。
          • 出現(xiàn) Button 按鈕無(wú)法點(diǎn)擊的問(wèn)題

          排除代碼問(wèn)題和渲染層級(jí)以外,可以查看一下 Button 節(jié)點(diǎn)的 Scale 中的 z 軸的值是否為 0,如果是,則改為 1 就可以正常點(diǎn)擊。
          • 升級(jí)后進(jìn)行腳本修改后,編輯器卡死

          查看一下升級(jí)后的腳本中定義組件類型的 property 是否未定義,如果是,則是導(dǎo)入插件太過(guò)于老舊,請(qǐng)參考[插件升級(jí)]對(duì)導(dǎo)入插件進(jìn)行更新升級(jí)。更新插件后,需要 重新進(jìn)行項(xiàng)目升級(jí)

          結(jié)語(yǔ)

          上述問(wèn)題只是一些常見(jiàn)問(wèn)題的記錄,如果遇到其它問(wèn)題,可以建立 [issue] 給我們,也可以附上詳細(xì)的復(fù)現(xiàn)步驟及報(bào)錯(cuò)信息到[論壇]反饋。更多升級(jí)問(wèn)題及 API 的廢棄更改等,可參考官方文檔 [v3.0升級(jí)指南]

          參考鏈接:

          [v2.4 升級(jí)指南]:

          https://docs.cocos.com/creator/manual/zh/release-notes/

          [更新導(dǎo)入插件]:

          https://github.com/cocos-creator/plugin-import-2.x/blob/main/README.md

          [快上車 3D GitHub]:

          https://github.com/cocos-creator/tutorial-taxi-game

          [快上車 3D Gitee]:

          https://gitee.com/mirrors_cocos-creator/tutorial-taxi-game

          [3.0 TypeScript 問(wèn)題答疑及經(jīng)驗(yàn)分享]:

          https://forum.cocos.org/t/topic/106995

          [插件升級(jí)]:

          https://github.com/cocos-creator/plugin-import-2.x

          [issue]:

          https://github.com/cocos-creator/plugin-import-2.x/issues/new

          [論壇]:

          https://forum.cocos.org/

          [v3.0升級(jí)指南]:

          https://docs.cocos.com/creator/3.0/manual/zh/release-notes/upgrade-guide-v3.0.html

          點(diǎn)擊【閱讀原文】查看 Cocos Creator 3.0 升級(jí)指南官方文檔。

          往期精彩

          瀏覽 238
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产午夜精品久久久久 | 中文人妻无码一区二区三 | 欧美一交一乱一交一色一色情 | 黄在线观看网站 | 欧美性爱超碰在线 |