【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赞

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

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

传送门