给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;
今天总结的是模型中对于多个材质球的更改,动态更改材质球里面的图片。(可用于一个模型中有多个材质球的情况)
[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;
相关文章推荐
- 【Unity学习笔记】动态更改多个材质球(materials数组)
- 在一个消息响应函数中响应多个动态生成的按钮点击事件
- 多维材质模型烘培入Unity教程
- unity打包模型存在的一个问题
- 关于unity动态添加游戏对象问题,如何动态添加一个菜单【二】
- 关于unity动态添加游戏对象问题,如何动态添加一个菜单【一】
- wpf中给一个三维模型设置多种材质效果
- struts2中一个表单中提交多个请求(动态调用方法)
- yii 一个表单提交多个模型
- NGUI实用操练(六)如何在代码中动态设置一个模型至于UI层上?【NGUI2.6.3】
- unity多人开发,更新svn后材质丢失(模型贴图全变紫)的问题
- 一个动态改变模型大小、方向的例子
- 分享一个Unity 应用于”室内设计”的案例
- unity基础开发-- 动态改变模型大小、方向
- yii 一个表单提交多个模型数据
- 将动态建模技术应用于商业模型
- yii 一个表单提交多个模型数据
- struts2.3.1.2 使用动态方法配置 Action,使得一个Action可以处理多个请求
- unity打包模型存在的一个问题
- Unity导入FBX文件部分模型丢失材质的BUG