首先是关于小地图的实现为什莫要先要说小地图的实现呢?是因为小地图实现方式目前有两种,一种是自带战争迷雾的,而我们要侧重于第二种,所以提前说明以便区分。
首先第一种,小地图是作为一个相机在人物上方拍摄的,相当于另一个相机,但是是固定的,关于地图上面的图标只需要人物/角色上方多放一个图标即可,而战争迷雾呢,就是场景中实际的体积雾,很简单,有效,但这有个前提。一定是会映射成实际的地图,即非常真实的。
而第二种我们就要采取传统的方式制作,通过实际手绘地图于实际地图的比例做映射,然后计算在地图上的坐标,这部分我不过于详细阐述,油管上有个教程(虽说一股咖喱味,下方参见)
https://www.youtube.com/watch?v=vhpHYhvdRXA&list=PLNTm9yU0zou6xdEqL2QSSfanaZ3KA_vU7
但第二种在地图上放上战争迷雾肯定也不会出来的,所以主要是为了说明这个。
PS:其实我认为这是策划本身对于程序不理解导致的,因为这种战争迷雾的需求的搜打撤游戏,放个相机在顶部实拍确实在各种方面都更适合而且也更方便,而不是说做一个手绘的再去...
你可能会疑惑啊~,作者作者,你怎么会写一个关于忍龙的呢?难到你在忍龙项目组嘛?这么厉害吗?
那当然不是啊
那关键是有需求复刻一个,那还能不干活嘛?
呃呃解决不了问题的话就只能解决你咯~~
为什莫会有这个呢?因为很多目前攀爬组件大多是仿刺客信条那种,跑酷,而不是像忍龙这种爬一下就掉下来这种,关键是他还需要具体的连招。
而项目组内其他的招式都是用上rootmotion。
Root节点能在Z轴上飞,然后使用montage动画去实现?我没试过,你可以试下。
总之就是基于上述情况下,对动作中的z轴偏移,做出的一个思考。
那我们直接说答案,无他,k罢了啊,答案是用程序锁住动画所有位移,然后通过动画事件去移动他的碰撞,来模拟本身的动作曲线。
你是不是觉得我很笨,确实,我也觉得,但我仔细想了下,忍龙都是快20年前的了,所以好像莫名正确,确实应该是这样做。
好,就此完结(有擅长这方面的小伙伴可以评论区说下哇,有什么有效解决他的动作z轴移动的)
关于GOAP首先要说明的是GOAP是一个目标导向的行为规划框架,你可以理解为把行为树中,每次判断是否执行当前行为的if条件,以及要执行的条件部分,两个拆开来管理的框架。
更多详细的介绍可以参考这位给的解释
https://www.cnblogs.com/FlyingZiming/p/17274602.html#%E9%9A%BE%E7%82%B9%E4%B8%8E%E6%8C%91%E6%88%98
其次是关于实现,倒不如说本文侧重阐述实现的苦难….首先要说明的是,GOAP本身的资料相对比较少,教程貌似只有一个在Unity上的实现,所以要参考网上的实现就只有一种方式,阅读源码并理解,但很可惜的项目组并没有给我太多的时间,而且我要在UE上实现,所以我的实现其实是我自己想的,目前也有些问题,但总归思路是对的,在此提醒。
大概的流程是这样的
GoapState具有所有的世界状态
通过GoapSensor去感知到所有的状态
GoapPlanner根据所有的状态,通过当前的Goapgoal即目标,以及可以使用的GoapAction去规划要执行的plan
GoapAgentComp...
嗯,该从哪里讲起呢。
先从节拍开始吧。
首先我们要知道的一件事是,音乐是有节拍的,比如以四分音符为一拍,每小节有3拍,是不是回到了音乐课?
当然我并不是要讲音乐课,我们首先需要的是一个节拍系统,这个系统其实你可以命名为Conductor(指挥家),核心点在于三件事,节拍的计算,歌曲的BPM,时间。
冰与火之舞作者的实现https://forums.tigsource.com/index.php?topic=49041.0
BPM为每分钟的节拍数,所以如果我们60.f/BPM会得到一个每秒有多少拍子
当我们在Unity/Unreal/FMOD/Wwise中其实是有一个时间来计算当前歌曲的播放时间我们记为T。
所以T/60.f/BPM 我们可以得到一个当前处于歌曲的第几拍,同时也可以得到所有的拍子数量,这样我们可以使用任意一个int值来存下来。
由此,其实一个节拍系统就完成了。很简单不是吗?
所以其实任意的玩法都是可以支撑的因为它只是一个按照歌曲固定位置的int,像第一拍我们记为1,第二拍为2等等
所以节奏天国不是偷...
经过很长时间的去世(啊不是),我又滚回来啦( •̀ ω •́ )y
项目设置*那么众所周知,搭建某项目,必须要进行环境配置那么配置了一次后,如果再创建一个这样的项目我们要再配一次吗?是的再配一次(这篇结束)
开个玩笑哈。。。
VisualStudio目前其实自己有一个Props可以进行共享
View->OtherWindow->PropertiesManager
通过创建新项目属性表,可以共享在其他项目的设置
起码官方是这么推荐的:https://learn.microsoft.com/zh-cn/cpp/build/create-reusable-property-configurations?view=msvc-170
但它并没有想象中那么好用,因为他是详细划分Debug/Release下的每个系统每一个会有一个Props
.vcxproj那么我们直接上答案
https://learn.microsoft.com/zh-cn/cpp/build/project-property-inheritance?view=msvc-170
V...
UnityShader基础知识UnityCG.cgincUnityCG.cginc是与Unity捆绑在一起的shader包含文件之一UnityShaderVariables.cginc定义了渲染所需的一大堆着色器变量,如变换、相机和灯光数据。这些都由 Unity 在需要时设置HLSLSupport.cginc进行了平台设置,因此无论你针对哪个平台,都可以使用相同的代码。因此无需担心使用特定于平台的数据类型等UnityInstancing.cginc专门用于实例化支持,虽然它不直接包含该文件,但它依赖于UnityShaderVariables
subshadersubshader可以使用多个shader变体组合在一起,允许构建不同平台跟细节,例如为windows使用一个subshader,移动设备使用另一个subshader
passsubshader必须至少包含一个pass,shaderpass是实际被渲染的地方,可以有多个,有多个pass意味着被渲染多次但对于效果来说是必须的
CGUnity的shaderLanguage HLSL跟CG的变体,必须用关键词指示CGPROGRAM...
噪声(快速简介)有点累,也有点晚,写的很敷衍,嗯~ o( ̄▽ ̄)o
基础哈希我们可以instance一个n*n的cube 的tile 然后根据随机的哈希值还有uv去赋值不同的颜色
这里介绍一个Small xxHash https://xxhash.com/
实现出来大概长这样
可以根据不同的cube的position以及uv 实现不同的效果(比如球,环)
值噪声(ValueNoise)根据不同的点的线性插值来实现的
一维
二维
三维
柏林噪声(PerlinNoise)一维
二维
三维
噪声变体(Noise Variants)这部分主要是一些噪声发明者实际上论文里的实现参数(值)应该是什么
分型噪声(Fractal Noise)频率(Frequency)噪声的频率,它描述了它的变化速度八度(Octaves)分形噪声由不同频率的多个样本组成。这些被称为Octaves(其实不太好翻译,我觉得可以叫小分型?)振幅(amplitude)分形噪声的概念是,一个Octaves的振幅随着其频率的增加而减小空隙度(Lacunarity)频率缩放被称为噪声...
Part I重点是介绍基础的怎么使用,有以下的重要结构
所有的workUnit里面的,不同类型的音乐如场景,人声可能由不同的公司制作,所以有一个workUnit方便集合(本身是xml文件)
有三个重点部分
Audio目录存储所有音乐资源
Events事件管理音乐内部的逻辑(播放循环等,且事件底下统一按小写处理,不区分大小写)
SoundBank主要是用来与代码交互,代码要找到相应的SoundBank 才可以调用下面的事件
soundbank生成目录就是游戏需要调用的目录,event要扔在SoundBank里,Audio通过Event管理
Part II重点在于编辑器的使用 音高,音频编辑(裁剪,淡入淡出),随机类型的音乐(虚文件夹),序列类型的音乐(虚文件夹)等
感觉用起来很舒服,起码比FLstudio要舒服的多,左下角有所有的功能提示,FLstudio只有简介,Wwise甚至有说明,各种编辑起来也很方便,不知道是不是因为本身属于一种编程思想的音频引擎?O_o
有一个值得注意的地方是,在编辑器里面Audio目录里面Copy是新建的引用,而不是新建文件夹,引...
SIMDSingle Instruction Multiple Data,单指令多数据流,可以使用一条指令同时完成多个数据的运算操作。传统的指令架构是SISD就是单指令单数据流,每条指令只能对一个数据执行操作。
简单举个例子一次可以算4次加法
使用方法1:内联汇编下面的写法是 GCC 和 Clang 等编译器支持的特性。Visual Studio 使用的 MSVC 编译器并不支持 GCC 风格的内联汇编
12345678910111213141516171819#include <stdio.h>#include <stdlib.h> int main(){ float a[4] = { 1,2,3,4 }; float b[4] = { 5,6,7,8 }; float res[4]; __asm__ __volatile__( "movups %1,%%xmm0\n\t" // 将a所指内存的128位数据放入xm...
FFXVI Shadow Part V正文Part V :HiQuality最后的第 5 阶段处理重要角色的更高质量的阴影,绘制在专用的Closeup Shadowmap中,在现有的 VisibilityBuffer 上合成角色阴影
Closeup Shadowmap:与我们的高质量阴影技术一起使用。与普通阴影贴图一样运行,但视图仅限于一个感兴趣的对象,而不是整个光源的视野,以获得更好的分辨率精度。
Output: Updated Final Light List Buffer当阴影图块从完全亮起变为部分亮起时,需要分配一个Visibility Slot并保存Visibility SlotID。相反,需要通过将 Visibility SlotID 替换为完全点亮的标志。这两种情况都通过更新最终光源列表缓冲区中的阴影图块条目来处理。
Output: Updated VisibilityBuffer使用特写阴影贴图生成阴影。当灯光/像素可见性降低时,其在 VisibilityBuffer 中的值将更新。
Output: Updated Standard Shadowmap...