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

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

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

//夜晚灯光
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背景昼夜轮替效果的更多相关文章

  1. iOS开发UI篇—无限轮播(循环利用)

    iOS开发UI篇—无限轮播(循环利用) 一.无限轮播  1.简单说明 在开发中常需要对广告或者是一些图片进行自动的轮播,也就是所谓的无限滚动. 在开发的时候,我们通常的做法是使用一个UIScrollV ...

  2. iOS开发UI篇—无限轮播(新闻数据展示)

    iOS开发UI篇—无限轮播(新闻数据展示) 一.实现效果        二.实现步骤 1.前期准备 (1)导入数据转模型的第三方框架MJExtension (2)向项目中添加保存有“新闻”数据的pli ...

  3. iOS开发UI篇—无限轮播(循环展示)

    iOS开发UI篇—无限轮播(循环展示) 一.简单说明 之前的程序还存在一个问题,那就是不能循环展示,因为plist文件中只有五个数组,因此第一个和最后一个之后就没有了,下面介绍处理这种循环展示问题的小 ...

  4. iOS开发UI篇—无限轮播(功能完善)

    iOS开发UI篇—无限轮播(功能完善) 一.自动滚动 添加并设置一个定时器,每个2.0秒,就跳转到下一条. 获取当前正在展示的位置. [self addNSTimer]; } -(void)addNS ...

  5. unity 背景无限循环滚动效果

    背景无限循环滚动效果如下示: 步骤如下: 导入背景图片后,设置图片的格式,如下图: 2.图片格式也可以设置是Texture格式,但是Wrap Mode 一定要是Repeat[重复发生]:然后记得App ...

  6. Android开发案例 设置背景图片轮播

    点击按钮实现图片轮播效果 实践案例: xml <?xml version="1.0" encoding="utf-8"?> <LinearLa ...

  7. Android使用ViewPager实现左右循环滑动及轮播效果

    边界的时候会看到一个不能翻页的动画,可能影响用户体验.此外,某些区域性的ViewPager(例如展示广告或者公告之类的ViewPager),可能需要自动轮播的效果,即用户在不用滑动的情况下就能够看到其 ...

  8. viewPager+Handler+Timer简单实现广告轮播效果

    基本思想是在Avtivity中放一个ViewPager,然后通过监听去实现联动效果,代码理由详细的解释,我就不说了. MainActivity.java package com.example.adm ...

  9. Android UI - 实现广告Banner旋转木马效果

    Android UI - 实现广告Banner旋转木马效果 前言 本篇博客要分享的一个效果是实现广告Banner轮播效果,这个效果也比較常见,一些视频类应用就常常有,就拿360影视大全来举例吧: 用红 ...

随机推荐

  1. Linux常用命令大全(归类)

    最近都在和Linux打交道,这方面基础比较薄弱的我只好买了本鸟哥的书看看,感觉还不错.我觉得Linux相比windows比较麻烦的就是很多东西都要用命令来控制,当然,这也是很多人喜欢linux的原因, ...

  2. Linux 软件安装到 /usr,/usr/local/ 还是 /opt 目录区别

    Linux 的软件安装目录是也是有讲究的,理解这一点,在对系统管理是有益的 /usr:系统级的目录,可以理解为C:/Windows/, /usr/lib理解为C:/Windows/System32./ ...

  3. [Luogu 1516] 青蛙的约会

    Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事 ...

  4. Enum枚举

    Java Enum原理 public enum Size{ SMALL, MEDIUM, LARGE, EXTRA_LARGE }; 实际上,这个声明定义的类型是一个类,它刚好有四个实例,在此尽量不要 ...

  5. Unrecognized token 'XXXX': was expecting ('true', 'false' or 'null')

    原因是,返回或发送数据格式不规范. 当dataType指定为json后,1.4+以上的jquery版本对json格式要求更加严格.如果不是严格的json格式,就不能正常执行success回调函数. J ...

  6. SVN错误:SVN Working copy XXX is too old

    出错原因: 这是因为使用了低版本的svn生成了.svn内文件内容,但是,使用高版本svn同步时便出现该问题. 解决方法: 找到报错对应的文件夹,里面有个名为.svn的文件夹,删除这个文件夹(这是svn ...

  7. 解读Raft(二 选举和日志复制)

    Leader election Raft采用心跳机制来触发Leader选举.Leader周期性的发送心跳(如果有正常的RPC的请求情况下可以不发心跳)包保持自己Leader的角色(避免集群中其他节点认 ...

  8. 设计模式一日一练:中介者模式(Mediator)

    Mediator模式,用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式的相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 比较典型的例子是联合国.QQ群等.比如,如果中国有 ...

  9. vue以及js的一些坑或常用技巧

    判断空object Object.getOwnPropertyNames(obj).length === 0 模拟range Array.apply(null, Array(5)).map(funct ...

  10. Oracle性能优化-读懂执行计划

    Oracle的执行计划 得到执行计划的方式 Autotrace例子 使用Explain explain plan set STATEMENT_ID='testplan' for select * fr ...