从零开始分析C#所有常用集合类的设计(源码向)
前言
此些天来,武疫兴然,吾甚惧焉,居家不出,项目做完,游戏玩腻,根亦秃噜,百无聊赖,猛然惊醒,吾当面试,基础犹菜,从何下手,唯有C#,C#之何,集合为多,多而不晓,遂有此文。
环境
.Net Framework 4.8
前置知识
Hash
Hash算法无论是在项目开发还是底层语言设计上都是非常常见的一个算法,既然如此常用,那么它的重要性自然不必多说,这也是把它放在第一位讲的原因。
Hash算法与Hash函数
Hash算法是一种数字摘要算法,它能将不定长度的二进制数据集给映射到一个较短的二进制长度数据集。常见的MD5算法就是一种Hash算法,通过MD5算法可对任何数据生成数字摘要。而实现了Hash算法的函数我们叫它Hash函数。Hash函数有以下几点特征。
相同的数据进行Hash运算,得到的结果一定相同。
不同的数据进行Hash运算,其结果也可能会相同。
Hash运算是不可逆的,不能由key获取原始的数据。
常见的Hash算法
直接寻址法:取keyword或keyword的某个线性函数值为散列地址。即H(key)=key或H(key) = a•key + b,当中a ...
Unity DOTS:Components部分
组件
Components是ECS体系结构的三个主要元素之一。它们代表您的游戏或应用程序的数据。Entities是索引您的components集合的标识符,而systems提供了行为。
ECS中的Components是具有以下“标记接口”之一的结构体类型:
IComponentData —用于通用和[chunk components]。
IBufferElementData —将[动态缓冲区(dynamic buffers)]与entities相关联。
ISharedComponentData —按archetype中的值对entities进行分类或分组。有关更多信息,请参见[Shared Component Data]。
ISystemStateComponentData —将特定system的状态与entity相关联,并检测何时创建或销毁单个实体。有关更多信息,请参见System State Component。
ISharedSystemStateComponentData —共享状态和System状态 数据的组合。请参阅System State Component。
Bl ...
Unity DOTS:使用ECS进行GamePlay开发
本节包含有关如何在Unity Editor中创建基于DOTS的游戏和其他应用程序的信息。它还涵盖了ECS提供的可帮助您实现游戏功能的systems和components。
该systems包括:
Unity.Transforms:提供用于定义世界空间变换,3D对象层次结构以及管理它们的systems的components。
Unity.Hybrid.Renderer:提供components和systems以在Unity运行时中渲染ECS entities。
GamePlayer支持包
DOTS中的某些游戏功能需要额外的程序包来支持它们。有关需要其他软件包的功能列表,请参见下表。
Feature
Packages
DOTS ECS
com.unity.entities
Rendering
com.unity.rendering.hybrid
- Hybrid Renderer V2
com.unity.render-pipelines.high-definition or com.unity.render-pipelines.universal
- A ...
Unity DOTS:Systems部分
Systems
一个system,也就是ECS里的S,提供了将component的数据从其当前状态变换到其下一个状态的逻辑-例如,一个system可以通过velocity乘以Time.deltaime来更新所有可移动entities的位置。
Instantiating systems
Unity ECS自动在您的项目中发现system类型,并在运行时实例化它们。它将每个发现的system添加到默认system groups之一中。您可以使用system attributes来指定system的父组以及该system在该group中的顺序。如果未指定父项,则Unity将以确定性的,但并未指定顺序的将system添加到默认世界的Simulation system group中。您也可以使用attribute禁用自动创建。
system的更新循环由其父ComponentSystemGroup驱动。ComponentSystemGroup本身是一种特殊的system,负责更新其child systems。group可以嵌套。system从运行的world获取time数据;time由Up ...
基于Github使用Hexo建站过程记录
前言
从WordPress刚转过来,感觉很爽,本主题基于butterfly:https://github.com/jerryc127/hexo-theme-butterfly 配置,本文记录Hexo建站过程中遇到的问题和相关解决方案。
快速入门Hexo
https://www.cnblogs.com/liuxianan/p/build-blog-website-by-hexo-github.html
npm Install卡住
使用代理registry
1npm config set registry https://registry.npm.taobao.org
来自OSS的图片无法显示
因为防盗链的原因,所以需要给每个md文件加上
1<meta name="referrer" content="no-referrer" />
详见:https://segmentfault.com/a/1190000017896469
Hexo更换电脑重新部署
https://www.jianshu.com/p/906294181814 ...
2020个人年度总结
今年的时间线很简单,最主要还是因为疫情原因吧。(好吧,我本身也是个比较无聊的人,打代码,打游戏,吃饭,睡觉,但是我对这样的生活不感到枯燥,反而有种岁月静好的感觉,hh。)
简单归简单,好说歹说也发生了对我人生影响重大的一件事不是?
那么,让我带你坐上时光机器,回溯我的2020吧。
一月
这个月本来是平平无奇的,十几号放假回的家,因为疫情原因,印象中月底的时候学校就发布消息准备延迟开学了。
印象中我是1.8号开始投递的简历,第一次投简历就投的腾讯,现在想起来我是真的莽夫。
对于新冠时间线,有兴趣的可以去看网友的整理:https://zhuanlan.zhihu.com/p/107418492?from_voters_page=true。
二月
二月中再次收到推迟开学的消息,我继续到处投简历,网龙,畅游,网易雷火,网易互娱,米哈游,4399等有点名气的我都投了一遍,期间应该有一场网易雷火的面试,也是我第一次面试,但我也没有很紧张,面试官也很亲和,很愉快的一次面试经历。
然后这个月好像就没什么事情了,嗯,没错。
三月
三月的时候貌似就直接通知这学期的课程全部转线上了,有点爽,为期大半 ...
为NPBehave而生的可视化编辑器介绍
介绍
什么是NPBehave?https://www.lfzxb.top/npbehave_doc/
使用到的库
ET:一个基于C#的游戏客户端,服务端框架!
Node_Editor_Framework:一个强大的可视化工具!
Odin:Unity编辑器拓展神器!
编辑器截图
这是一个官方例子的可视化版本
支持导出配置文件,供客户端或者服务端读取
运行结果与官方示例一致
使用方法
1.在Unity编辑器的菜单栏,选择Tools/其他实用工具/多功能可视化编辑器即可进入编辑界面
2.然后这样可以创建一个Canvas
3.随便找个空地进行右击
4.鼠标左键点击某一个数据结点即可在Inspector面板显示其包含的数据
5.然后按照自己想要的结果把他们连接起来
6.鼠标左键点击一个空地,即可调出导出配置界面,然后即可进行导出工作。
7.最后在代码里创建自己想要的行为树,Start即可,其中的ID即为我们导出配置时上面显示的根节点ID!
12NP_RuntimeTree npRuntimeTree = NP_RuntimeTreeFactory.CreateNpRunti ...
理解并实现LOL中的攻速机制
前言
攻速机制是Moba游戏中非常重要的机制之一,他会和状态机制,Buff机制产生联系,但是网上却少有详细介绍攻速机制并实现的文章,故有此文。
名词定义
因为为了描述清楚攻速机制需要有一些专有名词,为了避免歧义,本文中的名词及其相关释义如下所示(下面提到的所有概念均为我们逻辑层概念,和动画没有任何关系)
基本攻速:也即基础攻击间隔(BAT)的倒数,即两次攻击之间的间隔时长,比如一个英雄BAT为0.5,即0.5s攻击一次,那么它的基本攻速就是2,大部分英雄基本攻速不一样
攻速收益:对于攻速加成的实际转换比例,比如一双攻速鞋+35%攻速,如果一个英雄攻速收益是50%,那么他真正获得的额外攻速就是17.5%,大部分攻速收益不一样
额外攻速:是指通过Buff,装备,技能,等级成长获得的攻速,计算公式为:额外攻速 = 额外攻速加成 * 攻速收益
总攻速:计算公式为:最终攻速 = 基本攻速 + 额外攻速
基础攻击前摇:攻击打出伤害之前的时间段,在此时间段中对攻击指令进行主动/被动取消都将终止此次攻击,并且没有伤害,大部分英雄基础攻击前摇不一样
攻击前摇:计算公式:基础 ...
实现行为树黑板模块0GC赋值功能
引言
因为行为树中的黑板模块可以存储任意类型的数据,并且默认是以System.Object存储的,所以我们在进行赋值的时候,难免会出现装箱的情况,偶尔的一次装箱也没什么,如果是每帧的装箱。。。不会真有人能忍吧,不会吧,不会吧,不会吧
再多说几句,目前我在使用行为树做技能编辑器,之所以可能会出现上面说的每帧的装箱的情况,是因为我打算把行为树中所有的关键数据都放到黑板中,这样有很多好处
方便状态预测/回滚
方便Debug,逐帧调试
方便满足策划的所见即所得需求
上面说的这些我会在实现之后再和大家分享,有兴趣的可以先关注我的开源Moba项目
正文
要实现黑板赋值的0GC,就是要把他的装箱那一步给去掉,所以理所当然的,我们要自己封装数据类型
基类
1234public abstract class ANP_BBValue{ public abstract Type NP_BBValueType { get; }}
12345public interface INP_BBValue<T>{ T GetValu ...
Box2D篇:进阶知识整合(刚体操作,碰撞处理)
刚体操作
DestroyFixture(b2Fixture)
删除b2Fixture组件 通过b2World.Raycast和b2World.QueryAABB来获取要删除的b2Fixture组件
ApplyForce(force,point)
添加作用力到刚体上 force:要施加的力的大小,单位是N
point:要施加力的点,这是一个全局坐标(世界坐标)
ApplyImpulse(impulse,point)
添加冲量,单位是N*m。
ApplyTorque(Torque)
Torque:扭力大小,为正表示顺时针,为负表示逆时针,单位kg*rad/s
GetLoaclXXX,GetWorldXXX
用来实现本地坐标,向量和全局坐标,向量之间的转换
GetLocalCenter
获取刚体重心的本地坐标
GerWorldCenter
获取刚体重心的全局坐标
GetLoalPoint(worldPoint)
获取全局坐标点worldpoint在刚体坐标系统中的本地坐标
GetWorldPoint(localPoint)
获取本地坐标点localPoint在舞台坐标系 ...