之前Cocos君给 Cocos2d-x 源码引擎的用户安利过 Cocos Creator 了,今天再给广大的 Unity 用户们安利一下。其实接触过 Cocos Creator 的人应该都能感受到,Cocos Creator 从 Unity 学习了很多优秀的设计,比如 Entity Component 框架,数据驱动等等。所以 Unity 用户上手 Cocos Creator 其实会非常容易。
Cocos2d-x 用户请点击:4个知识帮你轻松上手Cocos Creator
Cocos Creator 的 API 使用驼峰命名法 (camelCase), 方法和变量首字母小写, 类型定义首字母大写。
Cocos Creator 的 回调函数 (callback) 遵循 Node.js 的风格, 即回调的第一个参数是错误信息。
cc.Node vs GameObject
Cocos Creator 中的 Node 相当于 Unity3D 中的 GameObject + Transform. 在 Cocos Creator 中, 父子节点的层级关系由 Node 来维护. 而 Unity3D 中是交给 Transform 来管理。
// 改变父子关系
this.node.parent = anotherNode;
// 旋转 20 度
this.node.rotation += 20;
// 位移 (10,10) 个像素
this.node.position.x += 10;
this.node.position.y += 10;
// 缩放 1.5 倍
this.node.scale.x *= 1.5;
this.node.scale.y *= 1.5;
坐标系
cc.Node 中的 position, rotation 和 scale 均为本地坐标, 对比 Unity3D,其 Postion, Rotation 为世界坐标系。在 Cocos Creator 中, 如果希望计算 cc.Node 的世界坐标, 可以通过如下方法:
// 将节点设置到世界坐标为 (100,100) 的位置
this.node.position = this.node.convertToNodeSpaceAR(cc.v2(100,100));
// this.node.rotation = TODO
cc.Component vs MonoBehaviour
Cocos Creator 中, 用户定义的脚本是通过扩展 cc.Component 类来编写的,而在 Unity3D 中,则是通过 扩展 MonoBehaviour。让我们来对比一下一份相同功能的 Cocos Creator 脚本和 Unity3D 脚本:
Unity3D:
public class Foobar : MonoBehaviour {
public string text = 'Foobar';
void Start () {
Debug.Log('Hello ' + text );
}
void Update () {}
}
Cocos Creator:
// Foobar.js
cc.Class({
extends: cc.Component,
properties: {
text: 'Foobar',
},
onLoad: function () {
console.log('Hello ' + this.text);
},
update: function (dt) {},
});
属性定义
Cocos Creator 中属性定义在 properties 字段中, 而 Unity3D 中属性被定义为 MonoBehaviour 的 成员变量。 除了定义位置的区别,Cocos Creator 在属性中还引入了属性参数的概念,这些参数可用于控制属性在 Inspector 中的显示方法,序列化与否等等。
下面是几种常用属性在 Cocos Creator 中定义方法:
var MyEnum = cc.Enum({
Foo: 1,
Bar: 2,
});
// MyScript.js
var Foobar = require('Foobar');
cc.Class({
extends: cc.Component,
properties: {
// 引用其他 cc.Node
// Unity3D 中定义为: public GameObject otherGameObject;
otherNode: { default: null, type: cc.Node },
// 引用一份 Foobar Component 实例
// Unity3D 中定义为: public Foobar foobar;
foobar: { default: null, type: Foobar },
// 不序列化该属性
// Unity3D 中定义为: [System.NonSerialized] public int index = 0;
index: { default: 0, type: cc.Integer, serializable: false },
// 定义一份数组
// Unity3D 中定义为: public float[] idList;
idList: { default: [], type: cc.Float },
// 定义一份枚举类型
// Unity3D 中定义为: public MyEnum myEnum = MyEnum.Foo;
myEnum: { default: MyEnum.Foo, type: MyEnum },
}
})
生命周期
Cocos Creator 的生命周期和 Unity3D 基本一致,仅仅在命名上稍微有一些出入:
当你希望销毁一个 cc.Object 实例(如: node, component 或者 asset)时,使用 obj.destroy() 函数。
当你想判断一个 cc.Object 实例(如: node, component 或者 asset)是否已经被销毁时,,使用 cc.isValid(node)。
消息
Cocos Creator 的消息系统采用 dom 的消息收发方式,可以向上传递消息,需要在 Node 中进行消息注册,而 Unity3D 中,消息通过 SendMessage 并直接响应脚本中定义的成员函数来完成。
下面是 Cocos Creator 中收发消息的方法:
cc.Class({
extends: cc.Component,
onLoad: function () {
this.node.on('hello-foobar', function ( event ) {
event.stopPropagation();
console.log('Hello Foobar');
});
},
start: function () {
this.node.emit('hello-foobar');
},
})