找回密码
 立即注册
查看: 288|回复: 0

[简易教程] Unity脚本控制材质之间过渡

[复制链接]
发表于 2022-3-3 10:07 | 显示全部楼层 |阅读模式
本节是之前学习笔记的拓展:(之前学习笔记如下)
本节通过脚本实现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;                // 则输出值逐渐减小
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-5-8 10:25 , Processed in 0.172435 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表