Skip to main content
 首页 » 资源教程

Unity3D如何用脚本动态更改Skybox颜色和材质

2016年08月19日 18:19:5910290

修改天空盒颜色的例子(C#):

1
2
3
4
5
6
7
8
9
10
11
12
using UnityEngine;
using System.Collections;
 
public class example : MonoBehaviour {
    public Color colorStart = Color.blue;
    public Color colorEnd = Color.green;
    public float duration = 1.0F;
    void Update() {
        float lerp = Mathf.PingPong(Time.time, duration) / duration;
        RenderSettings.skybox.SetColor("_Tint", Color.Lerp(colorStart, colorEnd, lerp));
    }
}

修改天空盒材质的例子(C#):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 加载所有 skybox 纹理
Texture2D sbFront = Resources.Load("Texture/Skybox/skybox_Front") as Texture2D;
Texture2D sbBack = Resources.Load("Texture/Skybox/skybox_Back") as Texture2D;
    ...
 
// 创建新的 SkyBox 材质
Material mySkyBoxMat = new Material(Resources.Load("Shaders/myOwnSkyboxShader") as Shader);
 
// 将所有纹理添加到材质中
mySkyBoxMat.SetTexture("_FrontTex", sbFront);
mySkyBoxMat.SetTexture("_BackTex", sbBack);
 
// 设置RenderSettings skybox 变量
RenderSettings.skybox = mySkyBoxMat;

稍微完整些的例子(C#):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
using UnityEngine;
using System.Collections;
 
public class SkyboxSetter : MonoBehaviour
{
    // 创建Skybox材质
    public static Material CreateSkyboxMaterial(SkyboxManifest manifest)
    {
        Material result = new Material(Shader.Find("RenderFX/Skybox"));
        result.SetTexture("_FrontTex", manifest.textures[0]);
        result.SetTexture("_BackTex", manifest.textures[1]);
        result.SetTexture("_LeftTex", manifest.textures[2]);
        result.SetTexture("_RightTex", manifest.textures[3]);
        result.SetTexture("_UpTex", manifest.textures[4]);
        result.SetTexture("_DownTex", manifest.textures[5]);
        return result;
    }
 
    public Texture2D[] textures;
 
    void OnEnable()
    {
        SkyboxManifest manifest = new SkyboxManifest(textures[0], textures[1], textures[2], textures[3], textures[4], textures[5]);
        Material material = CreateSkyboxMaterial(manifest);
        SetSkybox(material);
        enabled = false;
    }
 
    // 材质加到天空盒
    void SetSkybox(Material material)
    {
        GameObject camera = Camera.main.gameObject;
        Skybox skybox = camera.GetComponent<Skybox>();
        if (skybox == null)
            skybox = camera.AddComponent<Skybox>();
        skybox.material = material;
    }
}
 
public struct SkyboxManifest
{
    public Texture2D[] textures;
 
    public SkyboxManifest(Texture2D front, Texture2D back, Texture2D left, Texture2D right, Texture2D up, Texture2D down)
    {
        textures = new Texture2D[6]
        {
            front,
            back,
            left,
            right,
            up,
            down
        };
    }
}

 代码测试结果:

按照RenderSettings.skybox = mySkyBoxMat;方式设置并没有成功,用下面例子中的SetSkybox运行成功。

 

需要注意的是,Texture目录需要放在Resources目录下,最终的目录结构是这样的:

项目主目录/Assets/Resources/Textures/Skybox/skybox_Front.jpg

评论列表暂无评论
发表评论