洞明 Unity ECS 基础概念
虽然网络上已经有不少 ECS 文档的汉化,但自己读官方文档的时候也会产生不少疑问,为此通过查询各种资料,写下本文。
本文从 ECS 官方文档出发,加之内存布局结构的讲解,力求读者能够和博主一起吃透 ECS 中的基本概念。同时建议读者可以先读读我的上一篇博文《Unity DOTS 走马观花》的 ECS 部分,本文不再复述前文已经提到过的相关概念。
ECS 与 Job System
我认为有必要重申其两者的关系。
Job System 能帮我们方便地写出线程安全的多线程代码,其中每个任务单元称为 Job。
ECS,又称实体组件系统。与传统的面向对象编程相比,ECS 是一种基于数据设计的编程模式。前文从内存结构分析了 OOP 模式的缺点,也提到了 ECS 是怎么样基于数据的设计内存结构的。
Job System 是 Unity 自带的库,而要使用 ECS 我们需要从 Package Manager 中安装 “Entities” 预览包。这两者虽说完全是两种东西,但是他们能很好地相辅相成:ECS 保证数据线性地排列在内存中,这样通过更高效的数据读取,能有效提升 Job 的执行速度,同时也给 ...
Unity DOTS 走马观花
简单介绍 Data-Oriented Technology Stack (DOTS, 数据导向型技术栈) ,其包含了 C# Job System、the Entity Component System (ECS) 和 Burst。
特点
DOTS 要实现的特点有:
**性能的准确性。**我们希望的效果是:如果循环因为某些原因无法向量化,它应该会出现编译器错误,而不是使代码运行速度慢 8 倍,并得到正确结果,完全不报错。
跨平台架构特性。我们编写的输入代码无论是面向 iOS 系统还是 Xbox,都应该是相同的。
我们应该有不错的迭代循环。在修改代码时,可以轻松查看为所有架构生成的机器代码。机器代码“查看器”应该很好地说明或解释所有机器指令的行为。
安全性。大多数游戏开发者不把安全性放在很高的优先级,但我们认为,解决 Unity 出现内存损坏问题是关键特性之一。在运行代码时应该有一个特别模式,如果读取或写入到内存界限外或取消引用 Null 时,它能够提供我们明确的错误信息。
其中向量化指的是 Vectorization。
向量化的相关介绍:
https://stackoverfl ...
属于 Unity 的 Flutter——UIWidgets
介绍
UIWidgets 是 Unity 的一个插件包,是一个从 Google 的移动 UI 框架 Flutter 演变过来的 UI 框架。
相对于原生开发的高开发成本(不同平台都需要不同的一套代码),Flutter、React-Native 等这种跨平台 UI 框架应运而生。
Flutter 自 2018 年 3 月发布以来,社区不断壮大。由于 Flutter 自身设计理念的出色,Unity 中国已经着手将其移植过来。当然了,也因为这两个东西都非常的年轻,因此开发的时候都像开荒一样。
框架图
Flutter 有自己的一套渲染系统,那么 Unity 作为一个游戏引擎,底层的图形 API 用自己的一套东西就行了,因此移植过来更方便了。
Flutter 框架结构
UIWidgets 框架结构
执行效率
这里提一些基础的知识:
Batch 就是 DrawCall 的另一种说法,了解渲染流水线的同学会知道流水线在 CPU 与 GPU 之间通信时,一般有三个步骤:
把数据加载到显存中。
设置渲染状态。
调用 Draw Call
Draw Call 就是一个调用命令,让 CPU 告诉 ...
不越狱在 iOS 12.113.3 设备安装 Kodi
2020 年 2 月 11 日更新另外一种方法
今天一不小心发现 Kodi 这个播放神器居然还有 iPad 版!
但是苹果 App Store 不允许 Kodi 应用商家,于是自己在网上找了些方法:
越狱(手动再见)
下载官方提供的安装包用 Xcode 打包进去(太麻烦)
国内同步助手等提供的“VIP 服务”,购买服务后,用它们提供企业证书来下载(吃相难看)
…
2020 年 2 月 11 日更新
最近又想装回 Kodi,但是 Tweakbox 自己用不了了,于是找了找发现了 AppCake。
AppCake 声称能在越狱和非越狱的手机上使用,直接在设备上给应用签名。
手机 Safari 打开 https://iphonecake.com/app/,点 Install。
安装描述文件
打开应用后应该还要再要你安装另一个描述文件用来给应用签名
Tweaked Tab 标签页中下载安装 Kodi!
介绍 Tweakbox
最终发现了国外一个不错的免费服务:Tweakbox,官方介绍也很令人振奋:
TweakBox is an app store where you can d ...
Unity 开源双端框架 ET 中初尝热更新技术
ET 框架简介
正所谓时势造英雄,在 Web 开发领域或者传统软件开发领域中,人们把经过千锤百炼的代码总结出一套开发框架,从而提高开发效率,让开发者能更专注于业务本身。对于游戏领域而言,不同游戏需求的东西也不一样:有的游戏对性能有着苛刻要求,有的游戏需要快速地迭代出来,有的游戏需要联网热更新等等。因此不同的游戏框架应运而生。
例如:
Game Framework 是一个基于 Unity 引擎的游戏框架,主要对游戏开发过程中常用模块进行了封装,很大程度地规范开发过程、加快开发速度并保证产品质量。
QFramework 一套渐进式的快速开发框架。框架内部积累了多个项目的在各个技术方向的解决方案。
Entitas 一套基于 C# 和 Unity 的实体组件系统。
Entities Unity 官方的实体组件系统实现,不过还是 Beta 版本,详细介绍可以查看官网。
StrangeIoC 一套基于 C# 和 Unity 的控制反转 (Inversion-of-Control) 框架。
今天介绍的是 ET 框架。
ET是一个开源的游戏客户端(基于unity3d)服务端双端框架,服务端是使用 ...
Unity 中用有限状态机来实现一个 AI
最近在阅读《游戏人工智能编程案例精粹(修订版)》,本文是书中第二章的一篇笔记。
有限状态机(英语:Finite-state machine, 缩写:FSM),是一个被数学家用来解决问题的严格形式化的设备,在游戏业中也常见有限状态机的身影。
对于游戏程序员来说,可以用下面这个定义来了解:
一个有限状态机是一个设备(device),或是一个设备模型(a model of a device)。具有有限数量的状态,它可以在任何给定的时间根据输入进行操作,是的从一个状态变换到另一个状态,或者是促使一个输出或者一种行为的发生。一个有限状态机在任何瞬间只能处在一种状态。
——《游戏人工智能编程案例精粹(修订版)》 Mat Buckland
有限状态机就是要把一个对象的行为分解成易于处理的“块”或者状态。拿某个开关来说,我们可以把它分成两个状态:开或关。其中开开关这个操作,就是一次状态转移,使开关的状态从“关”变换到“开”,反之亦然。
拿游戏来举例,一个 FPS 游戏中的敌人 AI 状态可以分成:巡逻、侦查(听到了玩家)、追逐(玩家出现在 AI 视野)、攻击(玩家进入 AI 攻击范围)、死亡等, ...
2D 像素风平台游戏 Aretha’s Journey
继《我设计的第一个桌游》后,这次带来的是电子游戏的作业—— 2D像素平台游戏 Aretha’s Journey。
游戏背景
来自潘达尼亚的女孩 Aretha 已经离乡别井几年了,回乡之际,发现族人们都被神所诅咒而变成了石头,原因是他们的族人曾尝试反抗神。于是 Aretha 便踏上拯救家园之路…
游戏截图
美术风格采用了像素风,游戏一共有五关,第一关为教学关,第五关为 Boss 战,截图如下:
游戏介绍
游戏类型是常见的平台游戏。主角可以收集金币,去商人那购买"遗物"(Relic),遗物可以看做是一种装备,穿上能提供一些特殊增益,例如增加血上限、打怪吸血等。本来想设计成 Roguelike 中众多能提供不同能力的道具,但苦于时间不足,因此在游戏中只设计了几个能购买的遗物,有些遗物能在宝箱里面随机开出来。
游戏地图是用 Unity 2017 的新特性 TileMap 做的,镜头使用 2D Cinemachine。现在回看作品,其实这一类型的游戏并不难,但是我们团队除了我都是第一次接触 Unity,踩过不少坑,也导致到 Due 的时候很多东西都没做完。
我负责 ...
我设计的第一个桌游
很久没写文章了,这次带来的是游戏设计课中的桌游大作业。
小组成员在第一节课就随机分好了,我们一开始选择每人准备一个桌游原型,然后共同选择一个原型来深入设计,最后一起选择了我的设计原型。
第一版设计
我的设计是:每个玩家初始有 4 HP,四个玩家从左下角通过掷骰子的方式在地图的点上往终点走,先到终点者胜,HP为零时需要从起点重新开始。地图中有四种不同功能的点,玩家到达某个点时会触发相应效果:
黑点:无特殊效果
绿点:休息点,回 1 HP
红点:陷阱点,拿一张陷阱卡,立即使用来接受惩罚,如: 扣血、禁一回合等效果
黄点:宝物点,拿一张宝物卡,可以在当前回合使用,也可以藏起来等以后的回合使用,如:回血、其他玩家倒退三步、禁某玩家一回合等效果
原型的灵感主要来自于最近常玩的 “Slay the Spire” 中的地图,玩家通过选择不同的道路抉择,目标是活着打败关底 BOSS。在第一版设计中,整个的PVE设计下,也考虑了 PVP 因素:两个玩家走到同一个点时可以进行决斗,每人 -1 HP。由于步数主要依赖于随机的骰子得来的数字,所以道路不能设计太多,尽量增加玩家相遇的机会。同时在较长的支 ...
寻路算法-贪婪最佳优先算法
最近开始接触寻路算法,对此不太了解的话建议读者先看这篇文章《如何快速找到最优路线?深入理解游戏中寻路算法》 。
所有寻路算法都需要一种方法以数学的方式估算某个节点是否应该被选择。大多数游戏都会使用启发式(heuristic) ,以 h(x) 表示,就是估算从某个位置到目标位置的开销。理想情况下,启发式结果越接近真实越好。
——《游戏编程算法与技巧》
今天主要说的是贪婪最佳优先搜索(Greedy Best-First Search),贪心算法的含义是:求解问题时,总是做出在当前来说最好的选择。通俗点说就是,这是一个“短视”的算法。
为什么说是“短视”呢?首先要明白一个概念:曼哈顿距离。
曼哈顿距离
曼哈顿距离被认为不能沿着对角线移动,如下图中,红、蓝、黄线都代表等距离的曼哈顿距离。绿线代表欧氏距离,如果地图允许对角线移动的话,曼哈顿距离会经常比欧式距离高。
在 2D 地图中,曼哈顿距离的计算如下:
贪婪最佳优先搜索的简介
贪婪最佳优先搜索的每一步,都会查找相邻的节点,计算它们距离终点的曼哈顿距离,即最低开销的启发式。
贪婪最佳优先搜索在障碍物少的时候足够的快,但最佳优先搜索得到 ...
3D数学基础-矩阵变换(二)
2020年7月26日更新:
最近对变换重新学习整理了,文章在:图形学常见的变换推导。
上一篇笔记3D 数学基础-向量运算基础和矩阵变换记录了一些向量和矩阵运算的基础,和一些矩阵基本的变换。这篇笔记主要介绍了平移变换、齐次坐标、平移和旋转变换的组合、法线变换和改变坐标系。
平移(Translation)
前一篇文章总结了旋转、缩放等变换,这里介绍一下平移变换。
假如我们需要把 X 坐标从 x 变换到 x + 5,我们需要构造什么样的变换矩阵来实现平移呢?
[x′y′z′]=[?][xyz]=[x+5yz]\begin{bmatrix}x' \\ y' \\ z' \end{bmatrix}=\begin{bmatrix} & & \\ & ? & \\ & & \end{bmatrix}\begin{bmatrix}x \\ y \\ z \end{bmatrix}=\begin{bmatrix}x+5 \\ y \\ z \end{bmatrix}
x′y′z′=?xyz=x+5yz ...