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)
组件实例-->所在节点-->又在场景树里面