IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> unity替换模型材质 -> 正文阅读

[游戏开发]unity替换模型材质

?我们用一个柜门的模型做例子,这个模型一共有8个材质,正常思路是通过获取模型的Meshenderer组件下的Materials中的材质,然后将这些材质替换成图片中cube的红色材质?

using System.Collections.Generic;
using UnityEngine.UI;
using UnityEngine;
using System;



public class Test : MonoBehaviour
{
    public Transform obj;
    public Material tmMat; //透明材质

    void Start()
    {
        //获取全部材质
        for (int i = 0; i < obj.GetComponent<MeshRenderer>().materials.Length; i++)
        {
            obj.GetComponent<MeshRenderer>().materials[i] = tmMat; //一个一个替换成透明材质
        }
    }
}

?运行后发现效果并没有改变:

?为什么呢?因为材质替换是通过传递一个材质数组进行计算的,所以一个一个替换无法完成效果

Note that like all arrays returned by Unity, this returns a copy of materials array. If you want to change some materials in it, get the value, change an entry and set materials back.

知道原因了,我们在来修改一下代码

using System.Collections.Generic;
using UnityEngine.UI;
using UnityEngine;
using System;



public class Test : MonoBehaviour
{
    public Transform obj;
    public Material tmMat; //透明材质

    Material[] newTmMatArray;//透明材质数组

    void Start()
    {
        newTmMatArray = new Material[obj.GetComponent<MeshRenderer>().materials.Length];//数组初始化长度

        //获取全部材质
        for (int i = 0; i < newTmMatArray.Length; i++)
        {
            newTmMatArray[i] = tmMat;
        }

        obj.GetComponent<MeshRenderer>().materials = newTmMatArray;//将透明数组赋给模型材质
    }
}

效果:哈哈 成功。

?接下来优化一下,一个机柜由 前后柜门和柜体组成,按下J键让模型透明,按下K键让模型复原,

?思路:

1.创建一个 TMObj类,该类用来存储单个模型 和 这个模型的原材质数组,并且在新建类的时候通过构造给两个字段赋值

//透明模型 数据
public class TMObj
{
    public Transform obj;//模型
    public Material[] objMatArray;//模型原材质(用于还原透明)

    public TMObj(Transform _obj)
    {
        obj = _obj;
        objMatArray = new Material[obj.GetComponent<MeshRenderer>().materials.Length];
        for (int i = 0; i < obj.GetComponent<MeshRenderer>().materials.Length; i++)
        {
            objMatArray[i] = obj.GetComponent<MeshRenderer>().materials[i];
        }
    }
}

2.添加List<TransForm> objList 和List<TMObj> tmObjList字段.objList存储机柜的 前后柜门和柜体,开始时遍历这个list字段列表,将TMObj这个类充当数据用,添加到tmObjList中

using System.Collections.Generic;
using UnityEngine.UI;
using UnityEngine;
using System;

public class Test : MonoBehaviour
{
    public Material tmMat; //透明材质
    public List<Transform> objList;
    public List<TMObj> tmObjList;

    Material[] newTmMatArray;//透明材质数组

    void Start()
    {
        tmObjList = new List<TMObj>();
        for (int i = 0; i < objList.Count; i++)
        {
            TMObj tmObj = new TMObj(objList[i]);
            tmObjList.Add(tmObj);
        }
    }
}

3.在Update中设置按下J键透明,K键还原

using System.Collections.Generic;
using UnityEngine.UI;
using UnityEngine;
using System;



public class Test : MonoBehaviour
{
    public Material tmMat; //透明材质
    public List<Transform> objList;
    public List<TMObj> tmObjList;

    Material[] newTmMatArray;//透明材质数组

    void Start()
    {
        tmObjList = new List<TMObj>();
        for (int i = 0; i < objList.Count; i++)
        {
            TMObj tmObj = new TMObj(objList[i]);
            tmObjList.Add(tmObj);
        }

    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.J))
        {
            Debug.Log("透明");
            for (int i = 0; i < tmObjList.Count; i++)
            {
                newTmMatArray = new Material[tmObjList[i].obj.GetComponent<MeshRenderer>().materials.Length];
                for (int j = 0; j < tmObjList[i].obj.GetComponent<MeshRenderer>().materials.Length; j++)
                {
                    newTmMatArray[j] = tmMat;
                }
                tmObjList[i].obj.GetComponent<MeshRenderer>().materials = newTmMatArray;
            }

        }
        if (Input.GetKeyDown(KeyCode.K))
        {
            Debug.Log("不透明");

            for (int i = 0; i < tmObjList.Count; i++)
            {
                tmObjList[i].obj.GetComponent<MeshRenderer>().materials = tmObjList[i].objMatArray;
            }
        }
    }
}

效果:

效果完成。?

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-11-24 08:17:37  更:2021-11-24 08:17:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 23:55:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码