dnotes

Unity AssetBundle 分割与合并

荒凉一梦 提交于 2021-02-14 22:48:26
介绍 Unity AssetBundle 中的资源非常容易被提取,如果想要阻止简单的提取行为,可以尝试在打包时将文件分割,在运行时将文件合并。 打包 打包时将文件分割成多个文件,这个可以根据需要指定规则处理。例如可以使用随机文件名、分割成随机的份数。 加载 LoadFromStream Unity 2017.4 Unity 2018.4 Unity 2019.3 Unity 2020.1 或更高版本新增了一个从流读取 AssetBundle 的 API,那么可以将多个文件合并为一个文件流供 API 使用。 Unity - Scripting API: AssetBundle.LoadFromStream 虽然通过这个 API 可以自定义 AssetBundle 加载方式,包括加密、多文件读取、内存中读取等等。但是有一个致命缺点:使用时占用文件打开数量,而操作系统对文件打开数量是有上限的。 5.5.4. iOS file handle overuse Current versions of Unity are not affected by this issue. In versions prior to Unity 5.3.2p2, Unity would hold an open file handle to an AssetBundle the entire time that

C#状态机Stateless

风格不统一 提交于 2021-02-13 12:02:16
最近在折腾一些控制相关的软件设计,想起来状态机这个东西,对解决一些控制系统状态切换还是挺有用的。 状态机(有限状态自动机)网上有很多介绍 。简单理解就是定义一系列状态,通过一系列的事件,可以使得状态可以相互之间切换。 如果不使用状态机的思想来编程,那么针对过程的编程方法会使得程序拓展性变差,并且不容易调试。而状态机只需要定义好了各种状态和状态切换之间的事件,你只管触发事件,剩下的事情它自己就自动完成了(毕竟名称叫做有限状态自动机),这对于很多需要定义各种控制阶段的系统简直是完美适配。了解到.NET也有很多库可以实现这些功能,本文主要介绍一下Stateless的应用。 Stateless介绍 Stateless 可以创建极简的状态机与对应的工作流。很多项目(包括VisualStudio Extension、AIlab)都有使用到它。 https: //github.com/dotnet-state-machine/stateless 它支持以下特性: 支持各种类型作为状态和触发事件 支持状态继承 支持状态进入/离开事件 支持条件状态转移 支持状态/转移查询 也有几点需要注意的: 它支持异步语法,但是它是单线程的,不是线程安全的。 可以导出DOT graph 安装起来很简单,直接在nuget中安装即可: Install - Package Stateless Stateless使用

Unity Shader-后处理:高斯模糊

房东的猫 提交于 2021-02-13 04:59:38
一.简介 上一篇文章学习了模糊的原理以及基本的模糊实现,对于清晰和模糊这个定义感觉还是比较说明问题,这里再贴出一下:“清晰的图片,各个像素之间会有明显的过渡,而如果各个像素之间的差距不是很大,那么图像就会模糊了”。鉴于这个定义,我们就可以通过代码来实现模糊的效果。上一篇Unity Shader-后处理:均值模糊中实现了一个基本的均值模糊,也就是将一个像素和其周围的像素取平均值从而进行模糊,并且通过迭代处理的方式,增强了模糊的效果。但是,均值模糊由于采样次数较少,每个像素以及其周围像素的权值是相同的,模糊出来的效果不佳,而多次迭代处理虽然可以增强模糊效果,但是迭代大大地增加了性能的消耗,虽然在学习时可以用迭代来达到效果,但是要实际使用的时候,效率就不得不成为我们考虑的重要因素。所以,这一次,我们来学习一下更加高级的模糊效果-高斯模糊。 高斯模糊(Gaussian Blur),又叫做高斯平滑。高斯模糊主要的功能是对图片进行加权平均的过程,与均值模糊中周围像素取平均值不同,高斯模糊进行的是一个加权平均操作,每个像素的颜色值都是由其本身和相邻像素的颜色值进行加权平均得到的,越靠近像素本身,权值越高,越偏离像素的,权值越低。而这种权值符合我们比较熟悉的一种数学分布-正态分布,又叫高斯分布,所以这种模糊就是高斯模糊啦。 二.概念介绍 1.正态分布 先来复习一下正太分布

深入Lua:Table的实现

£可爱£侵袭症+ 提交于 2021-02-04 04:04:54
Table的结构 Lua和其他语言最不同的地方在于,它只有一个叫表的数据结构:这是一个数组和哈希表的混合体。神奇的地方在于只通过表,就可以实现模块,元表,环境,甚至面向对象等功能。这让我们很好奇它内部的结构到底是怎么样的。 它的结构定义在 lobject.h 中,是这样的: typedef struct Table { // 这是一个宏,为GCObject共用部分,展开后就是: // GCObject *next; lu_byte tt; lu_byte marked // 所有的GC对象都以这个开始 CommonHeader; // 和快速判断元方法有关,这里可以先略过 lu_byte flags; // 哈希部分的长度对数:1 << lsizenode 才能得到实际的size lu_byte lsizenode; // 数组部分的长度 unsigned int sizearray; // 数组部分,为TValue组成的数组 TValue * array ; // 哈希部分,为Node组成的数组,见下面Node的说明 Node *node; // lastfree指明空闲槽位 Node *lastfree; // 元表:每个Table对象都可以有独立的元表,当然默认为NULL struct Table * metatable ; // GC相关的链表,这里先略过 GCObject

C# 编码规范

怎甘沉沦 提交于 2021-01-26 11:10:40
对于编程中非代码文件(例如xml 等),我们目前的最佳指南是代码风格的一致性。编辑代码文件时,需要保持新增/更改的代码与原文件中的代码风格一致性。对于新建的代码文件,它也应符合本编码规范。好的编码规范,有利于提升代码的可读性。.NET Core 框架项目使用的是 Visual Studio 默认编码规范。 通常,我们编码时,应遵循 Visual Studio 默认编码规范中的以下规则: 1、接口名、类名、方法名、参数名和变量名 所有的接口名、类名和方法名都应该使用 PascalCasing 风格来定义,对于接口参数、构造函数参数和方法参数,其参数名则使用 camelCase 风格。对于方法体内的局部变量,则使用 camelCase 风格。 2、花括号 使用 Allman 样式的花括号,每个花括号在新的一行开始,而且花括号不进行缩进,花括号里面的代码缩进。 while (x == y) { something(); somethingelse(); } 对于单行语句块,可以不带花括号,但需要把它放在同一行 if (xx == null ) xx = new Foo(); 一个例外是,允许 using 语句嵌套在另一个 using 语句中,从同一缩进级别的下一行开始,即使嵌套的 using 包含受控块也是如此。 3、空格 使用 4 个空格作为一个缩进,而不是使用 tab。 4、字段

图形学 遮挡剔除算法综述

血红的双手。 提交于 2020-12-29 17:49:58
1. Hidden Line Removal (HLR) 在光栅化的文章中,我们使用Z-Buffer来判断三角形面片是否遮挡,但Z-Buffer不适用于纯线框的模型的遮挡剔除。原因如下。 就如同上图左侧,在A点的位置,左侧的三角形由于只画边不画面,所以A点它是不画的,所以就没有Z值来与右侧的三角形的A点的Z值做比较,因此就没法判断A点是谁在前谁在后。 HLR算法总结 Raycasting(光线投射) 算出每条光线在屏幕上某个像素点上的交点位置 在该像素点上只保留最近的交点 Painter’s Algorithm(画家算法) 简单粗暴,先画后面的物体,后画前面的物体,就像画画一样,后涂的颜色会覆盖掉先涂的颜色。 比较两个物体,当前视角来看,如果A的点全都在B的点前面,那么先画B再画A 但缺点也很明显: 1)如果A的点不全的B的前面,即A有些点从当前视角看是在B的某些点后面,就会失败。 2)物体之间有相交的面时,会失败。 (好像飞机的雷达显示是用的这个算法?) Warnock Algorithm (沃诺克算法) 核心:分而治之 不停的四分屏幕(一般是四分,也可以二分或者其他分),直到被细分的子空间只存在简单的前后关系(就是画家算法的那个要求),或者子空间已经细分到了一个像素点的大小。 在曲面和抗锯齿中很有用。 1)当前子空间没有多边形:完成! 2)当前子空间只有一个多边形:画! 3

Unity

旧时模样 提交于 2020-12-16 11:24:52
前言 对于Unity编辑器的扩展方法众多,本文从最常用的一些方法入手,例如Inspector脚本栏的扩展、顶菜单栏的扩展等,图文并茂阐述其完整用法。 本文大部分内容整理自 独立游戏开发 - indienova 所著的 Unity使用技巧集合 ,但仅选取了最常用的一些方法,并在自身项目上加以实现。 项目地址: UnityEditor - SouthBegonia https: //github.com/SouthBegonia/UnityWorld/tree/master/UnityEditor 本文仅供学习交流,如有任何侵权行为立即删除。 脚本栏的扩展 该部分的扩展方法集中在Inspector中脚本面板,主要体现在代码实现脚本栏中可视变量的规范化、便捷化 [Header] 属性标题 为后续区域代码拟订一个标题,用于区分和概述该区域代码含义 [Header( "武器" )] public int weapon; public int ammunition; public int aurability; [Tooltip] 属性提示 实现在Inspector中,鼠标位于该变量名字上时,提示该变量的描述信息 [Tooltip( "玩家的名字,肯定不再是JOJO对吧" )] public string playerName; [Space] 空行属性

帧同步(LockStep)该如何反外挂

回眸只為那壹抹淺笑 提交于 2020-11-22 01:46:44
在中国的游戏环境下,反挂已经成为了游戏开发的重中之重,甚至能决定一款游戏的生死,吃鸡就是一个典型的案例。 目前参与了了一款动作射击的MOBA类游戏的开发,同步方案上选择了帧同步技术(LockStep而非snapshots以下同)。那么就有很多人担心起来,客户端会跑全部逻辑帧同步该如何反外挂,和状态同步有什么区别呢? 首先我们来分析一下手游的风险和外挂的分类,这里推荐腾讯游戏安全中心的文章,有着非常详细深入的介绍。 手游的风险: • 静态修改文件:将游戏解包修改资源 ,配置,代码等之后再重新打包 ○ 修改资源,例如替换游戏的贴图做广告,修改玩家碰撞资源 或删除部分关键资源使玩家可以作弊等 ○ 修改代码,直接修改游戏代码,实现无敌,免CD,无限伤害等等 ○ 修改配置,修改策划配表等 • 动态篡改逻辑:通过注入和钩子的方式,在游戏运行时修改游戏代码,修改游戏内存等 ○ 修改代码,运行时注入进程直接修改游戏代码或者钩住关键逻辑函数修改逻辑,实现无敌,免CD,无限伤害等等 ○ 修改内存,例如烧饼,葫芦侠等修改器,在游戏运行时修改堆栈和全局变量等 • 游戏协议 ○ 篡改游戏协议,直接修改协议的内容,修改结算结果,修改伤害数值,修改血量等等 ○ 重复游戏协议,例如多次重复伤害协议 • 其他,按键精灵。脚本宏,盗号,恶意发言,打金工作室等,这些和同步技术无关,暂不做详细讨论 外挂的分类 :

Unity3D 入门:Unity Editor 编辑器常用快捷键

◇◆丶佛笑我妖孽 提交于 2020-11-16 04:38:13
本文为 Unity3D 入门小伙伴整理 Unity 编辑器中的常用快捷键。 调节工具 Unity 编辑器左上角的一组按钮,正好也对应着键盘左上角的字母: 图标 快捷键 Q W E R T Y 英文 Hand Tool Move Tool Rotate Tool Scale Tool Rect Tool Move, Rotate or Scale selected objects 中文 手形工具 移动工具 旋转工具 缩放工具 矩形工具 移动、旋转或缩放选定对象 功能 在整个场景中移动漫游 按坐标轴移动选定对象 按三个维度旋转对象 在三个维度上缩放对象 以矩形的方式调节对象的尺寸 综合前面所有对选定对象的调节工具 除了使用 Q 打开手形工具随后用鼠标左键漫游场景外,使用鼠标中键也可以在任意工具下漫游场景(按住鼠标中键然后移动鼠标)。 按住鼠标右键移动可以以当前镜头处为轴心旋转视角,按住鼠标右键的同时按下 W A S D Q E 也可以前后左右下上移动镜头。 按住 Alt 键的同时,也可以在任意工具下使用鼠标左键移动镜头,不过与前面不同的是,这是以目标物体为轴心来移动和旋转的。 按住 Alt 键的同时,按住鼠标右键上下左右移动也可以移远和移近物体。 按住 Ctrl 键的同时,使用以上所有工具移动、旋转或缩放对象的话,可以对齐网格。( Edit->Grid and Snap

Unity Ragdoll 实现死亡效果 心得+坑点总结

感情迁移 提交于 2020-11-06 09:00:45
目录 效果展示 创建Ragdoll 通过代码控制 代码 坑点总结 第一帧蒙皮拉伸,撕裂 死亡后蒙皮拉伸,撕裂 死亡后布娃娃不生效 正文 回到顶部 效果展示 正如其名,Ragdoll可以让人物模型实现像布娃娃一样物理效果 回到顶部 创建Ragdoll 在场景中新建 3D Object → Ragdoll... 接下来是一个初见复杂的绑定界面,这里我做了简单翻译 我们需要将模型对应的关节部位一一拉进这个表 创建完成后,可以发现模型中的每个所选部位中多了 一个Rigibody,一个Collider和一个Character Joint组件 ,在Joint面板里可以调节转动限制等 这里要注意的一个坑点是, root节点是没有Character Joint的 ,当你找不到root节点时,没有Character Joint但是添加了Box Collider和Rigibody的就是root节点 root节点应在这个位置,不熟悉朋友 有可能将盆骨附近Pelvis 与 胸部附近Middle Spine的两个Collider互换位置 ,或者重叠,这将导致整个人物的抽搐,蒙皮拉伸 调整四肢Collider大小位置,如下: 回到顶部 通过代码控制 这时候我们需要: 让角色存活(isDead = false)时: 每个部位的Rigibody的isKinematic一直为true