【unity小技巧】unity3d环境带雾的昼夜系统变化

简介: 【unity小技巧】unity3d环境带雾的昼夜系统变化

眩光素材

链接:https://pan.baidu.com/s/1qlFSJSju6ZjwCylwkh14eA?pwd=veww

提取码:veww

眩光配置

眩光其实可以简单的理解为太阳或月亮

全局灯光配置

想要相机显示眩光,需要在相机添加Flare Layer组件

天空盒配置

天空盒资产

配置天空盒,开启雾

代码控制天空盒 环境 雾 灯光昼夜交替变化

public class DayAndNight : MonoBehaviour
{
    [Header("雾的颜色渐变")]
    [SerializeField] private Gradient fogGradient;
    [Header("环境光颜色渐变")]
    [SerializeField] private Gradient ambientGradient; 
    [Header("太阳光颜色渐变")]
    [SerializeField] private Gradient directionLightGradient;
    [Header("天空盒色调渐变")]
    [SerializeField] private Gradient skyboxTintGradient; 

    [Header("方向光源")]
    [SerializeField] private Light directionalLight;
    [Header("天空盒材质")]
    [SerializeField] private Material skyboxMaterial;

    [Header("白天持续时间(秒)")]
    [SerializeField] private float dayDurationInSeconds = 60f; 
    [Header("天空盒旋转速度")]
    [SerializeField] private float rotationSpeed = 1f;

    private float currentTime = 0;  // 当前时间(0-1)

    private void Update()
    {
        UpdateTime();
        UpdateDayNightCycle();
        RotateSkybox();
    }

    // 更新当前时间
    private void UpdateTime()
    {
        currentTime += Time.deltaTime / dayDurationInSeconds;
        currentTime = Mathf.Repeat(currentTime, 1f);
    }

    // 更新白天黑夜循环效果
    private void UpdateDayNightCycle()
    {
        // 计算太阳的位置
        float sunPosition = Mathf.Repeat(currentTime + 0.25f, 1f);
        directionalLight.transform.rotation = Quaternion.Euler(sunPosition * 360f, 0f, 0f);

        // 更新雾、环境光、太阳光和天空盒的颜色
        RenderSettings.fogColor = fogGradient.Evaluate(currentTime);
        RenderSettings.ambientLight = ambientGradient.Evaluate(currentTime);
        directionalLight.color = directionLightGradient.Evaluate(currentTime);
        skyboxMaterial.SetColor("_Tint", skyboxTintGradient.Evaluate(currentTime));
    }

    // 旋转天空盒
    private void RotateSkybox()
    {
        float currentRotation = skyboxMaterial.GetFloat("_Rotation");
        float newRotation = currentRotation + rotationSpeed * Time.deltaTime;
        newRotation = Mathf.Repeat(newRotation, 360f);
        skyboxMaterial.SetFloat("_Rotation", newRotation);
    }

    // 在应用程序退出时重置天空盒颜色
    private void OnApplicationQuit()
    {
        skyboxMaterial.SetColor("_Tint", new Color(0.5f, 0.5f, 0.5f));
    }
}

配置参数

配置20 25 30 70 75 80位置的灯光颜色,具体的需要根据自己的天空盒 环境等,调配出适合的颜色和过渡

效果

image.png

加眩光

image.png

参考

【视频】https://www.youtube.com/watch?v=ME6Bh9Hclgk

目录
相关文章
|
3天前
|
存储 JSON 关系型数据库
【unity实战】制作unity数据保存和加载系统——大型游戏存储的最优解
【unity实战】制作unity数据保存和加载系统——大型游戏存储的最优解
12 2
|
3天前
|
图形学
【unity实战】Unity中基于瓦片的网格库存系统——类似《逃离塔科夫》的库存系统(下)
【unity实战】Unity中基于瓦片的网格库存系统——类似《逃离塔科夫》的库存系统
9 0
|
3天前
|
图形学 容器
【unity实战】Unity中基于瓦片的网格库存系统——类似《逃离塔科夫》的库存系统(上)
【unity实战】Unity中基于瓦片的网格库存系统——类似《逃离塔科夫》的库存系统
7 0
|
3天前
|
图形学
【unity小技巧】Unity中实现一个战斗连击连招系统,可以动态添加减少连击连招段数功能
【unity小技巧】Unity中实现一个战斗连击连招系统,可以动态添加减少连击连招段数功能
5 0
|
3天前
|
存储 JSON 图形学
【unity实战】制作unity数据保存和加载系统——小型游戏存储的最优解
【unity实战】制作unity数据保存和加载系统——小型游戏存储的最优解
6 0
|
3天前
|
存储 图形学
【unity小技巧】unity事件系统创建通用的对象交互的功能
【unity小技巧】unity事件系统创建通用的对象交互的功能
7 0
|
3天前
|
图形学
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版3(附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版3(附带项目源码)
14 2
|
3天前
|
图形学
【制作100个unity游戏之28】花半天时间用unity复刻童年4399经典小游戏《黄金矿工》(附带项目源码)
【制作100个unity游戏之28】花半天时间用unity复刻童年4399经典小游戏《黄金矿工》(附带项目源码)
13 0
|
3天前
|
图形学
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)(上)
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)
10 2
|
3天前
|
图形学
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)(下)
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)(下)
8 0