您的位置:首页 > 移动开发 > Unity3D

给Unity中的模型动态改材质(也可应用于一个模型有多个材质球)

2017-03-31 11:10 866 查看
在仿真应用中,切换红外效果,地形,树木,如果是模型的话,直接更改材质球或者改材质球的图片,但是对于场景中刷出来的树木,更改材质,可以实现更改但是,暂时没有找到办法更改材质后使预制体应用,只有应用以后才会出现效果,如果不点应用是无法切换的,开始还有停止运行的时候会自动应用。

今天总结的是模型中对于多个材质球的更改,动态更改材质球里面的图片。(可用于一个模型中有多个材质球的情况)







[csharp] view
plain copy

 





using UnityEngine;  

using System.Collections;  

  

public class ChangeController : MonoBehaviour {  

      

    // Use this for initialization  

    void Start () {  

      

    }  

      

    // Update is called once per frame  

    void Update () {  

        if(Input.GetKeyDown(KeyCode.H))  

        {  

            for (int i = 0; i < transform.childCount; i++)  

            {  

                transform.GetChild(i).GetComponent<ChangeTextureCeShi>().isChangeInfraredScene = true;  

            }  

        }  

        if(Input.GetKeyDown(KeyCode.P))  

        {  

            for (int i = 0; i < transform.childCount; i++)  

            {  

                transform.GetChild(i).GetComponent<ChangeTextureCeShi>().isChangeNormalScene = true;  

            }  

        }  

    }  

}  

[csharp] view
plain copy

 





using UnityEngine;  

using System.Collections;  

  

public class ChangeTextureCeShi : MonoBehaviour {  

    [HideInInspector]  

    public bool isChangeInfraredScene = false;  

    [HideInInspector]  

    public bool isChangeNormalScene = false;  

    // Use this for initialization  

    void Awake () {  

          

    }  

      

    // Update is called once per frame  

    void Update () {  

        if(isChangeInfraredScene)  

        {  

            for (int i = 0; i < transform.GetComponent<MeshRenderer>().materials.Length; i++)  

            {  

                string  str = transform.GetComponent<MeshRenderer>().materials[i].name.Substring(0, 16);  

                transform.GetComponent<MeshRenderer>().materials[i].mainTexture = (Texture)Resources.Load(str + "(1)");                 

            }  

            isChangeInfraredScene = false;  

        }  

        else if(isChangeNormalScene)  

        {  

            for (int i = 0; i < transform.GetComponent<MeshRenderer>().materials.Length; i++)  

            {  

                string str = transform.GetComponent<MeshRenderer>().materials[i].name.Substring(0, 16);  

                transform.GetComponent<MeshRenderer>().materials[i].mainTexture = (Texture)Resources.Load(str);  

            }  

            isChangeNormalScene = false;  

        }  

    }  

}  

在切换的时候材质球的名称改变多了个空格+(Instance),所以用字符串截取,因为图片名字与材质球名字相同,所以用这种方法,也可以改成别的,也可以建立两个集合,集合里面存放Texture类型的两种红外模式与正常模式的贴图,用循环来控制改变图片。

结果如下:





补充:换材质球的图片可以,有时候也会很麻烦,下面是整体替换材质球的办法,用数组角标替换或者用循环替换发现是不可以的,方法是将模型中的整个材质数组给替换掉代码如下:

public Material[] MatAry;
public Material[] mat;
public GameObject obj;
MatAry = obj.GetComponent<Renderer>().materials;
MatAry = mat;
obj.GetComponent<Renderer>().materials = MatAry;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: