【CocosCreator簡易教程】基礎Prefab教程 - 2 - 用代碼進行控制

【CocosCreator簡易教程】基礎Prefab教程 - 2 - 用代碼進行控制

此處的專案依然會放在 我的GitHub中 想直接拿的童鞋請自取,
這次是由上次的 基礎教程1 沿用而來,我們將剛剛的專案再打開繼續做就可以了


預先準備

打開專案後,
我們先將上次製作的 MyPrefab 從場景中刪除,
因為這次將直接從資源管理器中進行編輯,

先讓我們在資源管理器中,新增一個 scripts 資料夾,
這邊我們要新增兩個 Script 檔,
一個做給場景用,命名為 IndexScript ,
再新增一個給Prefab用,命為 MyPrefabScript

所以現在我們的場景跟資源管理器看起來應該像這樣…


將腳本關聯至Prefab上

再來我們先雙擊我們的Prefab,進入編輯模式,
接著、將剛剛的MyPrefabScript,拖曳至MyPrefab的屬性裡,做為默認腳本

記得做完這個步驟,要按下上面的Save,將這個修改存檔。

將腳本關聯至Scene上

這個步驟就跟上面差不多,唯一不同的是,
場景的腳本我習慣放在外面,所以我會建立一個空Node來單獨放腳本,如下圖…


接著,開始寫腳本吧

首先是 MyPrefab 的部份

我們先打開 MyPrefabScript,將代碼改為如下…

cc.Class(
{
    extends: cc.Component,
    properties: 
    {
        Color: cc.Node,
        Text: { default: null, type: cc.Label }
    },
    
    setNumberBy: function( number )
    {
        //這邊直接將我們的Label字串設定為 No.#
        this.Text.string = ( 'No.' + number );
    },
    
    Run: function()
    {
        //這邊建立一個永遠不停止的repeat,動作是每1秒轉360度
        var action = cc.repeatForever( cc.rotateBy( 1, 360 ) );
        //讓我們的彩球旋轉吧!
        this.Color.node.runAction( action );
    }
});

將上面的腳本儲存後,

接著,我們要進行屬性的關聯,
雙擊資源管理器中的 MyPrefab,我們應該可以看到腳本的部份改變了,
多出了兩個空的框框,
因為我們在 properties 中,新增了一個 Color及Text,
所以我們要分別把 Color 及 Text 拖曳至腳本的屬性框中,使其關聯,如下圖…

關聯完畢後,按下儲存,
至此,我們Prefab的部份就準備完畢了。


接著是場景(Scene)的部份

我們先回到 Index.fire 場景,
先讓我們在 Canvas 下,建立一個 Button ,並且將其命名為 BtnAdd ,
我順便將內文改為 執行 ,這樣比較好識別,建立好後如下圖…

好了,接下來就是看代碼說故事的時間了,
將你的 IndexScript 打開,把下面的代碼貼上去

cc.Class(
{
    extends: cc.Component,
    properties: 
    {
        ClickCount: 0,
        //除了計數器外,這邊我故意留空,我準備全部使用代碼來控制
    },

    onLoad: function ()
    {
        //首先,我們先找到我們剛剛新增的按鈕
        var NodeBtnAdd = cc.find( 'Canvas/BtnAdd' ); //cc.find回傳的是Node
        
        //然後,記得養成時時檢查變數是否存在、並且寫Log的習慣,
        //上面的參數如果打錯,這邊就會印出Log,並且也不會再往下執行
        if( !NodeBtnAdd ) { cc.log('找不到Button, 請確認find的參數正確'); return; }
        
        //接著,我們將監聽按鈕的點擊事件,關聯至下方的onBtnAddClicked方法
        NodeBtnAdd.on( cc.Node.EventType.TOUCH_END, this.onBtnAddClicked.bind( this ) );
    },

    //由於我們打算動態新增Prefab來進行使用,所以我們在這個點擊事件中進行載入
    onBtnAddClicked: function()
    {
        //我們先動態取得Canvas
        var CanvasNode = cc.find( 'Canvas' );
        if( !CanvasNode ) { cc.log( '找不到Canvas畫布,請確認你的場景裡有Canvas' ); return; } 
        
        //這邊先將 this 指標存到另一個變數, 在別的方法裡this是會被改變的
        var root = this; 
        
        //Prefab的路徑
        //不過因為我們的MyPrefab直接就放在 /assets/resources/ 下,就直接寫
        var prefabPath = 'MyPrefab';
        //Ps. 假設你是放在在resources下的prefabs資料夾中,你就得寫 'prefabs/MyPrefab'
        
        
        //這邊我們新增一個私有方法,來做為載入Prefab時的方法
        //(當然你也可以直接寫在loadRes參數上,我只是覺得這樣比較容易看清楚)
        var onResourceLoaded = function( errorMessage, loadedResource )
        {
            //一樣,養成檢查的好習慣
            if( errorMessage ) { cc.log( '載入Prefab失敗, 原因:' + errorMessage ); return; }
            if( !( loadedResource instanceof cc.Prefab ) ) { cc.log( '你載入的不是Prefab, 你做了什麼事?' ); return; } //這個是型別的檢查
            
            //我們將root裡的計數器加1
            root.ClickCount++;
            
            //接著,我們就可以進行實例化了
            var newMyPrefab = cc.instantiate( loadedResource );
            
            //我們先將這個建立出來的Prefab加入畫布裡
            CanvasNode.addChild( newMyPrefab );
            
            //我們要開始設定位置,因為當時在Prefab我們沒有指定最外層的大小
            //所以這邊我們要取得在MyPrefab中,我們加入的 "SplitButtons_01" 這張圖片的高度
            var buttonBG = newMyPrefab.getChildByName( 'SplitButtons_01' );
            if( !buttonBG ) { cc.log('找不到指定名稱的Node, 是不是哪裡搞錯了?'); return; }
            
            //所以,y軸就是利用計數器乘上圖片的高度,再加上10額外邊界後,再減去場景的高度除以二
            var newY = ( root.ClickCount * buttonBG.height ) + 10 - ( CanvasNode.height / 2 );
            //減去場景高度這個動作,是為了讓每點擊一次按鈕,我們的Prefab就一直往上產生
            
            //設定位置,這邊x軸不變
            newMyPrefab.setPosition( 0, newY );
            
            //接著,我們取得MyPrefab裡的Script,這個就是我們當時定的名稱
            var newMyPrefabScript = newMyPrefab.getComponent( 'MyPrefabScript' );
            
            //然後,我們就可以呼叫我們寫在該腳本中的方法了
            //這邊我直接將計數器的值傳進去了
            newMyPrefabScript.setNumberBy( root.ClickCount );
            
            //然後,我新增了一個CallBack事件,使用計時器機制,讓它在1秒之後再執行
            var startRun = function(){ newMyPrefabScript.Run(); };
            
            //呼叫計時器
            newMyPrefabScript.scheduleOnce( startRun, 1 );
        };
        
        //這邊才是真的使用cc.loader進行載入,並且呼叫我們上面寫的方法
        cc.loader.loadRes( prefabPath, onResourceLoaded );
    },
});

儲存之後,你已經可以運行這個範例了,
大概的效果就會像這樣…

點擊按鈕第一次後…

點擊按鈕第四次後…

這邊弄個演示Gif檔好了…


代碼的部份,
我盡量的都有寫了註解,應該是蠻好理解的,

至此,
我們的Prefab基礎教程暫時告一段落 (真的很基礎)
不過你可以用來應用在很多方面,例如在ListView裡面…XD

當然上面的東西你可以直接到 GitHub的 Example_02_Script 目錄 下取得。

若有任何問題,請多多指教,小弟會即時改正的,
謝謝觀看 :smiley:

上一篇在這: 【CocosCreator簡易教程】基礎Prefab教程 - 1 - 製作第一個Prefab

6赞

品质很棒的教程!

1赞

虽然这一块学会了,但是为了新人值得一赞,还有就是为啥不早点发啊:joy:

2赞

找这个很久了!支持!希望多出一些这样的教程

支持大神,多发教程拯救我们这种小白

传送门