在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. es6新增

    首先要说let,他是只在代码块中执行的变量,例如: {    let a = 10;    var b = 1;}console.log(a);//definedconsole.log(b);//1 ...

  2. MySQL数据类型DECIMAL用法

    MySQL DECIMAL数据类型用于在数据库中存储精确的数值.我们经常将DECIMAL数据类型用于保留准确精确度的列,例如会计系统中的货币数据. 要定义数据类型为DECIMAL的列,请使用以下语法: ...

  3. Spring-cloud (七)自定义HystrixCommand

    前提 1.在继续学习Hystrix之前,向关注本人博客的各位致歉 由于之前的项目起名以及服务之间的名称不是很规范,所以我修改了这些名称方便后来的代码管理,这些代码可以在本人github中找到,这里贴出 ...

  4. 动态SQL中不同变量的写法总结

    .一般变量的写法: if (str_kind is not null) then l_str_kind := str_kind; v_wheresql := v_wheresql || ' and k ...

  5. Linux下端口复用(SO_REUSEADDR与SO_REUSEPORT)

    freebsd与linux下bind系统调用小结:    只考虑AF_INET的情况(同一端口指ip地址与端口号都相同) freebsd支持SO_REUSEPORT和SO_REUSEADDR选项,而l ...

  6. IntelliJ Idea 设置 Dialyzer

    IntelliJ Idea 设置 Dialyzer(金庆的专栏)Erlang开发使用IDEA IDE可以设置外部工具Dialyzer, 然后就可以直接Tools->External Tools ...

  7. python 函数运算先于单目运算

    >>> def f(): >>> -f() - 初一看,-f()比较陌生的样子,细想,这是合理的

  8. hive数据类型及其数据转换

    由于需要使用hive sql进行数据查询,同时涉及多个不同类型的字段的组合,看Hive sql的文档相关和资料才知道,hive是支持大部分基础数据类型之间的相互转换的. 那么,hive本身支持哪些数据 ...

  9. Dynamics CRM2016 Web API之Use custom FetchXML

    CRM2016中新增的web api支持fetch xml了,之前使用FetchXML的场景是在后天代码中通过组织服务的retrieve multiple方法,但实际的应用效果有多大,还需要在实际的项 ...

  10. Dynamics CRM2016 Web API之Expand related entities & $ref & $count

    本篇介绍两个关于1:N关系中通过主实体取关联子实体的api,这两个api会经常被用到而且比原来的odata方式更加方便,之前如果我们要取主实体下所有的关联实体的记录都是通过Retrieve Multi ...