用cocos creator实现《我的世界》

news2024/11/26 18:25:44

摘要

《我的世界》是一款非常流行的游戏,不过网上大多都是用unity还原实现的。那么用cocos实现一版,会是怎样的开发体验呢?

使用版本

使用最新的cocos creator 3.6.2版本

目前主要功能

  • 生成地形
  • 方块创建与销毁
  • 角色移动、碰撞、重力和简单动画
  • 地形延展
  • 快捷物品栏

预览视频

用cocos creator 3.6.2开发我的世界

生成地形

基础概念

块:最小的地形单元,尺寸为1X1X1

面:构成块的元素,1个块最多有6个面,最少可以一个不拥有。

区块:尺寸为16X16X100 。由块组成。在各象限依次排开。

地形随机

地形随机生成使用的是2维柏林噪声函数。

输入x和z坐标,获得y坐标作为地表高度,然后从设定的最低高度到地表高度创建填充块。

目前简单的设定小于0为水,等于0为沙。其余为泥土草。最底层铺上石头。

中间填充泥土。

在这里插入图片描述

随机洞穴

洞穴随机使用的是3维柏林噪声。

输入x,y,z坐标,如果超过设定阈值,并且在地表之下,在底层之上,则判断为空气块。如果是空气块就不需要再填充泥土块了。自然就有了基础的洞穴(没有矿的洞穴…)
在这里插入图片描述
在这里插入图片描述

随机杂草和树

随机杂草和树直接用的纯随机。当2维柏林噪音对每个坐标处理后。就进行杂草和树的随机判断。还是设定的一个阈值,超过则随机杂草或者树。树是由许多块组成的固定形状。

地形网格生成

上面的内容都是生成的虚拟的对象。在场景中渲染的块我前后使用了两种方法。

1是系统默认块+instancing

使用setInstancedAttribute函数来区分不同的块。

其实效果还挺不错的。缺点就是实例和面很多。

2是用动态网格,也是现在的做法。

这个应该是3.6的新增功能。正好用上试试。

对每个区块创建一个动态网格。

这个的目前还没处理好更新,每次增删块都是整个区块重新构建网格数据。所以每次刷新附近的区块的时候,就会卡顿。

使用动态网格可以进行面优化。只创建没有相邻的面。但是进行面优化,也要遍历所有块,目前还未达到性能最优。。
还配置了每种块的每个面的UV值,用于显示不同的纹理。

一个性能优化

方块很多,每个方块是一个类,在类里没有用到vec3类来表示坐标,用的是数字。这样占用的内存会少很多。

方块创建与销毁

如果是用的默认块,创建和销毁显得就很简单粗暴了。这个刚开始开发还挺快的。

但是转到动态网格后,就要每次进行数据重构。对整个动态网格的数据基于虚拟数据重新构造一遍。

方块的选中

这里简单使用了一下八叉树来管理附近的块。使用射线AABB相交检测判断鼠标聚焦的是哪个块。

然后需要额外知道是聚焦的哪个面。刚开是用的6个AABB来判断,后来发现内置的检测函数里其实已经计算了到备选面的距离,复制过来,找到最小距离的就是当前面了。

选中框

选中框前后使用了4种方法。

1是使用摄像机的几何渲染。

这个的缺点是无法完全遮挡。被遮挡的边会半透显示。

官方也说了,用来测试的,也不想改源码,所以就算了。

在这里插入图片描述

2是使用shader

判断UV是否在边缘范围,如果是则显示边框颜色。

这个的缺点就是靠近后,比较粗,远了比较细。效果不是很美丽。也没有找到更好的办法。

继而放弃。可以看到,远处的很细,快要没了。
在这里插入图片描述

3是使用cube的Primitive线条描边

因为默认的cube的顶点顺序是左下、右下、左上、右上,所以如果用line_list或者loop无法形成一个完整的框。
在这里插入图片描述

4是使用的静态网格,也是目前的做法

这个就可以按照自己的想法设置顶点顺序了。改成左下、右下、右上、左上。然后我觉得我的世界里每次都框住一个块没有只框住聚焦的面来的好。所以最后只创建了4个顶点的边框了。使用line渲染模式,也能满足远处不会变细。

方块的纹理

本来是想直接找我的世界的纹理贴图的。不过限于能力不足,始终寻不到合适的。所以一狠心,直接ps开干。使用ps的像素化,可以很方便的生成类似的纹理。

在这里插入图片描述

将所有纹理放在一张512的图里,可以一起用。

破坏粒子

在破坏一个方块的时候,在其位置播放一个粒子动效。用的是mesh粒子,引擎自带的cube。
设置为重力模式,使用曲线来控制重力先小后大,让生成的粒子多待一会儿再下落。
然后就是自定义粒子材质,基于当前销毁的方块属性来设置材质的offset 。贴图使用的是和其它方块同一个。

角色移动、碰撞、重力和简单动画

这部分花的时间最长,但是效果也一直没做好。T_T

角色移动

方向键按下则记录移动方向,松开则重置方向。在update里基于移动方向进行移动。

node的translate方法,第二个参数传0是本地坐标系,传1是世界坐标系。我用的世界坐标系,需要对位移矢量进行按照y轴旋转。

角色碰撞

利用八叉树检测附近块,然后用圆和多边形相交检测是否碰撞。如果碰撞则沿着移动矢量反方向移动。营造挡住的效果。

角色重力

利用物理公式vt+0.5vtt来进行角色垂直方向的位移。然后同样利用碰撞原理,检测是否有碰撞。如果碰撞则置重力加速度为0,速度为0 。直到没有碰撞,恢复加速度。

因为是先水平碰撞矫正,所以执行重力位移后,如果有碰撞,肯定是嵌到土里了。可以进行矫正。

跳的时候,设置速度为一个正值,则可以实现跳跃。

现在的效果只是满足了基本的位移,碰撞和重力,比如在方块前跳的感觉,连跳的感觉都还不到位。碰撞太狠了,经常动不了。都是需要后续优化。

简单动画

角色在不做动作的时候,会有呼吸,就是手上下移动。在跑的时候,会有摄像机的晃动。在删除方块和添加方块的时候,会有手的动作。这些都比较简单。

地形延展

因为使用的是柏林噪音,所以只要有了区块的坐标,就可以随机出自然的,连续的地形。

这部分是目前性能最吃紧的地方。只要判断到了别的区块,就会查找附近的25个区块。然后创建新的区块并且替换旧区块到新区块的网格。这部分现在需要500ms的时间,非常卡顿。暂时用异步的方法缓解了一部分。然后加了雾,感觉提升了些。

并且到了新区块,还要创建新的八叉树。也会有一定消耗。

地形延展是目前最不满意的地方,近期应该会着重关注并优化。

卡顿主要是消耗在了八叉树的创建。之前是对基于中心区块的附近25个区块整体进行八叉树构建,所以每次到新的区块,都会有非常多的重复构建浪费,现在将八叉树构建限制到每个区块,在查询之前,先对区块进行一遍筛选,再对区块的八叉树进行查询,性能提升非常多。

快捷物品栏

这是属于UI的部分,难度不大。

监听键盘事件,然后切换单元格的状态。在需要的时候,调用推入物品和使用物品的接口来更新状态。还有和手的状态联动,因为在切换单元格的时候,如果单元格里有物品,则需要将手替换成物品模型。

难度在于绘制物品ICON。所以现在只有3个方块有ICON。

结语

核心技能包括八叉树查询用于场景管理,射线检测用于碰撞和交互,柏林函数用于地形随机,动态网格用于地形显示。后续需进行场景性能优化,增加资源、NPC、存档、红石等等等等内容。对于长期学习,还是非常不错的项目。

主要参考链接

麒麟子3.6渲染篇,动态模型部分
https://forum.cocos.org/t/topic/138915
bilibli goldeneggs 体素沙盒游戏
https://www.bilibili.com/read/cv17097421
知乎 Lost Lord关于unity实现我的世界的系列文章
https://www.zhihu.com/people/lost-lord-58

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/90145.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java-MySQL-SQL函数

SQL函数 函数介绍 函数是 SQL 的一个非常强有力的特性,函数能够用于下面的目的: ● 执行数据计算 ● 修改单个数据项 ● 操纵输出进行行分组 ● 格式化显示的日期和数字 ● 转换列数据类型 SQL 函数有输入参数,并且总有一个返回值。 …

【云原生系列CKA备考】Kubernetes架构

目录前言一、Kubernetes架构1.1Master节点1.2 Node节点1.3 Add-ons1.3 Kubeadm二、相关命令2.1 查看组件运行状态2.2 kubeadm容器化组件三、总结前言 ​ OpenStack是管理虚拟机的,底层依靠虚拟化技术;kubernetes是管理容器的,底层也是依靠虚…

juery笔记

文章目录Jquery一、什么是 jQuery二、如何使用 jQuery三、如何选择 jQuery 版本四、jQuery 的运行原理实例方法1、一般通过一个字符串来标识匹配的元素2、支持多个选择器任意组合使用3、jQuery 特有的选择器,当然也可以和其他选择器任意组合使用4、元素筛选&#xf…

基于OpenGL的地形建模技术的研究与实现

毕业论文 基于OpenGL的地形建模技术的研究与实现 诚信声明 本人郑重声明:本设计(论文)及其研究工作是本人在指导教师的指导下独立完成的,在完成设计(论文)时所利用的一切资料均已在参考文献中列出。 本人…

代码随想录训练营第50天|LeetCode 123.买卖股票的最佳时机III、188.买卖股票的最佳时机IV

参考 代码随想录 题目一:LeetCode 123.买卖股票的最佳时机III 确定dp数组下标及其含义 某一天最多存在5个状态: j 0:没有操作j 1:第一次买入j 2:第一次卖出j 3:第二次买入j 4:第二次卖出…

[附源码]Python计算机毕业设计SSM基于JAVA线上订餐系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

安卓电子名片管理器的设计与实现

毕业设计 安卓电子名片管理器的设计与实现 诚信申明 本人郑重声明:本设计(论文)及其研究工作是本人在指导教师的指导下独立完成的,在完成设计(论文)时所利用的一切资料均已在参考文献中列出。 本人签名&…

789. 数的范围

目录 题目:​编辑 题目思路: 解释: 方法: 对于k值所在左边界: 对于k值所在右边界: 代码详解: 题目: 链接:789. 数的范围 - AcWing题库https://www.acwing.com/prob…

【在SpringBoot项目中执行修改相册数据--MSC层】

目录 1. 编辑相册--执行修改--Mapper层 2. 编辑相册--执行修改--Service层 3. 编辑相册--执行修改--Controller层 1. 编辑相册--执行修改--Mapper层 执行修改相册使用已有的update()即可。 另外,还需要检查“提交修改的名称,是不是其它数据的名称”…

基于Pyqt5和PaddleOCR实现PDF转DOC

在上一篇文章《基于Pyqt5实现笔记本摄像头拍照及PaddleOCR测试》的基础上,继续做了个简单的扩展: 将PDF文档转换为DOC文档。 一、界面增加一个按钮,如下图: 二、源码修改 1、paddleocr.py文件直接拷贝 Github下载的源码PaddleO…

DBCO-PEG-Cholesterol,Cholesterol-PEG-DBCO,胆固醇-聚乙二醇-二苯并环辛炔

DBCO-PEG-Cholesterol属于高分子点击试剂,胆固醇PEG-DBCO是一种具有DBCO反应基团的亲脂性PEG衍生物。DBCO-PEG试剂在水缓冲液中具有快速动力学和稳定性,可用于标记具有高特异性和反应性的叠氮化物修饰的生物分子。 西安凯新生物科技有限公司​点击类化学…

写了个tooltip的切换动画,个人感觉比一些组件库的渐变动画好看

最近修改了个语言切换框的tooltip的切换动画&#xff0c;感觉比element-plus或者其他组件库的tooltip的切换动画好看一些&#xff0c;看起来比较灵动&#xff0c;下面将代码分享出来。 <!DOCTYPE html> <html lang"en"><head><meta charset&quo…

Linux内核调试技术之kprobes(1)基本原理与使用

概述 Linux kprobes技术是一种可以跟踪内核函数执行状态的轻量级内核调试技术&#xff0c;利用kprobes技术可以在运行的内核中动态的插入探测点&#xff0c;当内核运行到该探测点后可以执行用户预定义的回调函数&#xff0c;以收集所需的调试状态信息而基本不影响内核原有的执…

XXL-JOB详解(整合springboot)保姆级教程

文章目录XXL-JOB简介XXL-JOB是什么为什么需要任务调度平台&#xff0c;而不用传统的 Timer 与 Quartz为什么选择XXL-JOB&#xff0c;不选择elasticjob学习之前必看&#xff0c;少走很多弯路安装XXL-JOB一、源码编译&#xff08;Windows&#xff09;1、拉取源码&#xff1a;[xxl…

NR HARQ(二) CBG HARQ-ACK codebook

这篇开始看下HARQ-ACK codebook的相关内容&#xff0c;先看CBG-based HARQ-ACK codebook。那第一个关注点就是CBG 的划分规则&#xff0c;这部分内容主要在38.213 9.1.1章节中&#xff0c;PDSCH和PUSCH 的CBG 划分规则基本是一样的&#xff0c;这里以PDSCH为例介绍。 PDSCH 和P…

MyBatis-Plus之通用枚举

系列文章目录 Mybatis-PlusSpringBoot结合运用_心态还需努力呀的博客-CSDN博客MyBaits-Plus中TableField和TableId用法_心态还需努力呀的博客-CSDN博客 MyBatis-Plus分页查询&#xff08;快速上手运用&#xff09;_心态还需努力呀的博客-CSDN博客_mybatis plus分页查询 MyBa…

CyclicBarrier 多线程处理数据

文章目录前言需求环境准备单线程处理多线程处理总结前言 开发中&#xff0c;我们经常会遇到处理批量数据&#xff0c;最后把处理成功和失败的数据结果记录下来。普通方法一个循环就可以搞定这个需求&#xff0c;但是面临大量数据单个线程去处理可能面临很大的瓶颈&#xff0c;…

怎么进行视频配音?建议收藏这些配音方法

最近我的朋友向我求助&#xff0c;他想要自己制作一个视频&#xff0c;但是视频里面有些片段需要配音&#xff0c;可是他又不想用自己的声音来配音。一方面担心容易NG&#xff0c;需要录制很多遍&#xff0c;会浪费较多的时间&#xff1b;另一方面是&#xff0c;如果视频录制和…

​单张图像三维人脸重建必备入门face3d—3DMM

作者&#xff1a;小灰灰 来源&#xff1a;投稿 编辑&#xff1a;学姐 本次的例子是将pipeline生成的图片作用于3DMM&#xff0c;重新拟合成新的图片。 load model 3DMM的表达式&#xff1a; &#x1d446;̅ ∈ &#x1d445;3&#x1d45b;是平均人脸形状&#xff0c;&#x…

国产网关apisix安装

1、安装docker 参考&#xff1a;centos7安装docker_代码手艺人老羊的博客-CSDN博客 2、下载包&#xff08;从github&#xff09; # Download the Docker image of Apache APISIX git clone https://github.com/apache/apisix-docker.git 3、安装 # Switch the current di…