Unity 开发者入门 Cocos Creator 快速指南

随着游戏平台和渠道的种类越来越多,开发者希望自己的游戏能够一次编写多次发布到不同的平台和渠道,而 Cocos Creator 恰好是很好的满足这一需求。

本文将从一个 Unity 开发者的视角,从以下角度对比,帮助 Unity 开发者迅速上手 Cocos Creator引擎。

  • 安装和版本管理
  • 编辑器
  • 资源工作流
  • 脚本以及调试
  • 着色器

安装和版本管理

Unity Hub 可以使用来管理 Unity 的编辑器版本、项目以及各种模板。在 Cocos Creator 中,同样您也可以通过 Cocos Dash Board 来管理引擎,项目以及模板。

Unity HubCocos Dashboard
unity-hubcocos-dash-board

同样您也可以在 Store 分页中找到大量可供使用的插件、资源和源码,以及在 Learn 分页中找到更多可供学习的素材。

编辑器

作为一个 Unity 开发者,在绝大多数的情况下您可以无缝使用 Cocos Creator 的编辑器,他们拥有接近的编辑器布局以及使用方式。

Unity EditorCocos Creator Editor
overviewoverview

略有不同的地方在于, Cocos Creator 由于使用 Electronic+Chromium 开发,您既可以通过浏览器预览游戏,也可以直接在编辑器内运行游戏。

工作流

Cocos Creator 的 2D 和 3D 工作流与 Unity 类似,您可以阅读 场景制作工作流程 来查看 Cocos Creator 的工作流。

贴图资源

贴图资源的导入和 Unity 类似。

UnityCocos
Unity 开发者快速入门指南 - 图5Unity 开发者快速入门指南 - 图6

也可以在项目设置中配置全局纹理压缩

cocos-texture-compress.png

模型和动画

在 Cocos Creator 中导入 FBX 和 Unity 是一样的,将文件拖拽或者复制到工程的 Assets 目录下即可。

UnityCocos
Unity 开发者快速入门指南 - 图8Unity 开发者快速入门指南 - 图9

同时 Cocos Creator 也支持 glTF 格式的文件,以及 Maya、3DMax 等 DCC 工具的标准材质。

Spine 骨骼动画

Cocos Creator 内置了 Spine 动画组件,您可以直接通过 spine.Skeleton 组件来使用他。

动画和状态机

Cocos Creator 支持关键帧动画、骨骼动画。您可以直接在编辑器内编辑和预览这些动画。

cocos-keyframe-anim.png

和 Unity 的 Animator 类似,Cocos Creator 也支持动画状态机的编辑,您可以在 Marionette 动画系统 中找到他们。

./index/cocos-anim-graph.png

音乐和音效

Cocos Creator 同样支持 Audio Source 组件用于播放音乐和音效。

cocos-audio-source.png

资源包

和 Unity 类似,Cocos Creator 也支持从外界导入资源包的方式进行合作开发。

UnityCocos
Unity 开发者快速入门指南 - 图13Unity 开发者快速入门指南 - 图14

发布和构建

除了和 Unity 一样发布在各种原生平台外,Cocos Creator 也支持发布在如微信小游戏、抖音小游戏等小游戏平台。

UnityCocos
Unity 开发者快速入门指南 - 图15Unity 开发者快速入门指南 - 图16

脚本编程和调试

和 Unity 的 GameObject 不同,在 Cocos Creator 中,场景中的实体被命名为 Node,但是和 Unity 类似的是 Cocos Creator 也是 ECS(Entity-Component-System) 架构,您也可以通过给 Node 添加不同的组件来实现游戏的功能。

cocos-add-component.png

组件的生命周期

和 Unity 类似, Cocos Creator 的组件也有自己的生命周期,系统将通过回调组件内已注册的方法,方便开发者处理业务逻辑。

组件生命周期

自定义组件的编写

在 Unity 中,我们继承 Monobehavior 来实现我们自己的游戏脚本。

  1. public class Player : NetworkBehaviour
  2. {
  3. Animation _animation;
  4. Start(){
  5. _animation = gameObject.GetComponent<Animation>();
  6. }
  7. }

Cocos Creator 使用 Typescript 来编写脚本。

下面的例子演示了如何使用 Typescript 实现自定义组件。

  1. @ccclass('MotionController')
  2. export class MotionController extends Component {
  3. animation: SkeletalAnimation;
  4. start() {
  5. this.animation = this.getComponent(SkeletalAnimation);
  6. }
  7. }

C# 和 Typescript 都是微软开发的编程语言,其易用程度是类似的。

调试和日志

日志调试

Unity中使用日志我们可以使用 Debug.Log 的方法。

在 Cocos Creator 中使用日志,既可以使用 js 的日志打印 console.log(),也可使用 Cocos Creator 的日志方法:

  1. cc.log()
  2. cc.debug()
  3. cc.error()

断点调试

Unity 可以使用 Visual Studio 或者 VSCode 进行断点调试。

Cocos Creator 使用 VSCode 或者直接在浏览器内通过开发者工具调试。

cocos-debug.png

材质以及着色器编写

材质

Cocos Creator 的材质和 Unity 材质拥有类似的预览和属性面板。

UnityCocos
Unity 开发者快速入门指南 - 图20Unity 开发者快速入门指南 - 图21

和 Unity 不同的地方在于 Cocos Creator 在材质中可以比较方便的查看和定义管线中的渲染状态。

cocos-pipeline-state.png

着色器

和 Unity 支持 CG、GLSL 以及 HLSL 不同,Cocos Creator 仅支持 GLSL 作为着色器编程语言。

下面的表格对比了他们所使用的文件格式以及 DSL 的区别。

UnityCocos
文件格式.shader.effect
DSLCg/HLSL/GLSL + Unity Shader FormatGLSL + Yaml

Unity 采用自定义的 shader 文件来作为 DSL, 而 Cocos creator 使用的是 Yaml 作为 DSL 的文件格式。

着色器语法规则

Unity Shader 语法规则

  1. Shader "Transparent/Cutout/DiffuseDoubleside" {
  2. Properties {
  3. _Color ("Main Color", Color) = (1,1,1,1)
  4. _MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
  5. _Cutoff ("Alpha cutoff", Range(0,1)) = 0.5
  6. }
  7. SubShader {
  8. Tags {"IgnoreProjector"="True" "RenderType"="TransparentCutout"}
  9. LOD 200
  10. Cull Off
  11. CGPROGRAM
  12. #pragma surface surf Lambert alphatest:_Cutoff
  13. sampler2D _MainTex;
  14. float4 _Color;
  15. struct Input {
  16. float2 uv_MainTex;
  17. };
  18. void surf (Input IN, inout SurfaceOutput o) {
  19. half4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
  20. o.Albedo = c.rgb;
  21. o.Alpha = c.a;
  22. }
  23. ENDCG
  24. }
  25. Fallback "Transparent/Cutout/VertexLit"
  26. }

Cocos creator effect 语法规则

  1. // Effect Syntax Guide: https://github.com/cocos-creator/docs-3d/blob/master/zh/material-system/effect-syntax.md
  2. CCEffect %{
  3. techniques:
  4. - name: opaque
  5. passes:
  6. - vert: general-vs:vert # builtin header
  7. frag: unlit-fs:frag
  8. properties: &props
  9. mainTexture: { value: white }
  10. mainColor: { value: [1, 1, 1, 1], editor: { type: color } }
  11. - name: transparent
  12. passes:
  13. - vert: general-vs:vert # builtin header
  14. frag: unlit-fs:frag
  15. blendState:
  16. targets:
  17. - blend: true
  18. blendSrc: src_alpha
  19. blendDst: one_minus_src_alpha
  20. blendSrcAlpha: src_alpha
  21. blendDstAlpha: one_minus_src_alpha
  22. properties: *props
  23. }%
  24. CCProgram unlit-fs %{`
  25. precision highp float;
  26. #include <output>
  27. #include <cc-fog-fs>
  28. in vec2 v_uv;
  29. uniform sampler2D mainTexture;
  30. uniform Constant {
  31. vec4 mainColor;
  32. };
  33. vec4 frag () {
  34. vec4 col = mainColor * texture(mainTexture, v_uv);
  35. CC_APPLY_FOG(col);
  36. return CCFragOutput(col);
  37. }
  38. }%

着色器语法对比

本小节将对比 Unity Shader 和 Cocos Effect 的文件结构。

结构对比

定义Shader对象

  • Unity shader:

    1. Shader "<name>"
    2. {
    3. <optional: Material properties>
    4. <One or more SubShader definitions>
    5. <optional: custom editor>
    6. <optional: fallback>
    7. }
  • Cocos Shader:

    1. CCEffect %{
    2. <techniques>
    3. <passes>
    4. <techniques>
    5. <passes>
    6. <shader program>
    7. }

Pass 结构

  • Unity Shader:

    1. SubShader{
    2. <optional>Tag {}
    3. <optionall> Pass
    4. }

    Pass:

    1. Pass{
    2. <name>
    3. <tag>
    4. <code>
    5. }
  • CocosCreator Shader:

    1. CCProgram <name> %{
    2. <in parameters>
    3. <out parameters>
    4. <uniforms>
    5. function vert();
    6. function frag();
    7. }%