成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Cocos 插件教程:編寫帶擴展屬性插件的經驗分享

移動開發(fā) 游戲開發(fā)
這兩天用cocos插件編寫了一個2d粒子控件。很明顯的感受是官方文檔不是很完善,那篇超級長的說明脈絡也不是很清晰,以至于我在此期間掉了不少坑走了不少彎路,不過這次cocos放出來的插件系統(tǒng)還是很靈活很強大的,從編輯到最終輸出都可以由我們自定義實現(xiàn)。這篇教程就來分享下我這兩天做擴展屬性過程中總結的經驗,探討在插件的編寫過程中的一些技巧,幫助下后來者。

這兩天用cocos插件編寫了一個2d粒子控件。很明顯的感受是官方文檔不是很完善,那篇超級長的說明脈絡也不是很清晰,以至于我在此期間掉了不少坑走了不少彎路,不過這次cocos放出來的插件系統(tǒng)還是很靈活很強大的,從編輯到最終輸出都可以由我們自定義實現(xiàn)。這篇教程就來分享下我這兩天做擴展屬性過程中總結的經驗,探討在插件的編寫過程中的一些技巧,幫助下后來者。

一、如何開始?

可能大家之前看過這篇《Cocos Studio 擴展說明》(下稱《說明》):

http://cn.cocos2d-x.org/tutorial/show?id=2650

這說明篇幅之大之長,估計嚇退了不少小伙伴。鼓起勇氣讀下去的估計半路上也睡倒了一片。(我就看到睡著了幾次,信息量實在太大了,催眠神器啊有木有。。。)

實際插件的編寫并沒那么復雜,直接修改官方提供的sample工程即可。

打開sample工程。(sample工程的路徑請看《說明》第3點“示例工程位置”)

可以看到里邊有這么多文件:

說明:

ü 其中DataModel、Templates和ViewModel是官方的一個Custom控件的示例,Lua文件夾下也有類似的三個文件夾,這個是帶文本sprite插件的源碼。

ü Editor是屬性區(qū)自定義控件的例子。

ü PublishExtend是自定義導出數(shù)據(jù)格式的例子。

ü AddinConfig是插件的配置文件,配置當前插件所依賴的模塊,目前我們不需要改動。

復制一份插件工程,保留我們希望使用的例子來作為模版,其他文件刪除。

我期望寫個粒子插件,不需要自定義Editor和導出數(shù)據(jù)格式,因而我只保留ExtensionModel和Lua兩個文件夾,并將“Lua”重命名為“Particle”,如下所示:

然后根據(jù)我們的需要對剩下的文件做一些修改:

1. LuaObject.addin.xml文件

修改為T4模版生成的類。

2. ViewModel下的CustomParticleObject.cs文件

這個文件需要改三處

a.這四個屬性主要用于編輯器顯示控件的一些信息。還有CustomParticleObject繼承的類型也需要根據(jù)自己的需要修改。(具體看《說明》中的“視圖模型”部分)

b.創(chuàng)建插件時的默認名稱。

c.依賴的lua文件。即LuaScript文件夾下對應本插件的Lua文件。

3.DataModel的CustomParticleObjectData.cs修改如下兩處:

4. Lua文件夾下的CustomParticleObject.tt模板文件,修改繼承的對象類型和ViewModel類的類名。(具體看《說明》“Lua 代碼生成模板”部分)

OK,改完這些,我們就配置完一個插件工程了。接下來我們還需要在lua中完成對引擎的擴展,然后在編輯器中調用lua的接口。

PS:2.2.1升級至2.2.5之后,需要相應地升級插件工程,具體可看新版本示例工程中Addins/Addins.Sample/Lua/修改記錄.txt

二、 編寫對應的Lua文件

這一步主要是將我們的接口準備好,給上邊配置的C#工程調用。

首先是必須做的四件事:

1.在文件的***返回一個table給插件工程,此后插件工程會在這個table上找需要的接口。這里我們稱這個table為“container”

2.為“container”添加CreateCustomNode的工廠函數(shù),創(chuàng)建一個我們擴展的Cocos2d-x對象并返回。

3.為“container”添加一個GetBaseType函數(shù),返回我們插件的基礎類型。(之后我們的插件也會有這個基礎類型的編輯接口。)

4.把編寫出來的文件放到cocos文檔路徑的Addins/LuaScript下

然后在1所述的table上添加一些屬性接口來跟插件工程進行數(shù)據(jù)交換,可交換的數(shù)據(jù)只能是如下這些數(shù)據(jù)類型,且一次只能交換一個數(shù)據(jù):

Bool

Int

String

Double

Float

Color

ResourceData

PS:lua下沒有區(qū)分Float、Double和Int,這些都用double來承載。

技巧:

1.插件工程在table上查找字段的方式不是用rawget方式,因此元表還是可用的,我們可以給table設置__index元表,重定向到我們的所擴展的2d-x對象,某些我們所擴展的對象已經有的簡單接口用元表定位即可,不需要在table中再寫一次,減少一點工作量。

2.如果這個lua文件出錯了,cocos不會給什么有用的調試信息。我們先在一個2d-lua工程里邊調試,直到所有接口都正常工作后再放到cocos中,這樣能節(jié)約不少時間。

3.這個文件跟最終導出的數(shù)據(jù)不一定有關聯(lián)。

三、 在插件工程中添加與lua層交換數(shù)據(jù)的接口

主要是給視圖模型(ViewModel文件夾下那個對象)編寫一些property,每編寫一個property編輯器就會在屬性區(qū)生成一個屬性控件。然后就可以用這些屬性控件來進行可視化編輯。

與lua的通訊需要通過LuaValueConverter來調用Lua層的接口,進行數(shù)據(jù)交換。

一個基本的property大概是這樣的:

[UndoPropertyAttribute]

[DisplayName("TangentialAccel")]

[Category("Group_Feature")]

[PropertyOrder(-99)]

[Browsable(true)]

public float TangentialAccel

{

get

{

return luaValueConverter.GetFloatValue("getTangentialAccel");

}

set

{

luaValueConverter.SetFloatValue("setTangentialAccel",value);

this.RaisePropertyChanged(() => this.TangentialAccel);

}

}

首先是幾個用中括號包著的attribute、當前property的聲明然后是getter、setter定義。Attribute值的作用可以看看《說明》的“屬性區(qū)擴展”一節(jié)。

其次還有setValue函數(shù)。這個函數(shù)在進行克隆操作時發(fā)揮作用。將上述寫的property賦值給傳進來的cObject對象相對應的property即可。

技巧:

1.如果有比較多的屬性的話,可以先寫同一類型的擴展屬性,調試到可用后復制黏貼,修改名字。

2.可以用Cocos Studio.Basic.LogConfig.Output.Info(String )在C#插件工程中輸出錯誤信息。

3.調試時使用VS的“調試”-“附加到進程”,附加到Cocos Studio主進程進行調試,C#代碼出錯時,VS會幫你指出出錯的位置并且有詳細的調試信息。所有導致崩潰的錯誤一般都能夠定位到。

4.目前l(fā)ua下沒有輸出錯誤信息的接口,少量的調試信息可以用一個text控件放在創(chuàng)建的節(jié)點上做輸出。Lua下socket和io模塊還能夠使用,我們可以利用這兩個模塊來輸出調試信息,我使用的是socket,大家可以參考下我的源碼。cocos的研發(fā)同學表示會盡快提供log接口,到時就沒那么麻煩了。

四、 編輯DataModel

即CustomParticleObjectData.cs文件,以property的方式聲明下各個需要被保存到csd文件的性質,前面寫上[ItemProperty] [JsonProperty]。這樣這些數(shù)據(jù)就會被保存到csd文件當中了,我們關掉編輯器再次打開,編輯過的數(shù)據(jù)就不會丟失了。生成T4模板的時候,模板里邊引用的值也是從這里來的。

注意顏色類型的性質要用ColorData聲明(是的我被坑過)。這里可能出錯的點是數(shù)據(jù)類型寫錯,現(xiàn)象是不能保存也不能導出。

五、 代碼生成模板

即Lua文件夾下的CustomParticleObject.tt模板文件。功能是將編輯器編輯出來的值按特定模板輸出出來。

技巧:

如果你看過我的lua文件和T4模板的話,你會發(fā)現(xiàn)二者之間毫無關聯(lián)。我的lua文件中的CreateCustomNode是創(chuàng)建了一個node對象然后再建一個particle對象做為node的子對象。這樣做的目的是為了能夠實現(xiàn)更換粒子模板的效果(更換粒子模板需要重新生成粒子對象)。

其實T4就是根據(jù)模板將值填寫到字符串中,最終保存到文件里,愿意的話,生成C++代碼都沒問題。

責任編輯:老門
相關推薦

2009-08-07 10:00:00

在Eclipse中安裝

2022-05-30 07:58:52

瀏覽器插件

2011-06-27 17:24:37

Qt 插件

2011-03-28 11:20:11

Nagios 插件

2011-04-06 16:02:26

Nagios插件

2021-07-28 06:51:09

linux

2011-07-27 13:04:39

jQuery

2013-08-01 15:12:43

2009-09-15 09:29:29

Google Chro擴展插件谷歌

2016-09-21 12:34:10

Chrome瀏覽器插件

2009-06-24 10:58:21

jQuery插件教程

2011-06-27 16:59:19

Qt 動態(tài) 插件

2011-08-23 18:04:40

LuaWiresharkDissector

2009-01-03 15:05:31

ibmdwEclipseSymphony

2009-12-04 10:19:04

2019-04-23 12:10:00

前端開發(fā)編程

2011-03-31 14:06:01

Cactisetup

2015-05-15 10:52:23

jQuery社交網絡分享插件

2010-03-05 14:55:39

Python創(chuàng)建Sil

2011-06-03 10:15:13

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 99福利视频 | 国产日韩欧美一区 | 亚洲区一区二 | 中文字幕一区在线观看视频 | 久久精选| 国产精品二区三区在线观看 | 久久久久国产精品 | 久久久久国产精品一区二区 | 国产精品色 | 国产综合久久 | 国产精品一区二区免费 | 亚洲成人免费观看 | 国产福利在线小视频 | 国产毛片久久久 | 中文字幕二区 | 亚洲成人www | av中文字幕在线观看 | 欧美中文字幕一区二区三区亚洲 | 国产区精品 | 欧美日韩精品一区 | 久久精品小视频 | 精品久久久久国产免费第一页 | 日本精品一区二区 | 久久精品手机视频 | 亚洲国产精品久久久久久 | 伊人狠狠 | 日韩免费一区二区 | 国产精品久久久一区二区三区 | 日韩欧美在线视频一区 | 91九色视频 | 日韩精品一区二区三区中文字幕 | 成人深夜福利 | 日韩精品在线播放 | 国产夜恋视频在线观看 | 日韩一二区在线 | 91亚洲一区 | 日本超碰 | 国产一级片免费看 | www.9191.com | 国产激情综合五月久久 | 懂色中文一区二区在线播放 |