COCOS学习笔记

542 阅读3分钟

| COCOS开发指南(参考)

cocos游戏开发指南

| 向量和标量

控制移动是改变x和z

标量:只有大小的量
向量:有大小有方向
向量的模:即向量的大小

image.png 向量运算
加法
(x1,y1) + (x2,y2) = (x1 + x2, y1 + y2)
减法
(x1,y1) - (x2,y2) = (x1 - x2, y1 - y2)
乘法
(x1,y1) * 2 = (2x1,2y1)
会获得一个向前的一个效果

点乘:获得两个向量的夹角
(x1,y1) + (x2,y2) = x1x2 + y1y2 = n = cos角度

| 脚本解析

脚本基础指南
docs.cocos.com/creator/man…

| 属性

@property属性用于显示在编辑器上

image.png 不是js基本类型的话需要声明一下

// 基本类型不用声明  
@property text: string = 'hello';  
// 非基本类型要加括号声明  
@property(cc.label) label: cc.label = null;

| 生命周期函数

目前提供给开发者的生命周期回调函数主要有(按生命周期触发先后排列):

  • onLoad 可以获取到场景中的其他节点,以及节点关联的资源数据, 初始化调用
  • onEnable
  • start 初始化调用,比onload慢一步
  • update(dt) 每一帧都调用,参数:每帧间隔时间
  • lateUpdate update后的收尾工作
  • onDisable
  • onDestroy 销毁调用

| 获取结点属性

每个结点指的是当前绑定脚本的结点
结点包含这些属性
及其组件

子结点操作

// 创建 
new cc.Node('结点名称') 
// 获取子结点 
this.node.children[n] this.node.getChildByName("结点名称")  
// 移除子结点 
this.node.removeAllChildren())  

// 获取其他目录的结点 
// 比如要获取Canvas下的Main Camera 
cc.find("Canvas/Main Camera")  

父结点操作

// 获取 
this.node.getParent()  
// 设置 
this.node.setParent(某个结点)  
// 移除父结点 
this.node.removeFromParent();

结点属性操作

// 位置访问 
this.node.x this.node.y this.node.z

// 位置设置 
this.node.setPosition(x, y, z);
this.node.setPosition(cc.V3(x,y,z)) // V3指三维向量, V2指二维 

// 旋转 
this.node.rotation 
// 缩放 
this.node.scale 
// 锚点 
this.node.anchorX 
// 关闭结点 
this.node.active = false  

更多结点操作参考官方文档 docs.cocos.com/creator/3.5…

获取结点内其他组件

// 单个 
this.getComponent(cc.MeshRenderer) 
// 多个 
this.getComponents(cc.MeshRenderer)  // [] 
// 获取组件的子组件 
this.getComponentInChildren(cc.MeshRenderer)

| 预设体

可以理解为把设置好的东西设置为模板
Prefab的用途:为了重复利用

www.bilibili.com/video/BV14i…

  1. 多人开发应该尽量使用动态加载复制预制体来减少冲突
  2. 如何动态拿到预制体
onClickLoadLogin() {
        // 预制体存放位置:resources/test_assets/login
        resources.load("test_assets/login", Prefab, (err, prefab) => {
            const newNode = instantiate(prefab);
            this.node.addChild(newNode);
        });
    }

| 资源动态加载

docs.cocos.com/creator/man…
在assets中创建resources文件夹
在脚本中加载资源

| 旋转欧拉角

什么是欧拉角

| WebSocket

webScoket h5 通信
socket.io插件 对scoket进一步封装实现更多功能

1.安装scoket.ico
npm i -g socket.io

2.如何发起websocket

服务端代码(node)

const app = require('express')();
const http = require('http').Server(app);
const io = require('socket.io')(http, {
  cors: {
    origin: 'http://localhost:7456',
    credentials: true
  },
  allowEIO3: true
});
global.count = 0


// 监听是否连接
http.listen(3000, function () {
  console.log('服务监听3000端口');
  console.log('global.count', global.count)
});

// 监听客户端连接
io.on('connection', function (socket) {
  console.warn('有客户端连接了');

  socket.on('message', function (data) {
    console.log(`客户端发来信息:${global.count}` + data);
  });

  socket.on('GameInfo', function (data) {
    socket.emit('GameInfoRes', data);
    console.log('global.count', global.count)
    global.count++;

  });

  // 回应客户端信息
  //   socket.emit('response', '你好呀,客户端');
});
 

执行node 服务端.js 启动服务器

客户端
1.引入socket源码 socket.io

2.声明socket
socket.io.d.ts

declare var io : {
    connect(url: string): Socket;
};
interface Socket {
    on(event: string, callback: (data: any) => void );
    emit(event: string, data: any);
}

3.cocos创建一个ts脚本,并挂载到某一个组件
SocketTest.ts

import { _decorator, Component, Node } from 'cc';
const { ccclass, property } = _decorator;


@ccclass('SocketTest')
export class SocketTest extends Component {
  public static socket: Socket = null;
  start() {
    console.log('socket 连接...');

    SocketTest.socket = io.connect('ws://localhost:3000');
    SocketTest.socket.on('connect', data => {
      console.log('连接成功回调', data, SocketTest.socket);
      // 给服务端发送信息
      SocketTest.socket?.emit('message', '我是客户端发来的信息');

      SocketTest.socket.on('response', data => {
        console.log('服务器回应response:', data);
      });
    });
  }

  update(deltaTime: number) {}
}

目录结构

image.png

Tips:
注册事件on
触发事件emit
服务器可以通过on注册事件来获取客户端emit的数据
同理,客户端也可以通过注册事件来获取服务器emit的数据

socket.emit/on : 当前用户事件触发
广播事件
blog.csdn.net/fd214333890…

| 参考资料

Cocos Creator中的预制体Prefab
Cocos