GameFramework篇:新项目使用GameFramework框架需知
1.AB包相关配置
GF资源管理实属牛批,但要使用它,并不是全自动的,还是要配置一下
创建一个静态类,类名随意,注意里面至少要包含以下三个属性,后面的地址所指就是打AB包所必须的三个配置文件(这个地址可以自己更改,注意改变路径就行)
12345678 [AssetBundleBuilderConfigPath] public static string AssetBundleBuilderConfig = Utility.Path.GetCombinePath(Application.dataPath, "GameMain/Configs/AssetBundleBuilder.xml");[AssetBundleEditorConfigPath] public static string AssetBundleEditorConfig = Utility.Path.GetCombinePath(Application.dataPath, "GameMain/Configs/AssetBundleEditor.xml");[Asse ...
ET篇:ETBook笔记汇总
1.2 为什么使用C# .net core做服务端?
GitHub原地址:
为什么使用C# .net core做服务端?
黑体字为作者(熊猫大佬)原创,红色为个人理解
游戏服务端从早期的单服到分布式,开发越来越复杂,对稳定性,开发效率要求越来越高。开发语言的选择也逐步发生了变化,C 到 C++ 到 C++ + PYTHON 或者C++ + LUA 到现在 很多公司开始使用erlang,go,java,c#。目前是一个百花齐放的局面。
但是如果是要你重新做一个网游server,不考虑对公司或者已有的东西兼容性,你会怎么选择?我仔细想了一下这个问题,大概有这个几个方面需要考虑:
1. 语言的稳定性(致命性)
游戏服务器的特点是高负载低延时。所以一般服务端进程都是带状态的,一旦挂掉就意味着数据丢失,这点是无法容忍的。
2. 运行时热更(致命性)
游戏服务器逻辑极其复杂,很容易出现bug,但是又不能经常停服,所以热更修复bug就显得十分必要。出现错误开发人员可以立即编写代码,然后热更修复,线上用户完全感觉不到。
3. 是否有协程支持(重要性5星)
分布式服务器架构,进程与进程之间必然会有 ...
纹理映射
纹理映射
在尝试复制真实世界的外貌时,人们很快意识到几乎任何物质的表面都是有特征的。木材长有纹理。皮肤长有皱纹;布料会有编织结构;油画会有画刷或滚筒留下的痕迹,即使是光滑的塑料也会有制作他的模具的凹凸不平的痕迹,并且光滑金属显示出机器加工过程的痕迹。材料的没有特征的地方很快也会被斑点,凹痕,污点,划痕,指纹和污垢覆盖。
在图形学中,我们把这些现象统称为“空间上表面属性的变化”——表面的属性在每一处地方都在发生着变化,但并没有真正意义上改变表面的形状,考虑到这些因素,所有的建模和渲染系统都提供了一些纹理映射的涵义:使用一个被称作纹理贴图,纹理图像,或者仅仅是一个纹理,来存储这些你想要在一个表面上展示的细节,然后进行数学处理,把这个图片“映射”到表面上。
事实证明,一旦存在将图像映射到表面的机制,就会有很多奇淫技巧,这些技巧已经超过了我们介绍表面细节的基本目标。纹理可以用来制作阴影和反射,提供光照信息,甚至定义表面形状。在复杂的交互程序中,纹理经常被用于存储与其作为一张图片毫无干系的的数据(这里不知道怎么组织语言了,举个例子就是我们可以把骨骼动画烘焙到一张纹理中,从而让GPU去执行蒙皮 ...
FEAR基于GOAP的AI系统GDC分享(中英双语)
前言
经过前一篇对于GitHub开源库ReGoap的介绍,想必大家都对GOAP这一AI方案有一定的了解了,那么今天,我们就来更加深入的了解一下,FEAR这款游戏是如何运用GOAP技术的吧。
注:
正文中的规划/计划系统字样一般都可以当做GOAP系统。
正文中的动作/行为/操作字样一般都可以当做Action。
正文中的效果/影响字样一般都可以当做Effect。
正文中的目标/目的字样一般都可以当做Goal。
正文中的记忆/内存字样一般都可以当做Memory。
资源链接
ReGoap开源库:https://link.zhihu.com/?target=https%3A//github.com/luxkun/ReGoap
ReGoap开源库中文文档:https://link.zhihu.com/?target=https%3A//www.lfzxb.top/goal-oriented-action-planning-chinese-document/
PDF链接:https://link.zhihu.com/?target=http%3A//alumni.media.mit.edu ...
Unity资源批处理编辑器工具技术概要
前言
我们在项目中往往有大量的美术资源,包括但不限于,贴图,模型,动画等,而我们基本上很多资源都是应用的同一套导入配置,如果人为来进行配置的话会非常麻烦,还很容易出错,所以需要一个工具来处理他们导入时的配置,以及已经存在于项目中的资源进行批量配置。
正文
每个资源的AssetImporter面板设置下文统称为规则
技术概要
首先是应用规则匹配机制的制定,一般有文件夹,文件夹+文件部分关键字两种匹配机制。
Unity提供了一个AssetPostprocessor类支持我们进行资源导入的预处理和后处理操作。
我们的每个规则必须对应一个临时文件,用于存储规则来进行批处理。
对于导入资源的规则赋值我们采用反射的方式,但是请注意剔除引用类型和保留部分枚举类型。
对于贴图类型,比较特殊,他有对每个平台的差异化配置,而这一类型又是引用类型,所以对此只能单独处理,采用GetPlatformTextureSettings方法来对不同平台设置进行获取,通过SetPlatformTextureSettings来对不同平台进行设置。
配置好之后请务必调用assetImporter.SaveAndRe ...
Unity Shader入门精要学习笔记:透明效果
透明效果
透明是游戏中经常要用的一种效果,在实时渲染中要实现透明效果,通常会在渲染模型时控制它的透明通道(Alpha Channel)。当开启透明混合后,当一个物体被渲染到屏幕上时,每个片元除了颜色值和深度值外,他还有另外一个属性——透明度。当透明度为1时。表示该像素是完全不透明的,而当其为0时,则表示改像素完全不会显示。
在Unity中,我们通常使用透明度测试(这种方法其实无法得到真正的的半透明效果)和透明度混合实现透明效果。
对于不透明物体,不考虑他们渲染顺序也能得到正确的排序效果,这是由于强大深度缓冲(depth buffer也被称为z-buffer)。
在实时渲染中,深度缓冲是用于解决可见性问题的,核心思想:根据深度缓冲中的值来判断该片元距离摄像机的距离,当渲染一个片元时,需要把它的深度值和已经存在与深度缓冲中的值进行比较(如果开启了深度测试),如果它的值距离摄像机更远,则不需要渲染到屏幕(有物体挡住了它),否则这个片元将会覆盖掉此时颜色缓冲中的像素值,并把它的深度值更新到深度缓冲中(如果开启深度写入)。
但是如果要实现透明效果,当使用透明度混合时,我们关闭了深度写入(ZW ...
Unity Shader基础篇:浅谈TEXCOORDn
事情的起因
今早起床,发现自己在知乎被邀请回答一个问题:(应该是这阵子逛的图形学区域比较多)
TEXCOORD到底是个什么东西
我们来看看官方文档怎么说
TEXCOORD0 is the first UV coordinate, typically float2, float3 or float4.
TEXCOORD1, TEXCOORD2 and TEXCOORD3 are the 2nd, 3rd and 4th UV coordinates, respectively.
看上去很简单,TEXCOORD是指纹理坐标,float2, float3, float4类型。n是指第几组纹理坐标。
第几组???能有几组uv???
身为对美术一无所知的逻辑仔,我是不太明白的,在网上也没有找到好的答案,好在咨询了很多大佬,在此整理一下。
模型中每个顶点保存有uv,可能有一套或者几套,这些uv是指三维模型在2D平面的展开,跟纹理对应上进行插值采样就看到三维里的纹理颜色了
https://kumokyaku.github.io/2019/07/14/UNITY%E7%94%9F%E6 ...
Unity Shader入门精要学习笔记:让画面动起来
Unity Shader中的时间变量
动画效果往往都是把时间添加到一些变量的计算中,以便在时间变化时,画面也可以随之变化。Unity Shader提供了一系列关于时间的内置变量来允许我们方便地在Shader中访问运行时间。
纹理动画
序列帧动画
要播放帧动画,我们需要计算出每个时刻需要播放的关键帧在纹理中的位置。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'Shader "Unity Shaders Book/Chapter 11/Image Sequence Animation&qu ...
Unity Shader入门精要学习笔记:学习Shader所需的数学基础
前言
由于此章节部分内容博主已经在计算机图形学中学习过,所以会少记录一部分,可以前往图形学:上和图形学:下查看
笛卡尔坐标系
二维笛卡尔坐标系
一个二维笛卡尔坐标系包含两个部分的信息
原点
两条过原点的互相垂直的矢量,即x轴和y轴,这些坐标轴也被称为是该坐标系的基矢量。
OpenGL和DirectX使用了不同的二维笛卡尔坐标系。
三维笛卡尔坐标系
在三维笛卡尔坐标系中,我们需要定义三个坐标轴和一个原点。
这三个坐标轴被称为该坐标系的基矢量。通常情况下,这三个坐标轴之间是互相垂直的,且长度为1,这样的基矢量被称为标准正交基。但这并不是必须的。如果不都为1,就是正交基。
左手坐标系和右手坐标系
两种坐标系无法通过旋转做到重合。
左右手坐标系转换方法是,把其中一个轴反转,并保持其他两个轴不变。
Unity使用的坐标系
Unity使用的是左手坐标系。(模型空间)
在观察空间中,Unity使用的是右手坐标系。以摄像机为原点的坐标系。
点和矢量
点是n维空间中的一个位置,他没有大小,宽度这类概念。
矢量是指n维空间中一种包含了模和方向的有向线段。
单位矢量可以用类似:$\wid ...
Unity Shader入门精要学习笔记:开始Unity Shader学习之旅
一个最简单的顶点/片元着色器
顶点/片元着色器的基本结构
123456789101112131415161718192021222324252627282930// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'shader "Unity Shader Book/Chapter 5/Simple Shader"{ SubShader { Pass { CGPROGRAM //表示vert函数是顶点着色器代码 #pragma vertex vert //表示fragment函数是片元着色器代码 #pragma fragment frag ...