首页 > 其他分享 >Unity 简易的UI背景昼夜轮替效果

Unity 简易的UI背景昼夜轮替效果

时间:2022-12-13 15:02:11浏览次数:70  
标签:IsTimeLapse Direction NightLight gameObject Unity DayLight UI 轮替


在UI背景上实现一个简易的有光影照射的昼夜轮替效果,往往比一个死板的UI背景看起来更加形象生动,比较传统的方式是多图轮流替换的序列帧动画,不过要达到整个UI背景大图的所有地方都产生光影效果,那么务必每张图都是全屏大图,这样的话资源浪费又过于严重了;高端点的话,可以用shader来实现,不过本文会以一种更简单的方式实现这种效果。


主要的思路是为UI背景图片指定一个材质,新建一个默认材质就可以了,让它可以接收光照,然后在指定的位置加入灯光并适当调节,就可以达到很好的光影效果了。

Unity 简易的UI背景昼夜轮替效果_Unity


首先在场景中创建一个点光源作为夜晚的月亮,创建一个方向光作为白天的阳光,然后变化这两个灯光的强度以达到昼夜轮替效果,代码如下:

//夜晚灯光
private Light NightLight;
//白天灯光
private Light DayLight;
//昼夜轮替速度
public float _Speed = 0.2f;
//一天的时间
public int _Time = 3;
//昼夜轮替方向
private int _Direction = -1;
//开启昼夜轮替的时间流逝
private bool _IsTimeLapse = false;

void Start () {
NightLight = GlobalManager._Login.FindChild("夜晚灯光").GetComponent<Light>();
DayLight = GlobalManager._Login.FindChild("白天灯光").GetComponent<Light>();
//初始一天时间结束后昼夜轮替开始
StartCoroutine(GlobalManager._Tool.DelayToInvokeDo(delegate() {
_IsTimeLapse = true;
}, _Time));
}
void Update () {
if (GlobalManager._Login.gameObject.activeSelf)
{
//开启昼夜轮替
if (_IsTimeLapse)
{
//白天状态
if (DayLight.gameObject.activeSelf)
{
//通过修改灯光强度以体现时间流逝的效果
DayLight.intensity += Time.deltaTime * _Speed * _Direction;
//白天灯光强度为0,标示着白天结束
if (DayLight.intensity <= 0 && _Direction < 0)
{
//进入夜晚
DayLight.gameObject.SetActive(false);
NightLight.gameObject.SetActive(true);
_Direction *= -1;
return;
}
//白天持续中
if (DayLight.intensity >= 1 && _Direction > 0)
{
_Direction *= -1;
_IsTimeLapse = false;
//一天时间结束后再开启时间流逝
StartCoroutine(GlobalManager._Tool.DelayToInvokeDo(delegate () {
_IsTimeLapse = true;
}, _Time));
return;
}
}
//夜晚状态
if (NightLight.gameObject.activeSelf)
{
//通过修改灯光强度以体现时间流逝的效果
NightLight.intensity += Time.deltaTime * _Speed * _Direction;
//夜晚灯光强度为0,标示着夜晚结束
if (NightLight.intensity <= 0 && _Direction < 0)
{
//进入白天
DayLight.gameObject.SetActive(true);
NightLight.gameObject.SetActive(false);
_Direction *= -1;
return;
}
//夜晚持续中
if (NightLight.intensity >= 1 && _Direction > 0)
{
_Direction *= -1;
_IsTimeLapse = false;
//一天时间结束后再开启时间流逝
StartCoroutine(GlobalManager._Tool.DelayToInvokeDo(delegate () {
_IsTimeLapse = true;
}, _Time));
return;
}
}
}
}
}


DelayToInvokeDo是一个延时执行函数,参照我的​​另一篇博客​​。

我这里随便找了一张图片,可以看到效果图还是不错的。

白天(阳光最强时):

Unity 简易的UI背景昼夜轮替效果_UGUI_02

黄昏(阳光变弱):

Unity 简易的UI背景昼夜轮替效果_Unity_03

夜晚(窗顶上的那个是月亮):

Unity 简易的UI背景昼夜轮替效果_UI_04


标签:IsTimeLapse,Direction,NightLight,gameObject,Unity,DayLight,UI,轮替
From: https://blog.51cto.com/u_15911199/5934160

相关文章

  • 自助取数、即席分析...瓴羊Quick BI助力企业数字化转型
    数据时代下,无论企业体量如何,在企业经营管理过程中都会产生海量数据,这些数据对企业发展而言是难得的资产,需要充分挖掘数据价值,助力企业经营决策,推动企业实现持续发展。部分企......
  • 手动build unity3d的docker镜像
    手动buildunity3d的docker镜像参考资料docker官方文档:​​DockerDocumentation|DockerDocumentation​​unity3dlinux版的论坛链接,在这里能找到各个版本,以及需要安装......
  • Unity UGUI
    超详细的基础教程传送门:(持续更新中)UnityUGUI的教程好少,幸亏找到一个UGUI的Demo,看了几个例子,以下是一些简单的学习笔记:1.导入UI图片资源2.设置参数:            ......
  • The Complete Guide to C++ Strings, Part II - String Wrapper Classes
    TheCompleteGuidetoC++Strings,PartII-StringWrapperClasses IntroductionSinceC-stylestringscanbeerror-proneanddifficulttomanage,......
  • unity shaderlab Blend操作
    原文链接: ​​http://www.tiankengblog.com/?p=84​​Blend混合操作是作用于在所有计算之后,是Shader渲染的最后一步,进行Blend操作后就可以显示在屏幕上。shader的计算步骤......
  • 【Unity】超级坦克大战(二)游戏流程
    更新日期:2020年7月9日。项目源码:在终章发布索引​​本章最佳实践​​​​正式开始​​​​登录流程​​​​准备流程​​​​关卡选择流程​​​​闯关流程​​​​启用所......
  • Unity UGUI图文混排(五) -- 一张图集对应多个Text
    继上一篇说的更新了一张图集对应多个Text的功能,为了节省资源嘛这里,但是也没有舍弃之前的一个Text一个图集,因为我感觉应该两个都有用,于是我重新写了一个脚本1.其实大体跟前面......
  • 【Unity】超级坦克大战(三)登录界面
    更新日期:2020年7月9日。项目源码:在终章发布索引​​本章最佳实践​​​​正式开始​​​​创建UI编辑场景​​​​创建登录界面UI实体​​​​创建登录界面UI逻辑类​​​......
  • Effective Java-2. 当构造方法参数过多时使用builder模式
    背景静态工厂和构造方法不能很好的拓展到很多可选参数的场景,因为参数过多的时候,调用其构造方法不太能知道每个位置参数的含义,容易出bug那么为这个类编写什么样下的构造方......
  • 【Unity】超级坦克大战(一)搭建项目、导入框架、前期开发准备
    更新日期:2020年7月9日。项目源码:在终章发布免责声明:超级坦克大战使用的图片、音频等所有素材均有可能来自互联网,本专栏所有文章仅做学习和教程目的,不会将任何素材用于任何......