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类型的纹理模拟云层的移动的更多相关文章

  1. Unity 游戏开发技巧集锦之创建透明的材质

    Unity 游戏开发技巧集锦之创建透明的材质 Unity创建透明的材质 生活中不乏透明或者半透明的事物.例如,擦的十分干净的玻璃,看起来就是透明的:一些塑料卡片,看起来就是半透明的,如图3-23所示. ...

  2. Unity 游戏开发技巧集锦之创建部分光滑部分粗糙的材质

    Unity 游戏开发技巧集锦之创建部分光滑部分粗糙的材质 创建部分光滑部分粗糙的材质 生活中,有类物体的表面既有光滑的部分,又有粗糙的部分,例如丽江的石板路,如图3-17所示,石板的表面本来是粗糙的, ...

  3. Unity 游戏开发技巧集锦之材质的应用的创建反射材质

    Unity 游戏开发技巧集锦之材质的应用的创建反射材质 Unity中材质的应用 游戏中,大多数材质的应用都离不开纹理,而纹理本身是图片.所以,在学习本章时,最好在电脑上安装一个可以编辑图片的功能强大的 ...

  4. Unity 游戏开发技巧集锦之使用忍者飞镖创建粒子效果

    Unity 游戏开发技巧集锦之使用忍者飞镖创建粒子效果 使用忍者飞镖创建粒子效果 游戏中,诸如烟.火.水滴.落叶等粒子效果,都可以使用粒子系统(particle system)来实现.例如,<明 ...

  5. Unity 游戏开发技巧集锦之制作一个望远镜与查看器摄像机

    Unity 游戏开发技巧集锦之制作一个望远镜与查看器摄像机 Unity中制作一个望远镜 本节制作的望远镜,在鼠标左键按下时,看到的视图会变大:当不再按下的时候,会慢慢缩小成原来的视图.游戏中时常出现的 ...

  6. Re:Unity游戏开发有哪些让你拍案叫绝的技巧?

    这是我在知乎一个问题: <Unity游戏开发有哪些让你拍案叫绝的技巧?> 下面的回答,觉得蛮有趣的,贴在这里和博客的朋友们分享下. ----- 分享一个比较好玩的内容吧. 大家都知道Uni ...

  7. 关于Unity游戏开发方向找工作方面的一些个人看法

     这是个老生常谈,却又是谁绕不过去的话题,而对于每个人来说,所遇到的情况又不尽相同,别人的求职方式和路线不一定适合你,即使是背景很相似的两个人,有时候机遇也很重要. 我本人的工作经验只有一年,就业方式 ...

  8. C# Unity游戏开发——Excel中的数据是如何到游戏中的 (二)

    本帖是延续的:C# Unity游戏开发——Excel中的数据是如何到游戏中的 (一) 上个帖子主要是讲了如何读取Excel,本帖主要是讲述读取的Excel数据是如何序列化成二进制的,考虑到现在在手游中 ...

  9. C# Unity游戏开发——Excel中的数据是如何到游戏中的 (三)

    本帖是延续的:C# Unity游戏开发——Excel中的数据是如何到游戏中的 (二) 前几天有点事情所以没有继续更新,今天我们接着说.上个帖子中我们看到已经把Excel数据生成了.bin的文件,不过其 ...

随机推荐

  1. Spring Boot 使用IntelliJ IDEA创建一个web开发实例(三)

    属性配置 1.配置application.properties文件 配置web访问端口和context path server.port = 8081 server.servlet.context-p ...

  2. Spring Boot 使用IntelliJ IDEA创建一个web开发实例(一)

    .新建项目File-->New-->Project-->Spring Initializr 点击Finish,一个Spring Boot web应用就创建好了.

  3. System中关于Property的方法

    System类在java.lang包中,所有方法都是静态的,里边有很多对系统的属性和控制方法 System类有三个成员变量:out-标准输出流(默认是控制台),in-标准输入流(默认是键盘),err- ...

  4. 当月第一天、最后一天、下月第一天,时间date

    时间记录,不是时间戳 $thismonth = date('m'); $thisyear = date('Y'); $startDay = $thisyear . '-' . $thismonth . ...

  5. 使用inline-block,使前面img,后面空div居中显示在一行后,导致当div中有内容时,div下移问题

    .pro_li img,.pro_sm{display: inline-block; *display:inline;*zoom:1;vertical-align: middle ;} 解决方法:使用 ...

  6. python初步学习-python模块之 os

    os os 模块在运维工作中是很常用的一个模块.通过os模块调用系统命令.os模块可以跨平台使用. 在 import os的时候,建议使用import os而非from os import *.这样可 ...

  7. mac终端配色

    1. 终端输入 ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)" 2. brew installxz ...

  8. perl6正则 3: 行开头与结尾与多行开头,多行结尾

    ^ $ 匹配一行的开头或结尾, 可以用 ^ 或 $. > so 'abcde' ~~ /e$/ True > so 'abcdef' ~~ /e$/ False > so 'abcd ...

  9. perl6正则 1: ~~ , //, m//, rx//

    ~~ perl6 中, 要匹配一个正则, 使用 ~~ 智能匹配符. > so 'abcde' ~~ /a.c/ True > so 'abcde' ~~ /a.d/ False > ...

  10. mysql 提权总结

    1.MOF提权 简单的说mof就是系统内部的一个程序,每隔一定时间系统就会以root权限去执行,我们将其替换然后执行我们的而已攻击代码.此举称之为mof提权. 以下便是脚本: #pragma name ...