Unity 游戏开发技巧集锦之使用cookie类型的纹理模拟云层的移动
Unity 游戏开发技巧集锦之使用cookie类型的纹理模拟云层的移动
使用cookie类型的纹理模拟云层的移动
现实生活中,当阳光直射大地,而天空中又有很多云时,云层的影子总是会投射在大地上,风吹着云层移动,影子也跟着运动,如图3-28所示。

图3-28 天空中的云朵与大地上的影子
要在游戏中,模拟与之类似的大气现象时,就需要使用cookie类型的纹理。
制作云层效果的纹理
本小节将使用PhotoShop绘制有云层效果的纹理图,然后为其添加透明度信息。具体操作过程如下:
(1)使用PhotoShop创建512×512像素大小的图。
(2)在PhotoShop内,单击【滤镜】|【渲染】|【云彩】命令,即可在瞬间完成云层的绘制,如图3-29所示。

图3-29 使用PhotoShop绘制云层
(3)全选(Ctrl+A)并复制(Ctrl+C)此图像,切换到通道窗口下,新建通道,使用默认的名称Alpha 1,选中新建的通道,然后粘贴(Ctrl+V)。这样透明度的信息也就添加完了。
(4)存储此云层纹理,然后导入到Unity。
在Unity中完成的准备工作
为了模拟云层的移动效果,需要想游戏场景中添加相应对象,并做些简单设置,具体步骤如下:
(1)在Project视图里,选中导入的云层纹理,然后在Inspector视图里设置下列属性值,如图3-30所示。
- q Texture Type为Cookie;
- q Light Type为Directional;

图3-30 设置云层纹理的属性
(2)单击GameObject|Create Other|Terrain和Directional Light命令,为游戏添加地形(Terrain)和方向光源(Directional Light)对象。
(3)选中Directional Light,然后在Inspector视图里,修改光源下列属性,如图3-31所示。
- q Position的X、Y、Z均设置为0;
- q Rotation的X、Y、Z设置为90、0、0;此时光线会与地形平面垂直,如图3-32所示,这是为了避免阴影扭曲。
- q Cookie设置为云层纹理;
- q Cookie Size设置为200;此属性控制照射在地形上的云层的密度,值越大密度越小。
- q Shadow Type设置为No Shadows;

图3-31 修改光源的属性 图3-32 光线与地形平面垂直
编写控制云层移动的脚本
光是将云层的阴影投射在地形平面上,还看不出什么效果,所以本小节打算编写一个脚本,用于控制云层的移动,这样的话效果会更好些。在Project视图下,创建一个C#脚本,并命名为MovingShadows。打开此脚本,写入下面的代码:
- 01 using UnityEngine;
- 02 using System.Collections;
- 03
- 04 public class MovingShadows : MonoBehaviour
- 05 {
- 06 public float windSpeedX; //在X轴方向上的速度
- 07 public float windSpeedZ; //在z轴方向上的速度
- 08 public float lightCookieSize; //直线光源Cookie Size属性的值
- 09 private Vector3 initPos;
- 10 //脚本被初始化时,调用此函数
- 11 void Start ()
- 12 {
- 13 initPos = transform.position;
- 14 }
- 15 //运行游戏时,每帧都调用此函数
- 16 void Update ()
- 17 {
- 18 //在X轴方向,移动云层
- 19 if (Mathf.Abs(transform.position.x) >= Mathf.Abs(initPos.x) + lightCookieSize)
- 20 {
- 21 Vector3 pos = transform.position;
- 22 pos.x = initPos.x;
- 23 transform.position = pos;
- 24 }
- 25 else
- 26 {
- 27 transform.Translate(Time.deltaTime * windSpeedX, 0, 0, Space.World);
- 28 }
- 29 //在Z轴方向,移动云层
- 30 if (Mathf.Abs(transform.position.z) >= Mathf.Abs(initPos.z) + lightCookieSize)
- 31 {
- 32 Vector3 pos = transform.position;
- 33 pos.z = initPos.z;
- 34 transform.position = pos;
- 35 }
- 36 else
- 37 {
- 38 transform.Translate(0, 0, Time.deltaTime * windSpeedZ,Space.World);
- 39 }
- 40 }
- 41 }
此脚本将被赋予方向光源。游戏开始运行时,脚本11行的Start()函数被执行,获知当前方向光源的位置;游戏运行时,16行的Update()在每帧都被执行的,作用是控制方向光源在XZ平面上的移动。
选中被赋予MovingShadows脚本的方向光源,在Inspector视图里可以看到脚本组件上的3个属性:Wind Speed X、Wind Speed Z和Light Cookie Size,如图3-33所示。
提示:属性的含义在脚本的注释中有说明。

图3-33 脚本组件上的3个属性
云层效果展示
设置好云层的移动速度,调整好摄像机的视图效果后,就可以运行游戏了。当然了,看到的就是云层在地形表面上移动的场景了,如图3-34所示。

图3-34 模拟云层移动的效果
本文选自:Unity 游戏开发技巧集锦大学霸内部资料,转载请注明出处,尊重技术尊重IT人!
Unity 游戏开发技巧集锦之使用cookie类型的纹理模拟云层的移动的更多相关文章
- Unity 游戏开发技巧集锦之创建透明的材质
Unity 游戏开发技巧集锦之创建透明的材质 Unity创建透明的材质 生活中不乏透明或者半透明的事物.例如,擦的十分干净的玻璃,看起来就是透明的:一些塑料卡片,看起来就是半透明的,如图3-23所示. ...
- Unity 游戏开发技巧集锦之创建部分光滑部分粗糙的材质
Unity 游戏开发技巧集锦之创建部分光滑部分粗糙的材质 创建部分光滑部分粗糙的材质 生活中,有类物体的表面既有光滑的部分,又有粗糙的部分,例如丽江的石板路,如图3-17所示,石板的表面本来是粗糙的, ...
- Unity 游戏开发技巧集锦之材质的应用的创建反射材质
Unity 游戏开发技巧集锦之材质的应用的创建反射材质 Unity中材质的应用 游戏中,大多数材质的应用都离不开纹理,而纹理本身是图片.所以,在学习本章时,最好在电脑上安装一个可以编辑图片的功能强大的 ...
- Unity 游戏开发技巧集锦之使用忍者飞镖创建粒子效果
Unity 游戏开发技巧集锦之使用忍者飞镖创建粒子效果 使用忍者飞镖创建粒子效果 游戏中,诸如烟.火.水滴.落叶等粒子效果,都可以使用粒子系统(particle system)来实现.例如,<明 ...
- Unity 游戏开发技巧集锦之制作一个望远镜与查看器摄像机
Unity 游戏开发技巧集锦之制作一个望远镜与查看器摄像机 Unity中制作一个望远镜 本节制作的望远镜,在鼠标左键按下时,看到的视图会变大:当不再按下的时候,会慢慢缩小成原来的视图.游戏中时常出现的 ...
- Re:Unity游戏开发有哪些让你拍案叫绝的技巧?
这是我在知乎一个问题: <Unity游戏开发有哪些让你拍案叫绝的技巧?> 下面的回答,觉得蛮有趣的,贴在这里和博客的朋友们分享下. ----- 分享一个比较好玩的内容吧. 大家都知道Uni ...
- 关于Unity游戏开发方向找工作方面的一些个人看法
这是个老生常谈,却又是谁绕不过去的话题,而对于每个人来说,所遇到的情况又不尽相同,别人的求职方式和路线不一定适合你,即使是背景很相似的两个人,有时候机遇也很重要. 我本人的工作经验只有一年,就业方式 ...
- C# Unity游戏开发——Excel中的数据是如何到游戏中的 (二)
本帖是延续的:C# Unity游戏开发——Excel中的数据是如何到游戏中的 (一) 上个帖子主要是讲了如何读取Excel,本帖主要是讲述读取的Excel数据是如何序列化成二进制的,考虑到现在在手游中 ...
- C# Unity游戏开发——Excel中的数据是如何到游戏中的 (三)
本帖是延续的:C# Unity游戏开发——Excel中的数据是如何到游戏中的 (二) 前几天有点事情所以没有继续更新,今天我们接着说.上个帖子中我们看到已经把Excel数据生成了.bin的文件,不过其 ...
随机推荐
- .net中的lock
lock锁 //定义一个私有成员变量,用于Lock的锁定标志 private static object lockobj = new object(); void DoSomething() { l ...
- 用ajax、PHP、session做购物车
购物车网页代码 1.登录界面login.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...
- 浅谈桶排思想及[USACO08DEC]Patting Heads 题解
一.桶排思想 1.通过构建n个空桶再将待排各个元素分配到每个桶.而此时有可能每个桶的元素数量不一样,可能会出现这样的情况:有的桶没有放任何元素,有的桶只有一个元素,有的桶不止一个元素可能会是2+: 2 ...
- 天梯赛 L2-010 排座位 (并查集)
布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位.无论如何,总不能把两个死对头排到同一张宴会桌旁!这个艰巨任务现在就交给你,对任何一对客人,请编写程序告诉主人他们是否能被安排同席. 输入格式: ...
- vue登录/查看/结束端口号
下班时间到啦! --下班都是他们的,而我,还是什么都没有. vue登录(未登录情况下不允许进入) 在路由里加上登录的权限 meta: { requireAuth: true, title: 'Logi ...
- 通过cordova将vue项目打包为webapp
准备工作:需要之前配置好vue-cli脚架构,安装好cordova环境.下面开始对vue.js项目进行打包,打包环境为Android. 可以看下我的github:https://github.com/ ...
- Axure RP 授权码
Axure RP 8.1.0.3372Licensee:KoshyKey:wTADPqxn3KChzJxLmUr5jTTitCgsfRkftQQ1yIG9HmK83MYSm7GPxLREGn+Ii6x ...
- 转:修改shape的文字
Sub 修改shape的文字()'' 修改shape的文字 宏' ' ActiveSheet.Shapes.Range(Array("Flowchart: Connector 193& ...
- C++学习之路(九):从菱形继承引入的对象模型
一.单继承 class A {int a;}; class B : public A {int b;}; 普通的单继承关系,类的大小是由其虚表指针和非静态成员函数大小决定.故上述sizeof(A)的大 ...
- Redis 启动警告解决【转】
[root@centos224]# service redisd start :M Nov :: (it was originally set to ). _._ _.-``__ ''-._ _.-` ...