|
本节是之前学习笔记的拓展:(之前学习笔记如下)
本节通过脚本实现2个场景光照效果的过渡:白天->黑夜
视频教程:
https://www.zhihu.com/video/1480980689797984257
<hr/>场景解释:
场景中有2个相同Prefab,每个Prefab都有1个Logo和1个Room
- Logo有一个材质:白天材质L23_Logo_01、夜晚材质L23_Logo_02
- Room有两个材质:主白天材质L23_Building_01、主夜晚材质L23_Building_02;自发光白天材质L23_Emitting_01、自发光夜晚材质L23_Emitting_02
- 01和02材质是来源于同一个Shader的不同参数的材质
白天
夜晚
<hr/>脚本代码:
//引用命名空间
using System; // 主命名空间 包含所有.net基础类型和通用类型 这里用于获取系统时间
using UnityEngine; // Unity引擎命名空间 这里需使用UnityEngine定义的相关类和类方法,(如下面的 Material类 ,就需要)
public class L23_SystemTime_Mat : MonoBehaviour
{
//-----public-----
//【Room材质】
public Material L23_BuilidingMaterial_Morning; // 材质类,Building白天主材质[0]
public Material L23_BuilidingMaterial_Night; // 材质类,Building夜晚主材质[0]
public Material L23_EmittingMaterial_Morning; // 材质类,Building白天自发光主材质[1]
public Material L23_EmittingMaterial_Night; // 材质类,Building夜晚自发光主材质[1]
public Renderer My_Renderer_Room; // 【渲染对象类,Room物体】
//【Logo材质】
public Material L23_LogoMaterial_Morning; //材质类,Logo白天自发光材质
public Material L23_LogoMaterial_Night; //材质类,Logo夜晚自发光材质
public Renderer My_Renderer_Logo; // 渲染对象类
void Start()
{
if (L23_BuilidingMaterial_Morning == null && L23_BuilidingMaterial_Night == null && // 判断是否赋予了资源
L23_EmittingMaterial_Morning == null && L23_EmittingMaterial_Night == null &&
My_Renderer_Room == null) return;
if (L23_LogoMaterial_Morning == null && L23_LogoMaterial_Night == null && // 判断是否赋予了资源
My_Renderer_Logo == null) return;
}
void Update()
{
//【时间变量】
int sysSecond = System.DateTime.Now.Second; // Get系统时间:秒(int型) 0~60
float sysSecond_Lerp = Mathf.PingPong(sysSecond, 30) / 30.0f; // 秒数控制Lerp值,范围0~1 ,且在平滑过渡,不会在60->0时突变
// Mathf.PingPong(t, length); 的解释————————输出值在0~length,且随着t逐渐增大,会在0和length之间来回过渡
/* 具体函数写法——本人解释
function PingPong(float t, float length) { // 一般t是一直加的数
int Integer_part = floor(t / length); // 获取2者相除整数部分
if ( Integer_part mod 2 == 0) // 若Integer_part 为偶数,
return t - Integer_part * length; // 则输出值逐渐增大
else //若Integer_part 为奇数,
return (Integer_part + 1)* length - t; // 则输出值逐渐减小
}
*/
//【控制Room的材质】
My_Renderer_Room.materials[0].Lerp(L23_BuilidingMaterial_Morning, L23_BuilidingMaterial_Night, sysSecond_Lerp); // 渲染对象Room的材质0 的值,用时间控制2个材质的过渡,下面同理
My_Renderer_Room.materials[1].Lerp(L23_BuilidingMaterial_Morning, L23_BuilidingMaterial_Night, sysSecond_Lerp); // 渲染对象Room的材质1 的值
//【控制Logo的材质】
My_Renderer_Logo.material.Lerp(L23_LogoMaterial_Morning, L23_LogoMaterial_Night, sysSecond_Lerp); // 渲染对象Logo的材质 的值
}
}脚本使用:将脚本拖入到场景中的任意物体中,我是习惯拖到Prefab中,对材质和渲染对象赋值,当然渲染对象的初始材质的Shader来源必须正确
<hr/>补充:有关Mathf.PingPong函数:
根据t,实现输出值在0到 length 之间来回过渡
// PingPong具体函数写法——本人猜想解释
function PingPong(float t, float length) { // 一般t是一直加的数
int Integer_part = floor(t / length); // 获取2者相除整数部分
if ( Integer_part mod 2 == 0) // 若Integer_part 为偶数,
return t - Integer_part * length; // 则输出值逐渐增大
else //若Integer_part 为奇数,
return (Integer_part + 1)* length - t; // 则输出值逐渐减小
} |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|