第四章 为地形添加水源、水流以及水下的模糊效果
制作好了地形的各种效果,接下来我们给场景添加一些水效果,使场景更加丰富。 第一步:添加水面 由于我在上一次的地形创作中就已经在山峰之间制作了一块洼地,它就可以作为一个放置湖水的地方。如果您上次的创作并没有这样的地形,那么请您重新创建一个山势地形图,就当作自己的一次练习吧。 在场景面板中点击Y方向的绿色箭头 ,切换到顶视图,这样可以便于我们很快的找到洼地所在的地方。如图4.1所示: 图4.1 然后用鼠标滚轮迅速的推进观测距离。如图4.2所示: 图4.2 接着再到Project【项目文件栏】找到“Standard Assets”文件夹下的 (仅限专业版使用,如果您使用的版本是非专业版本,请转到 )文件夹中,拖拽一个 【白天光照效果的水模型】到洼地的中央,并利用场景调整工具中的缩放工具 ,将水模型调整到合适的大小。如图4.3所示: 图4.3 紧接着我们再点击场景面板中右上角的白色小方块 ,将视角切换到透视图。然后利用场景调整工具 ,将水模型调整到合适的高度。如图4.4所示: 图4.4 这时您只需要在播放时,将摄像机移动到洼地这个地方就可以看见湖水的效果了。 第二步:添加瀑布。 现在看来效果略显单调,既然是山中泉水我们还得有一些瀑布和溅起的水花。为了节约查找的时间,我们直接在Project【项目文件栏】上方的搜索框输入字符“water f”,这样就可以查处如图所示的材质和模型。如图4.5所示: 图4.5 在这里面, 是一个喷泉模型, 是一个水面的飞溅模型, 是一个瀑布模型。我们先拖入一个 到洼地,然后利用场景调整工具来调整它的位置和角度。如图4.6所示: 图4.6 这时的瀑布略显小了一些,我们可以先选中它,然后到它的属性面板里面去调整成您想要的效果。如图4.7所示: 图4.7 第三步:添加水面飞溅模型。 接下来我们会看到瀑布落到水面是没有水花飞溅的效果的,这不合常理。于是我们在瀑布下的水面上方放置一个水面飞溅模型 。由于它的噶偶一定要和水面高度一致,所以我们先点选水平面,看看它的Y轴坐标,然后复制到 属性面板中同样的位置,以确保它是伏在水面上的。紧接着再到它的属性面板中调整它的属性,让模型效果调整成您想要得到的效果。如图4.8所示: 图4.8 第四步:添加水下模糊效果。 我们运行一下游戏 ,然后将镜头移动到泉水的水面下。如图4.9所示: 图4.9 大家会发现,水下的视觉和在地面上的视觉效果是完全一样的。这和我们平时的生活现状是不相符的,所以我们还得做一下相应的调整。首先点击 ——> ——> ,创建一个立方体,并运用场景调整工具将它调整到整个水洼的实体部分。(注:运用其他形体也可以,其主要是用来覆盖水洼的实体部分,以用来和摄像机做碰撞检测,让摄像机的镜头变得模糊。)如图4.10所示: 图4.10 接着,确保您创建的这个cube是被选中状态,到它的属性面板中,将“Box Collider”卷展栏中的“Is Trigger”复选框打上勾(如果这里不打勾,这个cube将作为一个实物,当摄像机撞上它时,就像撞上墙一样,无法穿过。)如图4.11所示: 图4.11 然后再将“Mesh Renderer”卷展栏下的所有复选框全部勾掉,使这个立方体只作为一个形体存在,而不让它在场景中作出任何的显示渲染。如图4.12所示: 图4.12 接着在属性面板的最上方将它的名字由“Cube”改为“WaterColler” ,再选中 的下拉框 中新添加一个“WaterColler”的标签分类。然后将这个“WaterColler”水洼碰撞体的Tag也改成“WaterColler”。 然后我们在菜单栏中选中 ——> ——> ,新添加一个JS脚本。到Project【项目文件栏】找到刚才新建的JS脚本 ,按下F2键更改它的名字为“UnderWatereffect”,并双击编辑它,输入代码如图4.13所示: 图4.13 输入完毕,按Ctrl+S保存代码并关闭退出。然后将代码拖拽给摄像机使用。重新运行一下游戏,将摄像机移动到水下,就可以看到一片模糊的景象了。如图4.14所示: 图4.14第五章 Unity3D中脚本的简单概述 和其他的3D软件一样,Unity3D作为一个类播放器的3D集成软件,具有良好的时间层级关系。比如Start()里面的语言,总是在播放器初始化时执行一次,而后就不再执行。例如下面用JS写的一个例子。在菜单栏上选中 ——> ——> ,将下面这段代码拖拽给Hierarchy【层次清单栏】中任意一个对象。 您就会在播放器刚开始播放的时候,在左下角的控制台面板中看到 这句话,证明您的Game播放器已经开始工作了。如图5.1所示: 图5.1 (注:这个控制台买那般以后在大家使用的时候会经常用到它,因为它可以用作您代码片段的调试,以及您程序出错了的提示框,详细的提示您出错的原因所在。) 当然有了初始化函数,就一定会有刷帧函数Update(),该函数内所有的代码会在播放器每播放一帧时执行。例如下面用JS写的一个例子,在菜单栏上选中 ——> ——> ,输入如下代码: 该代码会在播放器每播放一帧的时候,显示游戏开始到现在所消耗的时间值。 Unity3D中有着非常强大的接口处理功能,您可以在代码中为对象制定任意一个空接口用于和对应类型的对象进行交互,例如下面用JS写的一个例子,在菜单栏上选中 ——> ——> ,输入如下代码: 该代码为对象添加了一个在Z轴方向上的初始速度,如果在没有其他外力的作用下,物体将一直沿着Z轴方向以5的速度运动。并且当您将这段代码拖拽给一个物体对象后,它的这个初始速度可以作为一个接口在它的属性面板中进行修改。如图5.2所示: 图5.2 除了数字作为接口外,接口还可以是对象,例如下面用JS写的一个例子,在菜单栏上选中 ——> ——> ,输入如下代码: 您可以将这段代码拖拽给Hierarchy【层次清单栏】中任意一个对象,因为它在这里定义了一个Transform类接口对象cubeGO,所以它几乎与拖拽的对象无关。拖拽成功之后来到该物体的属性面板中,您可以看到这样一个属性卷展栏 ,cubeGO的后面有个很明显未定义对象填写栏 ,然后我们把想要使之运动的物体拖拽到这个上面来,当我们运行游戏时,只要按下“G”键就可以看到被拖拽的物体作为“cubeGO”的指代对象,朝着Z轴方向运动了。