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

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

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

  1. //夜晚灯光
  2. private Light NightLight;
  3. //白天灯光
  4. private Light DayLight;
  5. //昼夜轮替速度
  6. public float _Speed = 0.2f;
  7. //一天的时间
  8. public int _Time = 3;
  9. //昼夜轮替方向
  10. private int _Direction = -1;
  11. //开启昼夜轮替的时间流逝
  12. private bool _IsTimeLapse = false;
  13.  
  14. void Start () {
  15. NightLight = GlobalManager._Login.FindChild("夜晚灯光").GetComponent<Light>();
  16. DayLight = GlobalManager._Login.FindChild("白天灯光").GetComponent<Light>();
  17. //初始一天时间结束后昼夜轮替开始
  18. StartCoroutine(GlobalManager._Tool.DelayToInvokeDo(delegate() {
  19. _IsTimeLapse = true;
  20. }, _Time));
  21. }
  22. void Update () {
  23. if (GlobalManager._Login.gameObject.activeSelf)
  24. {
  25. //开启昼夜轮替
  26. if (_IsTimeLapse)
  27. {
  28. //白天状态
  29. if (DayLight.gameObject.activeSelf)
  30. {
  31. //通过修改灯光强度以体现时间流逝的效果
  32. DayLight.intensity += Time.deltaTime * _Speed * _Direction;
  33. //白天灯光强度为0,标示着白天结束
  34. if (DayLight.intensity <= 0 && _Direction < 0)
  35. {
  36. //进入夜晚
  37. DayLight.gameObject.SetActive(false);
  38. NightLight.gameObject.SetActive(true);
  39. _Direction *= -1;
  40. return;
  41. }
  42. //白天持续中
  43. if (DayLight.intensity >= 1 && _Direction > 0)
  44. {
  45. _Direction *= -1;
  46. _IsTimeLapse = false;
  47. //一天时间结束后再开启时间流逝
  48. StartCoroutine(GlobalManager._Tool.DelayToInvokeDo(delegate () {
  49. _IsTimeLapse = true;
  50. }, _Time));
  51. return;
  52. }
  53. }
  54. //夜晚状态
  55. if (NightLight.gameObject.activeSelf)
  56. {
  57. //通过修改灯光强度以体现时间流逝的效果
  58. NightLight.intensity += Time.deltaTime * _Speed * _Direction;
  59. //夜晚灯光强度为0,标示着夜晚结束
  60. if (NightLight.intensity <= 0 && _Direction < 0)
  61. {
  62. //进入白天
  63. DayLight.gameObject.SetActive(true);
  64. NightLight.gameObject.SetActive(false);
  65. _Direction *= -1;
  66. return;
  67. }
  68. //夜晚持续中
  69. if (NightLight.intensity >= 1 && _Direction > 0)
  70. {
  71. _Direction *= -1;
  72. _IsTimeLapse = false;
  73. //一天时间结束后再开启时间流逝
  74. StartCoroutine(GlobalManager._Tool.DelayToInvokeDo(delegate () {
  75. _IsTimeLapse = true;
  76. }, _Time));
  77. return;
  78. }
  79. }
  80. }
  81. }
  82. }

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. 【docker简易笔记】docker基础信息的分享

    docker 使用的频率越来越高,所以在后续的一些博客中会分享一些docker的安装和使用. 一.docker介绍   "Docker 最初是 dotCloud 公司创始人 Solomon ...

  2. bzip2

    压缩和解压缩文件bzip2 options] [file-list] bunzip2 [options] [file-list] bzcat [options] [file-list] bzip2re ...

  3. Flexible DEMO 实现手淘H5页面的终端适配

    <!DOCTYPE html> <html> <head> <title>淘宝flexiblejs</title> <meta cha ...

  4. Gleb And Pizza CodeForces - 842B

    CodeForces - 842B #include<bits/stdc++.h> using namespace std; int main() { int r,d,t; double ...

  5. PTA中如何出Java题目?

    PTA中如何出Java题目? 很多第一次出题的老师,不知道Java在PTA中是如何处理输入的.写一篇文章供大家参考.比如以下这样的一个题目: 从控制台读入两个数,然后将其相加输出. 对于该题可以有如下 ...

  6. 开机小脚本自动打开sublime text 和git-bash

    set subl="C:\Program Files (x86)\Sublime Text 3\subl.exe" set git-bash="C:\Program Fi ...

  7. Programming In Scala笔记-第六章、函数式对象

    这一章主要是以定义和完善一个有理数类Rational为线索,分析和介绍有关类定义,构造函数,方法重写,变量定义和私有化,以及对操作符的定义等. 一.Rational类定义和构造函数 1.定义一个空类 ...

  8. Kafka系列之-自定义Producer

    前面已经讲到了,在Kafka中,Message是由Producer产生的,Producer产生的Message会发送到Topic的指定Partition中.Producer可以有多种形式,也可以由用户 ...

  9. 剑指Offer——知识点储备-J2EE基础

    剑指Offer--知识点储备-J2EE基础 9.2 jdk 1.8的新特性(核心是Lambda 表达式) 参考链接:http://www.bubuko.com/infodetail-690646.ht ...

  10. JVM远程DEBUG(JPDA )

    原理 1. JPDA简介 JPDA(Java Platform Debugger Architecture)为Java平台上的调试器定义了一个标准的体系结构.该体系结构包括3个主要组成部分:JVM T ...