Cocos插件教程:编写带扩展属性插件的经验分享

2015-05-07 14:59:02   来源:新浪游戏

  这两天用cocos插件编写了一个2d粒子控件。很明显的感受是官方文档不是很完善,那篇超级长的说明脉络也不是很清晰,以至于我在此期间掉了不少坑走了不少弯路,不过这次cocos放出来的插件系统还是很灵活很强大的,从编辑到最终输出都可以由我们自定义实现。这篇教程就来分享下我这两天做扩展属性过程中总结的经验,探讨在插件的编写过程中的一些技巧,帮助下后来者。

 

 

  一、如何开始?

  可能大家之前看过这篇《Cocos Studio 扩展说明》(下称《说明》):

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

  这说明篇幅之大之长,估计吓退了不少小伙伴。鼓起勇气读下去的估计半路上也睡倒了一片。(我就看到睡着了几次,信息量实在太大了,催眠神器啊有木有。。。)

  实际插件的编写并没那么复杂,直接修改官方提供的sample工程即可。

  打开sample工程。(sample工程的路径请看《说明》第3点“示例工程位置”)

  可以看到里边有这么多文件:

 

 

  说明:

  ü 其中DataModel、Templates和ViewModel是官方的一个Custom控件的示例,Lua文件夹下也有类似的三个文件夹,这个是带文本sprite插件的源码。

  ü Editor是属性区自定义控件的例子。

  ü PublishExtend是自定义导出数据格式的例子。

  ü AddinConfig是插件的配置文件,配置当前插件所依赖的模块,目前我们不需要改动。

  复制一份插件工程,保留我们希望使用的例子来作为模版,其他文件删除。

  我期望写个粒子插件,不需要自定义Editor和导出数据格式,因而我只保留ExtensionModel和Lua两个文件夹,并将“Lua”重命名为“Particle”,如下所示:

 

 

  然后根据我们的需要对剩下的文件做一些修改:

  1. LuaObject.addin.xml文件

 

 

  修改为T4模版生成的类。

  2. ViewModel下的CustomParticleObject.cs文件

  这个文件需要改三处

  a.这四个属性主要用于编辑器显示控件的一些信息。还有CustomParticleObject继承的类型也需要根据自己的需要修改。(具体看《说明》中的“视图模型”部分)

 

 

  b.创建插件时的默认名称。

 

 

  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的工厂函数,创建一个我们扩展的Cocos2d-x对象并返回。

  3.为“container”添加一个GetBaseType函数,返回我们插件的基础类型。(之后我们的插件也会有这个基础类型的编辑接口。)

  4.把编写出来的文件放到cocos文档路径的Addins/LuaScript下

  然后在1所述的table上添加一些属性接口来跟插件工程进行数据交换,可交换的数据只能是如下这些数据类型,且一次只能交换一个数据:

  Bool

  Int

  String

  Double

  Float

  Color

  ResourceData

  PS:lua下没有区分Float、Double和Int,这些都用double来承载。

  技巧:

  1.插件工程在table上查找字段的方式不是用rawget方式,因此元表还是可用的,我们可以给table设置__index元表,重定向到我们的所扩展的2d-x对象,某些我们所扩展的对象已经有的简单接口用元表定位即可,不需要在table中再写一次,减少一点工作量。

  2.如果这个lua文件出错了,cocos不会给什么有用的调试信息。我们先在一个2d-lua工程里边调试,直到所有接口都正常工作后再放到cocos中,这样能节约不少时间。

  3.这个文件跟最终导出的数据不一定有关联。

  三、 在插件工程中添加与lua层交换数据的接口

  主要是给视图模型(ViewModel文件夹下那个对象)编写一些property,每编写一个property编辑器就会在属性区生成一个属性控件。然后就可以用这些属性控件来进行可视化编辑。

  与lua的通讯需要通过LuaValueConverter来调用Lua层的接口,进行数据交换。

  一个基本的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值的作用可以看看《说明》的“属性区扩展”一节。

  其次还有setValue函数。这个函数在进行克隆操作时发挥作用。将上述写的property赋值给传进来的cObject对象相对应的property即可。

  技巧:

  1.如果有比较多的属性的话,可以先写同一类型的扩展属性,调试到可用后复制黏贴,修改名字。

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

  3.调试时使用VS的“调试”-“附加到进程”,附加到Cocos Studio主进程进行调试,C#代码出错时,VS会帮你指出出错的位置并且有详细的调试信息。所有导致崩溃的错误一般都能够定位到。

  4.目前lua下没有输出错误信息的接口,少量的调试信息可以用一个text控件放在创建的节点上做输出。Lua下socket和io模块还能够使用,我们可以利用这两个模块来输出调试信息,我使用的是socket,大家可以参考下我的源码。cocos的研发同学表示会尽快提供log接口,到时就没那么麻烦了。

  四、 编辑DataModel

  即CustomParticleObjectData.cs文件,以property的方式声明下各个需要被保存到csd文件的性质,前面写上[ItemProperty] [JsonProperty]。这样这些数据就会被保存到csd文件当中了,我们关掉编辑器再次打开,编辑过的数据就不会丢失了。生成T4模板的时候,模板里边引用的值也是从这里来的。

  注意颜色类型的性质要用ColorData声明(是的我被坑过)。这里可能出错的点是数据类型写错,现象是不能保存也不能导出。

  五、 代码生成模板

  即Lua文件夹下的CustomParticleObject.tt模板文件。功能是将编辑器编辑出来的值按特定模板输出出来。

  技巧:

  如果你看过我的lua文件和T4模板的话,你会发现二者之间毫无关联。我的lua文件中的CreateCustomNode是创建了一个node对象然后再建一个particle对象做为node的子对象。这样做的目的是为了能够实现更换粒子模板的效果(更换粒子模板需要重新生成粒子对象)。

  其实T4就是根据模板将值填写到字符串中,最终保存到文件里,愿意的话,生成C++代码都没问题。

精彩推荐
相关新闻

Cocos沙龙深圳站启动 超阵容带来最鲜“干货”

  盛夏即将来临,cocos开发者沙龙也将火热启动。2015年5月10日,cocos沙龙将再次来到美丽的鹏城——深圳,以“See you again: ...

相关Cocos v2.2.1推出3D场景编辑器 挑战3D引擎市场格局
2015-04-28 12:03:11 来自:产业服务-新闻

Cocos v2.2.1推出3D场景编辑器 挑战3D引擎市场格局

  3月30日,备受关注的cocos v2.2.1重磅发布并完成更新,全新的cocos v2.2.1在原有cocos 引擎的基础上,进行了部分修正和大量优...

相关Cocos引擎再掀风暴 与开发者共成长
2015-04-27 16:35:40 来自:产业服务-新闻

Cocos引擎再掀风暴 与开发者共成长

  作为目前国内占有50%市场份额的主流手游研发引擎,cocos引擎一直与研发者们携手并进,不断丰富和优化引擎,为开发者们提供更...

相关中投中财游戏产业基金启动仪式将亮相GMGC2015大会
2015-04-23 12:20:33 来自:产业服务-新闻

CGDC引擎专场:中国市场70%的游戏由Cocos引擎开发

  本届中国游戏开发者大会(简称CGDC)将设立引擎专场,官方会请来引擎的研发者与自己的好搭档游戏厂商一同来为大家介绍游戏引擎...

相关从ChinaJoy 2015主题谈当今移动游戏
2015-04-23 11:45:44 来自:产业服务-新闻
CGWR

中国网络游戏排行榜(China Game Weight Rank)是由新浪游戏推出的目前国内最全面、最专业、最公正的最新网络游戏评测排行榜,涵盖2010至今内所有新游戏,力图为中国游戏玩家打造最值得信赖的新网游推荐平台。

新浪中国网络游戏排行榜是以由新浪游戏专业评测员组成的评测团队为核心,以游戏的画质、类型、风格、题材等游戏特性为依据,对中国(大陆港澳台)、欧美、日韩等地区正在进行测试或正式运营的新网游产品进行评测并打分后产生的权威游戏排行榜。新浪中国网络游戏排行榜将网络游戏从六大项、二十八个小分项与同类游戏进行横向比较,再将该游戏与自身的不同版本进行纵向对比后,由评测中心根据加权平均数得出最后的游戏分数,并以游戏测试及上线时间点为分组,根据每款游戏的CGWS分数在每个季度发布排行榜榜单,实现了排行榜的透明化和实时化,帮助玩家准确、迅速地找到心目中的理想游戏。

评天下游戏、测产品深浅—新浪中国网络游戏排行榜CGWR! http://top.sina.com.cn

专题活动

本周3款游戏测试 《星际战甲》首测

五一假期归来的第一周仅有3款游戏进行测试。超能动作射击网游大作《星际战甲》国服首测,《突击英雄》周五不删档测试。查看测试表>>

多娇游戏圈 女神萌妹天天看

游戏圈女神多娇又爱玩 来看一周游戏美女汇总!

国行版NBA2K15火热开赛

国行XboxOne平台引进的首款3A级篮球游戏大作《美国篮球协会15》。

魔域九年 王者之战新起航

魔域开服至今已走过九年,全新版本《王者之战》扬帆起航。

大汇站:《星际战甲》试玩

科幻射击网游《星际战甲》,国服独家首次试玩,更有软妹解说。

新游尾行:全职大师

腾讯代理NCSOFT全新作《全职大师》,5月将开启首测。

五一游戏荒 爱解说来帮忙

全新的爱解说的视频版,小编5.1游戏推荐。

新浪简介 About Sina | 网站地图 | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

Copyright © 1996-2014 SINA Corporation, All Rights Reserved

新浪公司 版权所有

用微信扫描二维码
分享至微信朋友圈