RPG游戏开发记录(一):角色基础移动
首先我们明确一下我们要实现的是类似GTA和巫师3这样的第三人称视角的控制角色移动方式,本节只实现最简单的前后左右移动和角色转向的逻辑。
基本思想游戏中,我们按下W键,角色会向前移动;按下S键,角色会先转身面对镜头,然后移动;按下A键,角色先向左转,然后移动;按下D键,角色先向右转,然后移动。我们发现,无论按下哪个键,角色都是朝着他们自己的前方移动的。但是我们在按下WSAD键时是希望角色向前、后、左、右移动的。这里存在一个参考系的区别,如果我们把自己代入到我们控制的角色视角上,我们确实一直都是在向前走;而在摄像机的视角中,我们控制的角色也确实按照我们的意愿朝某一方向在移动。因此我们想要向某个方向移动是一个摄像机视角下的概念。摄像机面向的方向是前进的方向,摄像机面向方向的左方是向左移动的方向,右边和后面分别是摄像机面向方向的右边和后边。我们要向前移动,就是要让我们控制的角色的朝着摄像机朝向的方向移动;要向左移动,就是要让角色的朝向和摄像机左方的方向移动,角色的朝向向我们移动方向重合的过程中就会造成的角色转向。
所以说,实现本节角色移动效果的关键是处理好角色的朝向和摄像机朝向的关系。
在开始 ...
RPG开发记录(零):场景搭建
在开始进入正题之前,需要先搭建一个可以供角色站立、移动、跳跃并且还有边界的测试场景。笔者希望搭建的场景要遵循一些规范:
统一所有模型资源的单位长度,极特殊情况,所有模型的缩放都设置为1
将场景中的地形预制体化,比如墙、地面、台阶等
…
下面说一个可以提高我们搭建场景效率的技巧:在Unity的Scene窗口中,点击下图位置的图标可以设置物体移动的固定步长。按住Control/Command键拖拽Scene中选中物体的Object坐标系的坐标轴,就可以以固定的步长移动物体了。按住V键拖拽坐标轴就可以让选中物体的选中顶点吸附到另一个场景中的物体上。
创建地形Unity中自带的模型Unity中自带的用来表示平面的是Plane模型,用来表示墙面的是Quad模型,在场景中分别创建Plane和Quad模型,查看它们的详细信息,你会发现Plane模型的尺寸是10x10的(此处不考虑模型的厚度),也就是长宽各为10个单位长度;而Quad模型的尺寸是1x1,长宽各1个单位长度。也就是说需要使用100个Quad模型才能拼出一个和Plane面积一样大的模型。
创建材质为了让地形的尺寸展示更直观,我们使 ...
Mac终端优化记录
下载oh-my-zsh在终端中输入下面的命令安装oh-my-zsh1sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"如果有如下报错提示curl: (7) Failed to connect to raw.githubusercontent.com port 443 after 14 ms: Couldn't connect to server,有两种解决方法:
第一种解决方法是在本地创建一个.sh脚本,将下载链接指向的脚本中的内容拷贝到本地创建的脚本中,并执行该脚本。
笔者更推荐第二种解决方案,因为接下来安装终端主题的时候大概率也会遇到这个报错。进入这个网址https://www.ipaddress.com/,在网页右上角输入raw.githubusercontent.com查看并复制对应的IP地址
在终端中执行vim ~/etc/hosts,在最后添加类似下面一行:
1*替换为上面获得的IP地址* raw.githubusercont ...
UnityAssetDatabase问题整理
AssetDataBase接口使用遇到的坑AssetDatabase.Refresh方法用于刷新Unity编辑器的资产数据库。这个方法会同步磁盘和Unity编辑器之间的资产状态,包括添加、删除、修改文件等。如果你在Unity编辑器外部(比如在文件浏览器中或通过脚本)对项目中的文件进行了更改,使用AssetDatabase.Refresh可以让Unity编辑器识别这些更改。
AssetDatabase.SaveAssets方法用于将所有未保存的资产更改持久化到磁盘。这包括对预制体、场景、材质等任何在编辑器中做出的更改。如果你在脚本中修改了任何资产(比如更改了一个材质的颜色,或者添加了一个新的游戏对象到一个预制体中),并且想要确保这些更改被保存,就需要调用这个方法。
脚本中修改完资源里面的属性的时候,调用一次AssetDataBase.Save() 必须要在AssetDataBase.Load()方法之间调用,不然修改就白做了
File接口相关的操作Directory相关的操作后必须后面跟一个AssetDataBase.Refresh调用
AssetDatabase.MoveAsset ...
游戏开发中的设计模式 —— 命令模式
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。
在GTA、巫师这一类游戏中,我们可以使用WASD操控角色的移动,我们也可以使用相同的按键操控载具、马匹的移动。无论是载具还是角色,当你按下了W键,它们都会执行了向前移动的指令。我们可以在代码中写出如下的代码:
123456789101112131415161718192021222324252627282930313233343536373839void Update(){ if(CurrentControllingObject == Horse){ if(Input.GetKeyDown(KeyCode.W)){ HorseMoveForward(); } if(Input.GetKeyDown(KeyCode.A)){ HorseMoveLeft(); } if(Input.GetKey ...
UnityShader入门精要笔记-(十五)-使用噪声
很多时候,向规则的事物里添加一些“杂乱无章”的效果往往会有意想不到的效果。而这些“杂乱无章”的效果来源就是噪声。在本章中,我们将会学习如何使用噪声来模拟各种看似“神奇”的效果。在15.1节中,我们将会使用一张噪声纹理来模拟火焰的消融效果。15.2节则把噪声应用在模拟水面的波动上,从而产生波光粼粼的视觉感受。在15.3节中,我们会回顾13.3节中实现的全局雾效,并向其中添加噪声来模拟不均匀的飘渺雾效。
消融效果消融效果常见于游戏中的角色死亡、地图烧毁等效果.在这些小锅中,消融往往从不同的区域开始,并向看似随机的方向扩张,最后整个物体都将消失不见.在本节中,我们将学习如何在Unity中实现这种效果.要实现这种效果,原理非常简单,概括来说,就是使用噪声纹理+透明度测试.我们使用对噪声纹理采样的结果和某个控制消融程度的阈值比较,如果小于阈值,就使用clip函数把它对应的像素裁剪掉,这些部分就对应了图中被“烧毁”的区域.而镂空区域边缘的烧焦效果则是将两种颜色混合,再用pow函数处理之后,与原纹理颜色混合后的结果.
首先,声明消融效果需要的各个属性12345678910Properties ...
读书笔记——乔布斯传
只有疯狂到认为自己可以改变世界的人,才能真正改变世界 —— 苹果1997年广告 “非同凡想”
他说:“我小时候一直觉得自己是一个偏文艺的人,但也喜欢电子的东西。后来,我读到宝丽来创始人埃德温·兰德(Edwin Land)的一段话。他说,能站在人文与科技的交汇处,取两者之长的人,才是社会的中流砥柱。他是我的偶像,我当时就立志要成为这样的人。”
激发热情,内向探索,脱离体制(turn on, tune in, drop out)
马库拉在一页纸上写下了一篇名为《苹果营销哲学》的文章,强调了营销文学的三个要点。第一点是“共鸣”,就是要设身处地为用户着想。“我们会比其他任何企业都更加充分地了解用户需求。”第二点是“专注”,“为了出色完成既定目标,我们必须心无旁骛,放弃所有无关紧要地心思和追求。”第三点同样重要,叫做“灌输”,其中心思想是人们对一个公司或产品的印象基于其对外传递的信号。他写道:“消费者的确会以貌取物。即使我们拥有最好的产品、最佳的品质和最强大的软件,但是如果产品的呈现方式粗糙敷衍,人们就会认为我们的产品和服务也是草草了事;如果我们以一种充满创意、专业认真的态度进行呈现,消费者就 ...
UnityShader入门精要笔记-(十四)-非真实感渲染
尽管游戏渲染一般是以照相写实主义(photorealism)作为主要目标,但也有很多游戏使用了非真实感渲染(Non-PhotorealisticRendering, NPR)的方法来渲染游戏画面。非真实感渲染的一个主要目标是,使用一些渲染方法使得画面达到和某些特殊的绘画风格相似的效果,例如卡通、水彩风格等。
在本章中,我们将会介绍两种常见的非真实感渲染方法。14.1节中,我们会学习如何实现一个包含简单漫反射、高光和描边的卡通风格的渲染效果。14.2节将会介绍一种实时素描效果的实现。在本章的最后,我们还会给出一些关于非真实感渲染的资料,读者可以在这些文献中找到更多非真实感渲染的实现方法。
卡通风格的渲染卡通风格是游戏中常见的一种渲染风格。使用这种风格的游戏画面通常有一些共同的特点,比如物体都被黑色的线条描边,以及分明的明暗变化等。由日本卡普空株式会社开发的游戏《大神》就使用了水墨+卡通风格来渲染整个画面。
要实现卡通渲染有很多方法,其中之一就是使用基于色调的着色技术(tone-based shading)。Gooch等人在他们1998年的一篇理论文中提出并实现了基于色调的光照模型。在实 ...
UnityShader入门精要笔记(十三)——使用深度和法线纹理
在第12章中,我们学习的屏幕后处理效果都只是在屏幕颜色图像上进行各种操作来实现的。然而,很多时候我们不仅需要当前屏幕的颜色信息,还希望得到深度和法线信息。例如,在进行边缘检测的时候,枝节利用颜色信息会使检测到的边缘信息收物体纹理和光照等外部因素的影响,得到很多我们不需要的边缘点。一种更好的方法是,我们可以在深度纹理和法线纹理上进行边缘检测,这些图像不会受纹理和光照的影响,而仅仅保存了当前渲染物体的模型信息,通过这样的方式检测出来的边缘更加可靠。
在本章中,我们将学习如何在Unity中获取深度纹理和法线纹理来实现特定的屏幕后处理效果。在13.1节中,我们首先会学习如何在Unity中获取这两种纹理。在13.2节中,我们会利用深度纹理来计算摄像机的移动速度,实现摄像机的运动模糊效果。在13.3节中,我们会学习如何利用深度纹理来重建屏幕像素在世界空间中的位置,从而模拟屏幕雾效。13.4节会再次学习边缘检测的另一种实现,即利用深度和法线纹理进行边缘检测。
获取深度和法线纹理虽然在Unity中获取深度和法线纹理的代码十分简单,但是我们有必要在这之前首先了解它们背后的实现原理。
背后的原理深度纹理实 ...
游戏开发中的设计模式 —— 缓存池
缓存池可以说是游戏中非常常用的一种设计模式了,
注意生命周期