Cocos Creator 利用常駐節點做圖層管理


版本:2.3.4

 

單純只是一個思路,實際使用我是用單Scene+Prefab,整個游戲只有一個Main.fire,游戲場景和彈框模塊全都是Prefab。 

 

一般游戲都有圖層管理,比如

sceneLayer 場景層

panelLayer 彈框層

tipLayer   提示框層

等等

 

cocos里的場景不是持久化的,每次切換都會自動destroy,如果在場景上放這些圖層,那么每個scene都要放一遍?然后再獲取,這樣很麻煩。

那么將圖層節點放在場景的容器里行不行呢? 加載場景使用的是cc.director.loadScene,scene的容器node貌似是director上的一個nodeActivator,這個node沒有外部訪問的接口。

 

 

現在不考慮scene的容器或者cocos的頂層容器。我想一想兩種圖層管理的方法。

 

一  只有一個scene

整個游戲一個scene,就是游戲入口的scene,在這個scene上放sceneLayer等圖層的node,這個入口scene相當於egret和laya的stage。

然后所有場景scene和彈框模塊,都做成預制件prefab,每次顯示都addChild到入口scene的相應圖層上。

 

 

 二  使用常駐節點

比如我在場景1,放置sceneLayer等圖層。為了方便顯示,我每個圖層加了個單色。

sceneLayer、panelLayer、tipLayer設置為常駐節點,這3個cc.Node必須和Canvas同級,不能放在Canvas節點下。

 

常駐節點必須在根節點下,也就是和canvas同級。把3個圖層設置為常駐節點。

    onLoad(){
        cc.game.addPersistRootNode(cc.find("sceneLayer"));
        cc.game.addPersistRootNode(cc.find("panelLayer"));
        cc.game.addPersistRootNode(cc.find("tipLayer"));
    }

  

然后切換場景,在新場景中,仍然會顯示這3個圖層。

 

 在新場景中打印場景圖層,是可以打印的,說明sceneLayer的常駐節點沒有隨着切換場景而銷毀。

    onLoad(){
        console.log(cc.find("sceneLayer"));  //輸出sceneLayer的cc.Node
    }

 

利用常駐節點,我們可以在入口場景中放置sceneLayer等圖層。用圖層管理類保存引用。

 

三 實踐

圖層管理類,單例

export default class LayerManager extends cc.Component {

    private static instance:LayerManager;
    public static ins():LayerManager{
        if(this.instance == null){
            this.instance = new LayerManager();
        }
        return this.instance;
    }

    public panelLayer:cc.Node;
    public tipLayer:cc.Node;
    
}

  

在入口場景中設置常駐節點, 並保存到圖層管理類。

@ccclass
export default class Helloworld extends cc.Component {

    onLoad(){
        cc.game.addPersistRootNode(cc.find("sceneLayer"));
        cc.game.addPersistRootNode(cc.find("panelLayer"));
        cc.game.addPersistRootNode(cc.find("tipLayer"));

        LayerManager.ins().panelLayer = cc.find("panelLayer");
        LayerManager.ins().tipLayer = cc.find("tipLayer");
    }
}

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM