0%

生活

广州的四月并不平静,继上海和深圳之后,广州的疫情局势也紧张了起来。更要命的是,就在广州疫情刚开始之际,微信里广泛流传着一篇《求救》的文章,讲述了上海人缺粮的问题,于是恐慌的情绪开始蔓延开来。

其实我也受到了这篇文章的影响,看到文章的那晚回家路上,去超市买了一包米和一些面,第二天早上去农贸市场买了一些肉和蔬菜,思路是保证一个月的主食和半个月左右的鲜肉蔬菜,另外还让家里寄了一些可以放的冻品,这还是在完全得不到任何补给下的规划……

看到市场大家疯狂地抢菜,深深地感受到,比起疫情,那种全民的恐慌更加地可怕。可能是因为,当代人从来没有经历过饥荒,也不敢去想象那种日子。

工作

配置表框架

工作上,今年一开年先整理了一下配置表框架XConfig,这是我一直在用的商用框架。

File

但是说实话,当前的框架还有一些需要改进的地方:

  • csv还是excel?

csv的优势是更好地进行版本回溯以及冲突处理,借助svn diff或者beyond compare的工具可以比较好地查看版本差异。但是缺点也非常明显,csv毕竟是纯数据,虽然用excel工具可以打开,但是实际上很多excel的特色功能并不能使用,比如公式,又比如excel的输入限制等。excel则反之,特色功能丰富,版本控制蛋疼。

  • 自定义类型的配置方式

当前采用的是 # 号来分割字段,但这种方式其实比较呆板,并且阅读不方便,后续会考虑替换成{id=1001,count=10}这种方式。

图形学

图形学一直是我缺失比较多的一块,在完成配置表框架初版后就开始进行定点爆破,也开始有了一点小成效。

我觉得图形学的学习的特点是:学习曲线陡。入门需要对渲染管线和线性代数有基础的了解,但也并非不可逾越。我不是很喜欢网上把图形学妖魔化的做法,这无疑给了初学者一些心理压力。对于大多数初学者来说图形学的入门需要通俗易懂的教程。

建议一定要看闫令琪老师的教程,一是视频教程比较容易看得下去,视频本身也相对通俗易懂,另外这个教程的重点是图形学的基础,而不是各种图形API,这对初学者打好基础很有帮助。

这本不用多说了,Unity Shader入学者基本人手一本,更偏向于Unity的实操层面。

这个和入门精要有点像,但是更加地循序渐进一些,他会很细心地向你展示一个shader的演进过程,教学方法经常是 添加Shader的基本框架 -> 想要加什么功能 -> 添加功能 -> 当前的实现还存在什么问题 -> 修复还存在的问题 -> 有哪些实现是Unity已经帮你封装好的 -> 替换成Unity的内置方法,相比一上来就给你整个Shader对着讲解,他对初学者很友好。但是他是全英版本,不想看英文的可以看知乎上的中文版本

结语

戒骄戒躁,享受过程~

最近把项目的资源层换成了xasset团队版,有收获,也有低于预期的地方,下面我会把他的核心功能一一列举,并详细描述体验和遇到的问题。总的来说瑕不掩瑜,作为一个3000块的产品,还是值得的,产品确实有打磨过的痕迹,代码多次精简之后,阅读性和可维护性较强。下面我重点写他的使用体验,操作层面直接看文档或者看源码即可。文章比较长,但包含了实战过程中的经验,希望大家看完应该可以避开一些坑。

阅读全文 »

最近一段时间在项目上新增了大地图的分块加载的机制,踩了很多坑,记录一下经历,分享之余,也希望能和大家共同探讨优化的方向。

目的

项目的框架用的是上一个项目的小地图实时竞技的框架,面对新项目的中等偏大的地图存在明显得不适应,包括loading过慢,运行时帧数过低等各种问题,需要引入新的地图加载策略来改善加载与运行时效率的问题。

阅读全文 »

前言

只有牢固的基础才能攀登更高的山峰。

定律

牛顿运动定律

  1. 每个物体都保持静止或者匀速直线运动的状态,除非有外力作用于它迫使它改变状态。

  2. 运动的变化正比于外力,变化的方向沿外力作用的直线方向。

  3. 每一个作用都有一个相等的反作用,两个物体的相互作用总是相等的。

基本概念

  • 右手坐标系

    二维的坐标系统中,逆时针旋转为正方向

通用符号

物理量 符号 量纲
线性加速度 A L/T^2^
单元格 单元格 单元格

公式

$F = ma$

图片名称

前言

问题的起因是项目中物理引擎的效果和运行时不一致,出现了一些虚空阻挡,或者碰撞效果异常,最后查到是对Collider组件中center等参数理解有偏差,部分参数的配置需要叠加GameObject的rotation和scale的效果才是最终的结果

详解

由于物理引擎用的是Bullet,以BoxCollider为例,

BoxCollider

Bullet底层只认transform和boxHalfExtents(boxHalfExtents为size的一半),并没有center的概念,所以需要把center叠加到position上,以及把size换算为boxHalfExtents后传递给Bullet。

这里有个需要注意的点是,center和size都是给予BoxCollider所在的GameObject的局部设置,所以center和size的换算需要叠加GameObject的rotation以及scale,代码如下。

1
2
3
4
5
6
/// <summary>
/// transform.position叠加了center后的世界坐标
/// </summary>
public Vector3 worldPosition => transform.position + Vector3.Scale(transform.rotation * center, transform.lossyScale);

public Vector3 boxHalfExtents => Vector3.Scale(transform.rotation * size / 2, transform.lossyScale);

Why

为什么要引入物理引擎?

常见的需求是网络同步

当下通用的网络同步方案有帧同步状态同步。状态同步自然是要在服务器跑物理,帧同步本来可以只跑客户端,服务器只负责转发命令(事实上我们上一个帧同步游戏也是这么做的),但是存在两个问题,一是不同平台存在不同步的可能,因为引擎的物理引擎存在浮点运算,不同平台可能运算结果不一致(这个问题我们使用了截断三位小数后面的方法,不同步出现的概率大大地降低了);二是只跑客户端无法较好地做校验或者防作弊。

阅读全文 »

Trigger的特点

众所周知,Animator的Trigger和Bool的区别是,Trigger是一次性触发判断,触发后会自动重置,而Bool是持久性变量,所以使用Trigger图的就是自动重置的功能。

阅读全文 »

Why

写这样一个文档是因为电脑总会因为某些问题而面临重新安装开发环境,包括但不限于

  • 购置新机器
  • 重装系统

有些所以需要记录下重装所需安装的软件和环境的设置。

记录的内容主要是网址,部分没有官网的会以网盘的方式分享。考虑过都保存软件,但是可能会导致安装后的二次更新问题,维护成本也是个问题,所以还是选择网址。

以下的记录只针对windows。另外我在想,是不是可以做个脚本一键装机?文章将持续更新

阅读全文 »