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 ...
Unity Shader入门精要学习笔记:非真实感渲染
前言
尽管游戏渲染一般是以照相写实主义作为主要目标,但也有一些游戏使用了非真实感渲染(Non-Photorealistic Rendering,NPR),例如卡通,水彩风格等。
卡通风格的渲染
要实现卡通渲染有很多方法,其中之一就是使用基于色调的着色技术。
在卡通风格中,模型高光往往是一块块分界明显的纯色区域。
渲染轮廓线
在《Real Time Rendering, third edition》一书中,作者把这些方法分成5种类型。
基于观察角度和表面法线的轮廓线渲染,这种方法使用视角方向和表面法线的点乘结果来得到轮廓线的信息,可以在一个Pass中就得到渲染结果,但局限性很大,效果也不尽如人意。
过程式集合轮廓线渲染,使用两个Pass渲染,第一个Pass渲染背面的面片,并使用某些技术让它轮廓可见,第二个Pass再正常渲染正面的面片,这种方法快速有效,并且适用于绝大多数表面平滑的模型,缺点是不适合类似于立方体这样平整的模型。
基于图像处理的轮廓线渲染,适应面较广,缺点是一些深度和法线变换很小的轮廓无法被检测出来,例如桌子上的纸张。
基于轮廓边检测的轮廓线渲染,前几个方法最大问 ...
Unity使用NavMeshPath实现NavMeshAgent匀速移动
前言
为了准备老师的课设作业,我决定做一个RPG小游戏,在处理寻路的时候遇到了点小麻烦。
首先是解决方案的选取,Unity自带的Navgation Mesh挺强大的(至少在客户端是这样,hh),我之前一直用的A*,但是不知道为什么老版本的A*在Unity 2019.3的InspectorGUI是坏掉的。。。又没钱买正版。。。
emmm,勉为其难的选择Navgation Mesh吧。
但是Navgation Mesh好像只有带有加速度的移动方式,这就有点蛋疼,说实话我个人挺不喜欢那种手感的,所以查了查官方文档,发现了NavMeshPath这么个东西,用它就可以得到我们一次寻路过程中所有的转折点,从而自己处理寻路,那么,我们开始吧。
思路
通过调用NavMeshAgent的CalculatePath来得到NavMeshPath,并使用NavMeshPath的corners数组(记录了每一处拐点的位置)和Transform.Translate做匀速运动,人物方向的改变需要自己处理。
代码
重要部分已注释,核心就是RunToTarget函数
1234567891011121314151 ...
使用Graphiz程序化生成UML的完整工作流
前言
想必大家在整理学习一个项目架构时会用到类似UML这样的类图来表述各个模块之间的关系,但是当一个系统很庞大时,我们的UML也会很大,如果项目架构变动或者自己哪里搞错了,基本上就是一场连连看灾难,今天就给大家安利一下Graphiz,用它来程序化生成我们想要的UML图。 我第一次接触这个插件是在一个AI开源库里,使用了Graphiz输出AI决策图,就像这样
甚至这样
很难想象如果人为的去画这些图是怎样的一副光景。
当然了,上面那两个例子可能并不是很中肯,因为我们平时剖析的架构往往没有这么井井有条,他可能会是这样
不过这都没有关系,在Graphiz中,我们只需要写好代码,这些图都会自动生成啦。
正文
Graphiz简介
图形化是一种将结构信息表示为抽象图形和网络图的方式。自动图形绘制在软件工程,数据库和Web设计,网络以及许多其他领域的可视界面中具有许多重要的应用。 Graphviz是开源的图形可视化软件,用户只需要编写dot语言然后让Graphviz读取,即可生成自己想要的UML图。官网:http://www.graphviz.org/about/
Graphiz下载 ...