探索UnityECS系列(一): Hybrid ECS

简介 Unity又一个令人激动的新功能ECS,Entity-Component-System。可以让我们开发出性能超强的游戏功能。官方提供的最直观的例子就是一个鱼群的模拟场景,这个场景中可以在运行25000个鱼的实例,并且稳定30FPS。那么接下来就让我们开始探索这个新功能吧。 一图流 第一次接触ECS的兄弟大可以先将这张图略过,等看完全文再回过头来看,到到时候会有更大的帮助。 什么是ECS? 概念 要深入学习ECS,建议分两步走,第一步HybridECS,混合类型ECS,在Monobehaviour和GameObject的基础上快速实现ECS的功能,实现数据和行为逻辑的分离。然后是PureECS,纯粹的ECS,完全抛弃MonoBehaviour和GameObject实现对性能的最大提升。 今天我们主要讲的是HybridECS,从我们熟悉的地方开始,逐渐认识ECS。 安装 导入Unity Entities Unity2018版本,可以直接打开Window->Package Manager,在All标签下选择Entities进行安装,安装完后会自动导入相关的文件。 2017版本的兄弟可以到项目工程目录里找到Packages目录,修改manifest.json文件安装, 在dependencies中加入...

3 minute read

探索NavMeshBuildingComponents,让AIAgent飞檐走壁

简介 最近在看AI寻路的文章时,发现Unity在5.6的版本中出了新的寻路功能NavMeshBuildingComponents。(-。-其实这个新功能并没有隐藏的很深,只要是5.6版本以上的兄弟,就能在引擎中很明显的位置看到,没发现的我太没用了)用过旧的Navigation的兄弟都知道旧版的寻路有多难受,烘焙出来的NavMesh只能支持一个agentType,而且只能支持静态寻路。 所以以上的这些痛点就催生了NavMeshBuildingComponents。支持多个agentType,支持动态寻路,支持任意方向的表面寻路。 一图流 NavMeshComponents有4个主要的组件: NavMesh Surface 主要控件,控制哪些地方(MeshRenderer,Collider,Volume)需要烘焙NavMesh NavMesh Modifier 修改物体的寻路设置,可以覆盖NavMeshSurface的设置 NavMesh ModifierVolume 修改范围内的寻路设置,可以覆盖NavMeshSurface的设置 NavMesh...

2 minute read

探索TimelinePlayableAPI,让Timeline为所欲为

简介 之前快速地学习了一下Timeline,需要详细回顾的兄弟可以回头看我的上一篇,快速了解Timeline。 这里我们做快速的回顾,Timeline主要分为TimelineInstance和TimelineAsset,可以用Timeline PlayableDirector控制播放哪一个TimelineAsset 今天我们再来看看Timeline中的Track,并且动手实现一个老年迪斯科场景。 一图流 Track Timeline可以添加很多Track来对不同的对象做控制。 Animation Track 在Clip上控制动画,可以在有Animator组件但是没有AnimatorController的情况下直接播放动画。 Audio Track 在Clip上控制音频播放。 Activtion...

5 minute read

快速了解Unity2017新功能:Cinemachine(3)

简介 上一篇文章我们更深入地认识了Cinemachine,并且动手实践创建了一个基础的 镜头跟随效果,以及一个2D游戏常见的场景和镜头效果。今天我们再来了解一下ClearShot 一图流 温故知新 Cinemachine的基础概念这里就不再复述了,不清楚的兄弟可以查看我的第一篇文章 今天我们来说说ClearShot。他这有什么用呢?试想一个在3D游戏中,我们常会遇到这样的情况,玩家从室外移动到室内, 这时候室内的观察视野就没有野外宽阔了, 我们能看到的内容也会发生变化。如果使用ClearShot就能很轻松地达到这种效果。 实践 使用ClearShot,我们可以快速地达到如下的效果。 创建一个移动的Cube,和一个固定的wall,如图,cube有一个动画,会向前移动一段距离,穿过wall后再出来 通过Cinemachine->Create ClearShot Camera,创建一个ClearShot...

2 minute read

快速了解Unity2017新功能:Cinemachine(2)

简介 上一篇文章我们大概介绍了Cinemachine的概念和一些基本的属性,今天我们来更深入的认识Cinemachine,并且动手实践一番,创建一个基础的 VirtualCamera制作一个镜头跟随动画,以及制作一个2D游戏常见的场景和镜头效果。 温故知新 我们回顾一下Cinemachine的重要概念,CinamachineBrain和VirtualCamera,brain控制激活哪一个虚拟相机来控制真实的Camera,虚拟相机 可以根据我们的不同需求来设置。 实践1 创建一个Cube,为这个cube创建一个平移动画。命名为translation 创建一个Cinamachine Virtual Camera,通过菜单栏Cinemachine->Create Virtual Camera。命名为CM Vcam1。 将Cube设置为CM...

1 minute read

快速了解Unity2017新功能:Cinemachine(1)

简介 Unity2017又双叒叕一个令人激动的新功能!Cinemachine!由Unity提供了一套摄像机的解决方案,快速,高效的完成我们需要的镜头效果, 像是轨道移动镜头,镜头跟随,镜头切换,模仿手持抖动效果等等。原先难以控制的镜头,现在再也不是噩梦了。 说了这么多,赶紧让我们来看看Cinemachine吧! 如何安装 Cinemachine功能强大,但是我们想要使用它的话还需要到AssetStore里下载他的Package。 Import我们刚才下载的Package,这个时候我们的菜单栏就会增加一个Cinemachine菜单。 我们可以选择Import Example Asset Package来导入官方提供的实例场景和一些资源。 全部导入后我们会得到两个目录Cinemachine,CinamechineExamples 在Assets/Cinemachine/目录中,可以查看官方的手册文件CINEMACHINE_install 重要概念 安装完成!让我们来创建一个Cinemachine开始我们的创作吧!等等,Cinemachine是这么用的吗?在菜单栏里没有找到创建Cinemachine的选项啊。...

1 minute read

快速了解Unity2017新功能:Timeline

简介 Unity2017面世也有一段时间了,今天我们来学习一下2017版本中的新功能Timeline。这个功能乍一看和原来的Animation窗口很像,功能感觉也很像,就是整整动画。 但是仔细研究就会发现,其实Timeline比Animation强大很多。 Timeline支持多种类型,比如动画,声音,物体激活等,这个功能的感觉就像是在用Adobe Premiere一样,使用各种轨道来组合出自己想要的效果。 而Animation只能处理动画。 认识Timeline Unity官方文档对Timeline功能的解释是:我们可以用Timeline编辑器窗口中与场景相关的游戏物体的可视化轨道和片段,来创作我们的场景过度,电影,游戏流程。 Timeline系统中有两个重要的概念,Timeline Asset和Timeline Instance。 Timeline Asset 直观翻译成Timeline资源,会被保存到项目中,资源中保存了轨道和片段信息,不包括具体关联的物体。任何在这个Timeline资源下的片段都会被保存成当前Timeline资源的子物体。 红色部分就是被保存的Timeline资源,蓝色部分就是这个资源中保存的片段资源。...

1 minute read

秘籍!Unity与iOS平台交互和原生插件开发

简介 Unity引擎虽然很强大,但是很多的时候还是需要运行平台的原生功能,这时候光靠Unity是做不到的。比如iOS平台上我们要从一个应用唤起另一个应用,在我们的游戏中打开一个网页,或者是直接嵌入一个iOS原生的界面(也就是现在接SDK的时候要做的事情)。 很多兄弟在刚接触的时候一头雾水,不知道从哪里入手。也有很多兄弟搞过一次一段时间后就忘记地一干二净。于是我说,入门的和忘记的人多了,就有了这个文章的诞生!希望能问新手打开新世界的大门,让忘记细节的老兵可以快速回忆。 Unity Call iOS 这里我们来实现从Unity调用iOS中OC实现的方法。 在C#文件中,声明一个extern方法,如下: [DllImport("__Internal")] private static extern void CalliOSNativeFunction(); 新建我们在iOS原生环境下运行的源文件,如:...

3 minute read

Shader Playground:Graphic Command Buffer初次探究

简介 理解了一定的Shader渲染原来以后,会发现Shader做的事情是每一个像素,每一个片段都会做的事情,如果我们想要去处理大面积的像素时该怎么办呢?这时候Command Buffer就出场了! 什么是Command Buffer 我们先来看看官方文档的解释: List of graphics commands to execute. Command buffers hold...

9 minute read

Shader Playground:高斯模糊效果

简介 上一次我们用GrabPass实现了简单的线性模糊效果。但是效果实在是让人无法恭维=。=看久了眼睛是要彻底报废的。 模糊效果界最有名的效果就是高斯模糊,俗称毛玻璃效果,今天我们来弄明白他并且实现它。 高斯模糊 先让我们来看看大名鼎鼎的高斯模糊的效果。 是不是比线性模糊效果要平滑很多! 那么高斯模糊到底是何方神圣呢?我们直接搜索,得到正态分布,高斯函数等的让人望而生畏的结果。 我们要实现高斯模糊,只要明白为什么应用了正态分布,就能达到我们的模糊效果。 我们先来想想什么是模糊效果,假设我们现在显示器分辨率是1920x1080,那么我们同时打开两张图片,一张尺寸是64x64,还有一张尺寸是512x512。如果让我们同时把两个图片到拉升到1024x1024大小的画布上,我们很快就会发现小尺寸的图片模糊的厉害!为什么?因为他只有64x64个有准确颜色信息的像素,强行让他铺满1024x1024大小的画布,他根本不知道其他的像素该是什么颜色。 反过来想,如果我们要让图片变模糊,就是强行让图片的像素携带的颜色信息变少。之前的线性模糊就是这种做法,让一个像素和他周围上下左右的像素颜色一样,这样就会让原先的像素颜色信息丢失。就达到了模糊的目的。 那么问题来了,当我们在让像素失去原有颜色信息的时候用上正态分布,越接近中心像素的像素可以对中心像素的最后颜色造成更大的影响,距离中心像素越远的像素会中心像素最后颜色造成的影响越小。然后中心像素周围的像素的颜色的影响力之和就是我们中心像素最后的颜色,如果对一张图片中所有的像素都做同样的处理,那么原先的颜色信息就会丢失,每个像素的颜色信息都会很接近周围像素的信息,使得最后的颜色丢失不会很突兀,而是显得更加平滑。 这样理解的话,那么我们只要在渲染颜色的时候加上影响力权重就能实现高斯模糊的效果了!没错,那么这些权重值从哪里来呢?这些权重值就是由高斯函数计算出来的。 这里我使用了阮一峰大神的计算结果 修改我们之前的Shader: Shader...

4 minute read

Shader Playground:Unity UGUI模糊贴图纹理效果实现

效果预览 这是一个简单的线性模糊的效果。不用RenderTexture。 一个shader,一个脚本,一个材质球就能快速实现。 实现思路 要达到这个效果,分两步实现, 用Unity ShaderLab里的GrabPass来抓取屏幕像素 重新计算并修改MainTeture的UV,达到只模糊RawImage的Rect范围内的图像。 GrabPass 下面是来自Unity5.4beta官方文档对GrabPass的描述: GrabPass is a special passtype...

5 minute read

旅游攻略:看一遍就GO系列之宁波奉化

什么是看一遍就GO系列 看一遍就GO系列的目的是给大家提供最实际的旅游攻略,让大家在旅游的途中少走冤枉路,多享受旅程。 当然这一切并不是纸上谈兵,都是我实地考察后的攻略。 希望这些攻略能对你有一点帮助,如果你喜欢那就关注我, 以后我会持续记录看一篇就GO攻略! 地点 : 浙江–宁波–奉化–溪口 一句话开头 宁波奉化著名的景点有蒋氏故居和雪窦山,美食有牛肉干面和水蜜桃。 简介 今天我们的目的地在奉化溪口,它是蒋介石老蒋的故乡,还有中国著名佛教名山雪窦山。 溪口的旅游业相当发达,当地很明确的规划了两处景区。 下面是高德地图上搜索到的地图,可以看到两个景区距离不远。两处景区有公交车可以来回。 图片1:地图...

1 minute read

深入理解闭包

起源 最近在敲c#的时候,在循环中加入了闭包,运行后的结果和预期相差很远。 Code 1: List<Action> actions = new List<Action>(); List<int> oList = new List<int>(){0, 1,...

2 minute read

里程碑!Welcome to Jekyll!

个人博客搭建完成!!记录下过程中的问题作为备忘,同时也分享给大家, 让大家在遇到问题的时候多一张解决方案。 安装Ruby,RubyGems 安装RVM过程中在Homebrew上卡了很久,一直连接不上无法更新 Homebrew 要更新用的是curl 不使用国内的源,这是socks5科学上网出去 在zshrc中添加socks5支持 ALL_PROXY=socks5://127.0.0.1:1080 brew update 一直提示无法解析https:github.com brew update -verbose...

1 minute read