Hello Blog
8.17
之前瞎看书看到这么一个概念,叫做“警惕无知”,其中提到我们应该警惕对自身水平的无知。我觉得很有道理,于是那段时间我开始有意识地去注意我和一些优秀的同龄人之间的差距。然后我就自闭了,因为我发现差距还是挺大的。
不过后面心态倒是稳定了,想了想,自己是从大四开始才转游戏开发的,和优秀的那批人有差距才是正常的事情, 不然这个世界的数值就有点不平衡了。客观地认识自己,知道自己在哪里还有欠缺,然后针对性地设立目标,去进步,就可以了。
然后我建立了这个Blog,主要是对之前的知识做一个记录总结,帮助我巩固技能树,同时也对自己的技术树有更加清晰的认知。也发挥一点“开源精神”,毕竟自己也受益于许多大佬的博客。
大概如此。
9.2
前天抱着好奇心下了最近很火的乙游《恋与深空》,结果一整个周末基本就沉浸其中了。然后我跟朋友感叹:“为什么恋与深空的世界不能真实存在呢?”
说实话我之前也经常会这么感叹,我希望海拉鲁是真的,希望宝可梦的世界是真的,希望我所经历的虚拟世界都真实地存在着。而在感叹的同时我也会产生某种庆幸,庆幸选择了计算机,庆幸选择了游戏开发,庆幸选择了站在离我所盼望的虚拟世界最近的地方。
...
个人成长指北
记录一些需要提升的技术方向
cs==gameplay>ta
cs
现状
掌握语言较少,基本只对C#比较熟悉,对游戏开发常用的其他语言,如C++、lua、python等不太了解。
学习优先级
lua
C++
python
大概学习思路
lua
菜鸟教程
搓热更框架
C++
了解语言基础语法/数据结构->刷力扣练手
黑马程序员b站C++网课
《C++ Primer 中文第五版》
通过网上的面经/八股文等查漏补缺
项目练手
python
菜鸟教程
项目练手
gameplay
现状
做过的项目基本都是2d项目,对3d可能涉及到的技术不是特别了解
学习思路
通过做一个3d RPG项目了解基本的一些技术实现,比如动画状态机、技能编辑器等
ta
现状
把闫老师的games101看完了,但更深的一些技术如shader、自定义渲染管线不太了解
学习思路
《Unity Shader入门精要》
Catlike Coding Custom SRP
一些待看书籍
《Unity Shader入门精要》
《计算机网络:自顶向下》
我做的游戏
【进行一个倒叙xD】
【毕业前的项目基本没有什么记录,所以这篇文章从毕业之后开始写。】
2024恶魔真探DICEMON 2024.5
链接:恶魔真探DICEMON
制作日期:2024.4~2024.5
恶魔真探于我而言是24年最大的惊喜,一群第一次合作的人,居然能够携手走到最佳游戏奖的位置,难以置信。
【2024鹰角开拓芯游戏创享节上,玩家正在游玩我们的游戏。】
恶魔真探是在机核BooomJam产出的作品,一开始我抱着“上次Jam我的产出太少了,这次多做点东西吧!”的心态在机核发布了组队自荐,然后幸运地被队伍后来的PM和主美邀请加入队伍,后来队伍随着我们各自的邀请逐渐壮大,扩充到了最后的11人。
后来做完游戏PM21和主美A捞跟我说,是因为我在机核社区发岩田聪的名言“程序员不能说不”才产生了邀请念头。(在机核的这篇采访里也有被提到:为了你的“游戏梦”,我们能做的是什么?,总而言之真是太感谢了,感谢聪哥!感谢我的队友们。)
在这次制作里,我主要负责了:①UI框架搭建和UI相关功能模块的开发 ②音频管理 ③AVG系统的实现 ④游戏数据处理 ⑤打包XD。
这次游戏的机制设计我也非常喜欢, ...
【数据结构and算法】杂记
数据结构浅析Dictionary参考文章
源码
Dictionary(字典)是C#的一个集合类,它可以通过Key/Value(键值对)的形式存放数据,是C#另一个集合类hashtable(哈希表)的泛型实现。它相对于其他数据结构如Array、List最大的优势是:查找元素的时间复杂度接近O(1)。
1 理论1.1 hash函数hash函数帮助实现了时间复杂度为O(1)的高效查找。它将任意大小的输入(Key)转换为固定大小的输出(通常是整数),用于确定键值对在哈希表中的存储位置。
1.2 hash碰撞hash函数的其中一个特点是:不同数据经过hash计算后,其结果可能相同。这种现象称为哈希碰撞/哈希冲突。
1.3 解决hash碰撞常见的解决冲突的算法有:
开放定址法
线性探测法:每次冲突后检查下一个连续的槽位,直到找到一个空槽。
平方探测法:探测序列的间隔不是固定的,而是依次增大,通常按照平方增长。
双重哈希:使用第二个哈希函数计算步长,确保探测序列的分布更均匀。
拉链法(Dictionary采用的方法)
在每个哈希槽位中,存储一个链表,将所有映射到同一槽位的元素存储在这个链表中。 ...
【Unity】热更新
热更新原理:
AssetBundle包可以从服务器上下载然后加载进游戏,所以我们需要热更的资源只要丢在服务器上,等进入游戏时再进行下载就可以了。但AssetBundle只能打包资源,不能打包C#代码(可能出于安全和方便管理),因此我们需要考虑代码热更的方式。
现在主流的一些热更方式:
ToLua/XLua
ILRuntime
HybridCLR
资源管理AssetBundle1 打包面板信息1.1 AB包的压缩格式
LZMA
默认压缩方式,能使压缩文件达到最小。但由于其压缩方式是基于整个AssetBundle的数据流实现的,因此在对其解压时需将整个流进行解压。
LZ4
一种基于块的压缩算法,压缩文件比LZMA大,但在解压时只需要解压包含所请求资源的字节的块。
No Compression
不压缩。
1.2 AB包生成的文件
对应资源的文件
资源AB包
manifest文件
记录了AB包的文件信息
加载时可以用来提供资源信息、资源依赖关系等等
关键文件(和定义的output文件同名)
主包
manifest文件:记录AB包之间的依赖信息
2 加载AB包1 ...
【Lua】知识杂记
Lua菜鸟教程
2 变量2.1 概念Lua是一种动态类型语言Lua中的所有变量申明都不需要申明变量类型,它会自动地识别类型。并且对于lua中的一个变量,可以随便赋值,不会出现C#里会编译错误的情况(因为C#是强类型语言,一个变量一旦被声明类型,就不能更改其类型)。
Lua
12a = 1a = 1.5
C#
12int a = 1;a = (int)1.5f;
在Lua中可以直接使用没有初始化的变量,默认为nil。
1print(b)
type()在Lua中我们可以通过type函数获得变量的类型,并且type()返回的其实是一个string类型的数值。
123a = nilprint(type(a))print(type(type(a)))
2.2 简单的四种变量类型2.2.1 四种变量类型
nil:空
number:数值类型,如:1,1.2…
string:字符串
boolean:true/false
2.2.2 string概念Lua中字符串的声明,使用单引号或双引号包裹,二者没有区别。
12a = '12345'a = "12345"
...
【开发日志】FPS-Demo
Day1 人物移动和转向1 人物移动前提:人物模型上需要增加一个CharacterController组件。
1234567891011121314151617181920212223242526using System.Collections;using System.Collections.Generic;using UnityEngine;public class PlayerController : MonoBehaviour{ private CharacterController characterController; private float moveSpeed = 20.0f; private Vector3 moveDirction; private void Start() { characterController = transform.GetComponent<CharacterController>(); } private void Update() { ...
【Unity】知识大杂烩
基础1 四元数(Quaternion)1.1 欧拉角的缺陷1.1.1 概念
(x,y,z)
Unity中的欧拉角
Inspector窗口中调节的Rotation就是欧拉角(注意,是Inspector窗口中的Rotation,transform中的Rotation是四元数)
this.transform.eulerAngles得到的就是欧拉角角度
1.1.2 优点
直观、易理解
存储空间小(三个数表示)
可以从一个方向到另一个方向旋转大于180度的角度
1.1.3 缺点
同一旋转的表示不唯一(旋转90度和旋转450度是一个意思,但是表示不同)
万向节死锁
插值时可能会导致抖动、路径错误等。
1.1.4 万向节死锁参考
万向节死锁简单来说就是欧拉角的三次旋转过程中产生了一次旋转轴的重合,导致了原来三个旋转自由度实际退化成为两个有效的自由度。
本质上是因为物体的角度状态和欧拉角的坐标并非一一对应关系,某些位置状态并不唯一确定一组欧拉角坐标。
其实从数学上就能马上推算出来:
绕三个轴旋转的旋转矩阵:
Rx(θ) = \begin{bmatrix} 1&0&0 \\ 0&cos( ...
【Unity-UGUI】UGUI性能优化
1 UI性能瓶颈
CPU
Canvas重建频繁:Canvas是Unity中用于承载和管理所有UI元素的根对象。每个UI元素必须附加在一个Canvas上,Canvas重建是指当Canvas上的UI元素发生变化时,整个Canvas需要重新绘制,频繁的重建会影响性能。
Draw Call过多:Draw Call实际上就是一次CPU向GPU发起的图形渲染接口的调用,每个UI元素都会产生一个Draw Call 。过多的Draw Call会增加渲染开销,降低性能,导致渲染开销过大。
复杂的UI逻辑:复杂的UI逻辑和动画也会增加CPU负担。
内存使用不当:大量图片、字体等资源的加载和未优化的内存管理会导致内存占用过高。
GPU
overdraw:指的是渲染过程中,像素被绘制多次的现象。
2 CPU性能优化2.1 Rebuild2.1.1 Rebuild概念Rebuild指的是在Canvas组件中,UI元素需要重新计算、布局或渲染时所进行的操作。
UGUI里有几个关键的Rebuild类型:
Layout Rebuild(布局重建)
当UI元素的布局属性(例如尺寸、锚点、对齐方式)发 ...
【Unity-UGUI】ScrollView自动定位
最近遇到了这样的需求:滑动列表自动定位到第一个未领取的奖励,翻译一下其实就是ScrollView的自动定位问题。
ScrollView的滑动、定位问题一般都与ScrollRect.normalizedPosition这个字段有关,这个字段描述了ScrollView组件下Content(内容)和Viewport(视窗)的相对位置,滑动、定位问题本质上就是寻找新的normalizedPosition的问题。
Unity官方对这个字段的描述:The scroll position as a Vector2 between (0,0) and (1,1) with (0,0) being the lower left corner.
新的normalizedPosition的计算方法:当前的ScrollRect.normalizedPosition+偏差量(根据目标Item位置和当前viewport位置进行计算,详细见代码)123456789101112131415161718192021222324252627282930313233343536373839404142434445464 ...