欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

creator 3d组件化开发

程序员文章站 2022-03-26 17:23:02
...

1)笔记

1)import {Node} from "cc";
  Node相当于cc.Node

2)装饰器:给编辑器装载脚本代码的时候读的;
  ccclass:指定一个类是组件类,让编辑器识别当做一个组件类;
     @ccclass
     不添加,苏日安是组件类,但是编辑器识别不到   

   新建的会去掉下划线,自己还原即可

  property: 指定一个变量为数据成员,编辑器读到这个装饰器,会把这个数据成员作为属性绑定到编辑器;

3)export:导出类

  import {game_mgr} from "./game_mgr";

4)new组件类的实例添加到节点;
  (1)编辑器添加
  	new组件类的实例: 点击 “添加组件”按钮-->

  	代码组件类可以添加到任意的节点上,让组件的代码高度复用;

  	一个节点上面可以有多个组件实例,只要你走得通;

  	Node{组件实例1 组件实例2...}

  (2)代码添加

5)游戏引擎如何调用我们的代码入口的:
  (1)在NB的程序员,写的代码要被调用才可以;

  (2)游戏引擎规定:
    游戏引擎运行的时候-->游戏场景被装载-->找到每个节点-->找到节点上的每个组件实例;

    拿到组件实例后-->可以调用组件实例的成员方法;

    规定: 
      第一次运行之前的时候,组件加载到节点上的时候,场景被初始化的时候,
      	首先会遍历每一个组件实例,调用所有组件实例的onLoad方法一遍;

      正式运行之前,下一个帧的时候,遍历每个组件实例,调用组件实例的onStart;

      2个初始化入口: onLoad(先调用),  onStart(后调用), 问题来了:为什么要做2个这样的初始化入口?
        因为我们的组件实例A要调用另外一个组件实例B的初始化数据;
        B.onLoad{初始化数据}   A.start{使用这个数据}

      start的调用,一定其它的组件实例的onLoad已经被调用了

    初始化加载场景节点的时候:
      节点闪鼓组件实例:onLoad,会被调用
      下一帧的时候,开始运行之前,组件实例的start一定会被调用;

    我们的游戏引擎是: 每隔一段时间刷新一下画面:
       |---|---|---|
       这样我们就能做出来动画:A 100的速度往前走,每隔一段时间,刷新一下画面,
       为了流畅,人眼认为动画流畅,60FPS左右,高于60fps,理论更流畅,但是人眼感觉不出来,
         比如280fps,造成cpu浪费-->游戏一般维持在60fps

         280fps的能力,cpu可以休息下,我们不让它刷新;

         不到60fps,如:30fps,拼命的刷新;

         找到节点,找到组件实例,调用组件的update,参数dt是:当前update距离上次刷新到
            现在这次刷新需要的时间;

 			60fps: 1/60-->0.016

 			30fps: 1/30-->0.032

            我们可以根据时间来迭代游戏的变化 
              v*t 迭代次数少,但是t长。迭代次数多,t短 总体1s看来,一样;

6)onLoad 3次(onLoad被调用完毕后,才会接着调用start)
  start 3次

7)渐行渐远:
  let s: number = 5 * deltaTime;
  this.node.translate(cc.v3(0, 0, -s));

8)总结:
  组件加载到节点时候,onLoad

  第一次update之前,组件实例.start,都可以做初始化入口

  每次刷新的时候:组件实例.update

9)
this: 组件实例
this.node: 组件实例所在的节点。 
node: 是Component的一个成员,组件实例和节点映射好了

节点:保存了组件实例. 每个组件实例-->node-->所在节点

10)@property来添加基本数据成员 boolean,number

绑定一个复杂的数据类型:
  @property(Node)
  private test_node: Node = null;

  @property([Node])
  private test_array: Array<Node> = null;

  普通数据类型:  定义成员: 权限 名字:类型=默认值 @property

  cocos类型: @property(类型)

  数组:  @property([类型])


@property
    private is_debug: boolean = false;

    @property
    private speed: number = 100;

    @property(Node)
    private test_node: Node = null;

    @property([Node])
    private test_array: Array<Node> = [];

11)游戏场景树的布局:

                       n1

n2(组件实例1 组件实例2)    n3(组件实例1 组件实例2)


组件实例-->所在节点-->又在场景树里面