呜辣辣辣 发表于 2023-4-3 15:04:48

转载:使用 cookie 类型的纹理模拟云层的移动

现实生活中,当阳光直射大地,而天空中又有很多云时,云层的影子总是会投射在大地上,风吹着云层移动,影子也跟着运动,如图所示:!(data/attachment/forum/202304/03/150257t7zcctbf7erqlggr.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "1.png")

而在游戏中,模拟与之类似的大气现象时,就需要使用 cookie 类型的纹理

制作云层效果的纹理
在photoshop中完成的准备工作
本小节将使用 PhotoShop 绘制有云层效果的纹理图,然后为其添加透明度信息。具体操作过程如下:

a.使用 PhotoShop 创建 512×512 像素大小的图

b.在 PhotoShop 内,单击【滤镜】|【渲染】|【云彩】命令,即可在瞬间完成云层的绘制,如图所示:!(data/attachment/forum/202304/03/150314d7vapq98ojoa9eo7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "2.png")

c.全选(Ctrl+A)并复制(Ctrl+C)此图像,切换到通道窗口下,新建通道,使用默认的名称 Alpha 1,选中新建的通道,然后粘贴(Ctrl+V)。这样透明度的信息也就添加完了

d.存储此云层纹理,然后导入到 Unity

在 Unity 中完成的准备工作
为了模拟云层的移动效果,需要想游戏场景中添加相应对象,并做些简单设置,具体步骤如下:

(1)在 Project 视图里,选中导入的云层纹理,然后在 Inspector 视图里设置下列属性值,如图所示:!(data/attachment/forum/202304/03/150320lcmcs5szf4xsrtr7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "3.png")

Texture Type 为 Cookie

Light Type 为 Directional

(2)单击 GameObject|Create Other|Terrain 和 Directional Light 命令,为游戏添加地形(Terrain)和方向光源(Directional Light)对象。

(3)选中 Directional Light,然后在 Inspector 视图里,修改光源下列属性,如图所示:!(data/attachment/forum/202304/03/150326nm8b2mssli4nizns.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "4.png")

Position 的 X、Y、Z 均设置为 0;

Rotation 的 X、Y、Z 设置为 90、0、0;此时光线会与地形平面垂直,(为了避免阴影扭曲)如图所示:!(data/attachment/forum/202304/03/150403fkb5kh2eispfkoz9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "5.png")

Cookie 设置为云层纹理

Cookie Size 设置为 200;此属性控制照射在地形上的云层的密度,值越大密度越小

Shadow Type 设置为 No Shadows

编写控制云层移动的脚本
光是将云层的阴影投射在地形平面上,还看不出什么效果,所以本小节打算编写一个脚本,用于控制云层的移动,这样的话效果会更好些。在 Project 视图下,创建一个 C#脚本,并命名为 MovingShadows。打开此脚本,写入下面的代码:

using UnityEngine;

using System.Collections;

public class MovingShadows : MonoBehaviour

{

         public float windSpeedX;                           // 在 X 轴方向上的速度

         public float windSpeedZ;                              // 在 z 轴方向上的速度

         public float lightCookieSize;                     // 直线光源 Cookie Size 属性的值

         private Vector3 initPos;

         // 脚本被初始化时,调用此函数

         void Start ()

         {

                  initPos = transform.position;

         }

         // 运行游戏时,每帧都调用此函数

          void Update ()

         {

                   // 在 X 轴方向,移动云层

                   if (Mathf.Abs(transform.position.x) >= Mathf.Abs(initPos.x) + lightCookieSize)

                  {

                            Vector3 pos = transform.position;

                            pos.x = initPos.x;

                            transform.position = pos;

                  }

                   else

                  {

                            transform.Translate(Time.deltaTime * windSpeedX, 0, 0, Space.World);

                  }

                   // 在 Z 轴方向,移动云层

                   if (Mathf.Abs(transform.position.z) >= Mathf.Abs(initPos.z) + lightCookieSize)

                  {

                            Vector3 pos = transform.position;

                            pos.z = initPos.z;

                            transform.position = pos;

                  }

               else

                  {

                            transform.Translate(0, 0, Time.deltaTime * windSpeedZ,Space.World);

                  }

         }
}

此脚本将被赋予方向光源。游戏开始运行时,脚本 11 行的 Start() 函数被执行,获知当前方向光源的位置;游戏运行时,16 行的 Update() 在每帧都被执行的,作用是控制方向光源在 XZ 平面上的移动。

选中被赋予 MovingShadows 脚本的方向光源,在 Inspector 视图里可以看到脚本组件上的 3 个属性:Wind Speed X、Wind Speed Z 和 Light Cookie Size,如图所示:!(data/attachment/forum/202304/03/150429iwbjw9h9w8x5w1ph.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "6.png")

云层效果展示!(data/attachment/forum/202304/03/150434l8cqw2vvszsumirc.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "7.png")

————————————————
版权声明:本文为CSDN博主「YF云飞」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/flyTie/article/details/125953187
页: [1]
查看完整版本: 转载:使用 cookie 类型的纹理模拟云层的移动