微信扫一扫 分享朋友圈

已有 1159 人浏览分享

开启左侧

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

[复制链接]
1159 0

现实生活中,当阳光直射大地,而天空中又有很多云时,云层的影子总是会投射在大地上,风吹着云层移动,影子也跟着运动,如图所示:1.png

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

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

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

b.在 PhotoShop 内,单击【滤镜】|【渲染】|【云彩】命令,即可在瞬间完成云层的绘制,如图所示:2.png

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

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

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

(1)在 Project 视图里,选中导入的云层纹理,然后在 Inspector 视图里设置下列属性值,如图所示:3.png

Texture Type 为 Cookie

Light Type 为 Directional

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

(3)选中 Directional Light,然后在 Inspector 视图里,修改光源下列属性,如图所示:4.png

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

Rotation 的 X、Y、Z 设置为 90、0、0;此时光线会与地形平面垂直,(为了避免阴影扭曲)如图所示: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,如图所示:6.png

云层效果展示7.png

———————————————— 版权声明:本文为CSDN博主「YF云飞」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/flyTie/article/details/125953187

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

0

关注

0

粉丝

10

主题
精彩推荐
热门资讯
网友晒图
图文推荐
  • iOS App

  • 安卓App

Archiver|手机版|小黑屋|技你太美101

GMT+8, 2024-11-23 16:07 , Processed in 0.114727 second(s), 32 queries .

Powered by 技你太美101

© 2024 JNTM101 Team