Unity游戏运行中动态切换你的天空盒
今天在项目中遇到一个需要需要在项目运行中动态调整天空盒的效果,简单查了下资料,做了个DEMO,分享给Unity同行们。
内容来自:休闲社交游戏-淘金城堡课程
课程地址:Unity中文课堂 https://learn.u3d.cn/tutorial/xiu-xian-she-jiao-you-xi-tao-jin-cheng-bao
作者公众号
- 首先看下基本知识概念
在 Unity 中,天空盒是使用天空盒着色器的一种材质。有关可用的天空盒着色器的信息,请参阅天空盒着色器。
天空盒着色器:Unity 提供了多个天空盒着色器供您使用。每个着色器使用一组不同的属性和生成技术。每个着色器都属于以下两类之一:
纹理化:从一个或多个纹理生成一个天空盒。源纹理代表各个方向的背景视图。此类别中的天空盒着色器有:
1)6面天空盒
此天空盒着色器从六个单独纹理生成一个天空盒。每个纹理代表沿特定世界轴的天空视图。为了方便说明,可以将场景视为位于立方体内。每个纹理代表立方体的一个内表面,所有六个纹理结合在一起形成一个无缝环境。
此天空盒着色器从单个立方体贴图资源生成一个天空盒。此立方体贴图由六个正方形纹理组成,代表全方位的整个天空视图。
为了生成天空盒,全景着色器 (Panoramic Shader) 将单个纹理以球形包裹住场景。
- 重点展示下立方体贴图 (Cubemap)天空盒着色器
1、立方体贴图天空盒的概念
此天空盒着色器从单个立方体贴图资源生成一个天空盒。此立方体贴图由六个正方形纹理组成,代表全方位的整个天空视图。
如需了解如何创建使用此天空盒着色器的材质,以及有关如何在场景中渲染天空盒的详细信息,请参阅使用天空盒。
渲染管线兼容性
功能 | 内置渲染管线 | 通用渲染管线 (URP) | 高清渲染管线 (HDRP) |
立方体贴图天空盒 | 是 | 是 | 否 |
属性
属性 | 描述 |
Tint Color | 要将天空盒着色成的颜色。Unity 将这种颜色添加到纹理以更改纹理外观,而无需更改基础纹理文件。 |
Exposure | 调整天空盒的曝光。因此可以校正天空盒纹理中的色调值。较大的值会产生曝光更强、看起来更亮的天空盒。较小的值会产生曝光更弱、看起来更暗的天空盒。 |
Rotation | 天空盒围绕正 y 轴旋转。这会更改天空盒的方向,如果希望天空盒的特定部分位于场景的特定部分后方,则此设置很有用。 |
Cubemap (HDR) | 此材质用于表示天空的立方体贴图资源。有关如何从输入纹理创建立方体贴图资源的信息,请参阅立方体贴图资源。 |
Render Queue | 确定 Unity 绘制游戏对象的顺序。有关 Render Queue 的更多信息,请参阅 SL-SubShaderTags。 |
Double Sided Global Illumination | 指定光照贴图是否在计算全局光照时考虑几何体的两面。设置为 true 时,如果使用渐进光照贴图,则背面将使用与正面相同的发射和反照率来反射光。 |
2、项目实战
1)新建项目,导入我们的立方体贴图天空盒的Unity资源,如下图
场景建立如下
- 建立天空盒材质
新建材质,如下图
材质取名“SkyBoxMat”,点击Standard下拉按钮,设置为skybox->Cubmap
然后设置立方体贴图资源,如下图
将我们上图中的资源Nebula_01_Cubemap拖动到Cubemap(HDR)项目
- 给scene设置天空盒
选择Window -> Rendering ->Lighting Settings,如下图
将新建的”SkyBoxMat”材质拖动到标签”Scene”属性字段“SkyBox Material”,效果如下
并且设置好”Sun Source”太阳光源,“source”字段选择“Skybox”。
- 添加脚本,项目运行中动态替换“立方体贴图资源”
在场景中新建一个空游戏对象,并将新建的脚本拖动上去,如下图
编写脚本,如下
[SerializeField]
private Texture[] m_SkTexture;
// Start is called before the first frame update
void Start()
{
RenderSettings.skybox.SetTexture("_Tex", m_SkTexture[0]);
StartCoroutine("SkyMotion");
}
private IEnumerator SkyMotion()
{
yield return new WaitForSeconds(2);
RenderSettings.skybox.SetTexture("_Tex", m_SkTexture[1]);
yield return new WaitForSeconds(3);
RenderSettings.skybox.SetTexture("_Tex", m_SkTexture[2]);
yield return new WaitForSeconds(3);
RenderSettings.skybox.SetTexture("_Tex", m_SkTexture[3]);
yield return new WaitForSeconds(3);
}
然后记得在Unity编辑器里给字段“SkTexture”设置四个图,如下图
运行项目,我们可以看到每隔3秒切换一次天空盒的纹理图
OK,希望我的文章可以帮助到大家。