转载:使用 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]