分享一个Creator模拟Unity的MonoBehaviour脚本的设计方案

CocosCreator的脚本基础是Component,而Unity的脚步基础是MonoBehaviour
相对于Creator的Component,个人感觉Unity的MonoBehaviour的设计更好一点。因为我主要做unity开发,做Creator开发时经常要移植unity代码到creator。所以在Creator设计了一套和MonoBehaviour相似的解决方案,方便代码移植。

MonoBehaviour 主要由两大部分组成,GameObject和Transfrom。
所以我在Creator里也设计了一套相似的组件,组件命名为Behaviour,身上挂有GameObject和Transfrom,这两个组件继承Node组件,并且根据Unity版本有的接口进行扩充
如下图

除此之外,还有很多方便易用的接口,如事件回调,下面会一一介绍


如何使用
写一个类继承Behaviour组件就可以了。
比如Player类继承Behaviour


用法1:如何使用transform和gameObject

var player:Player = this.getComponent(Player);
player.gameObject.setActive(true);
player.transform.gameObject.setActive(true);
player.gameObject.transform.gameObject.transform.position = new Vec3(0,0,0);
做过unity开发的朋友是不是很熟悉的写法。

但是功能远不止如此 ,为了和Unity用法相同Transform和GameObject扩充了一些Creator没有的接口

Unity里的gameObject.tag可以用Behaviour.tag代替,这样就可以给对象设置标签了。
Ctreator没提供有查找往上N层父节点的函数,Unity是有的,借助自定义的Transform组件
Creator也可以像Unity一样,transform.getComponentInParent(Player);来获取上上上层节点可能存在的组件。
还可以像这样通过路径获取节点transform.find(“node1/node2/node3/MyGameObject”);

GameObject也可以像Unity的一样,可以快速查找场景里可能存在的某些组件
比如 var player = GameObject.FindObjectOfType(Player);

还有其他的接口就不一一列举了。


用法2:碰撞监听
Creator的碰撞监听,必需先获得碰撞体组件,然后对碰撞体组件进行事件监听
如图



Creator这原始的碰撞监听的用法是不是又长又臭?

再看看Unity的用法
Unity的用法就简洁得多,只需在需要做碰撞回调处理的脚本添加如下图的函数就可以了
image

所以针对Creator原有的碰撞回调的缺点,在Behaviour组件里也添加了和Unity相同用法的接口
写一个脚本继承Behaviour,然后在脚本里添加如下函数就可以了


这样的写法就简洁很多了。
更多的碰撞回调函数名可以看这里


还提供有和Unity类似的输入组件 Input。
可以参考我以前写的一个帖子 分享一个参考Unity的Input系统写的Creator3.0的Input系统
比如
Ctreator写法
QQ图片20210409101153
Unity的写法
QQ图片20210409101351
写法是不是Unity的用法相同?相比比Cocos引擎自带的基于事件监听的输入系统更加方便易用,更人性化?


如何获得该套模仿Unity写的组件
获取途径,打开下面的链接
https://easymapeditor-1258223435.cos.ap-guangzhou.myqcloud.com/v2.0.0/web-mobile/index.html
然后点击菜单 “下载” -> “下载基础前端框架Creator” -> “基础前端框架_v3.5.0


下载完后打开项目,找到下面截图里的组件,拷到你的项目里就可以用了
image

输入组件可以从这里下载包 Input组件.zip (7.7 KB)

上面的地图编辑器如果感兴趣可以看这里 大型RPG或SLG游戏解决方案,有相关需求的开发者进,有新版“在线地图编辑器”

6赞

支持
但我们项目中规范是没特殊情况不允许写update
以前一个项目(Unity)的教训

update还是要有的,你们的规范应该最少还是有个自定义的update,用自定义的也行。
update只针对输入组件用,而Behaviour可以模拟Unity的MonoBehaviour。
使用Behaviour可以方便把Unity的代码靠过来用。

update确实是必不可少的
但后来我们实践下来,除了很少量的可以封装进框架的逻辑外,上层逻辑基本不需要写update

update滥用会出现很大的问题,
每个人的水平不一样,可能会将大量逻辑写进update,因为这样写确实很方便
但后面性能崩不住的时候,优化起来不亚于重写