Unity-代码中动态设置Material参数

一、修改之前需要设置相应的关键字

  // 贴图类型
        string[] TEXTURE_TYPE = { "_MetallicGlossMap", "_BumpMap", "_ParallaxMap", "_OcclusionMap", "_DetailMask", "_DetailAlbedoMap", "_DetailNormalMap" };

        // Material需要设置的关键字
        string[] TEXTURE_KEYWORD = { "_METALLICGLOSSMAP", "_NORMALMAP", "_PARALLAXMAP", "", "_DETAIL_MULX2",  "_DETAIL_MULX2", "_DETAIL_MULX2" };

二、比如需要修改材质球的第二贴图则进行如下设置

 // 在Material.SetTexture之前 开启相应的KeyWord
     _SelfMaterial.EnableKeyword(TEXTURE_TYPE[5]);
      其中_SelfMaterial为获取到的物体模型材质球  

三、如下为给物体材质球替换贴图脚本(实现挂载到模型的父物体,则修改子物体材质球参数脚本)

/***
*	Title:"SimpleUIFrame" UI框架项目
*		主题:视图层:修改模型贴图
*	Description:
*		功能:实现3DMax模型导入的模型材质球设置修改
*	Date:2017
*	Version:0.1版本
*	Author:Coffee
*	Modify Recoder:
*/

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

namespace View
{
	public class Test_ChangeModelTextures : MonoBehaviour
	{
        private List _Childs;                                        //所有的模型物体
        private Material _SelfMaterial;                                         //模型自身的材质球
        private int _ModelsNumbers = 0;                                         //所有模型的数量

        private Texture _ModelTextrue;                                          //模型的贴图
        private Texture _EmptyTexture = null;                                   //模型的空贴图

        public bool isChangeModelsMaterialsSettings = false;                    //是否改变模型的贴图
        private bool _IsChangeModelsMaterialsSettingsComplete = false;          //是否替换完成


        // 贴图类型
        string[] TEXTURE_TYPE = { "_MetallicGlossMap", "_BumpMap", "_ParallaxMap", "_OcclusionMap", "_DetailMask", "_DetailAlbedoMap", "_DetailNormalMap" };

        // Material需要设置的关键字
        string[] TEXTURE_KEYWORD = { "_METALLICGLOSSMAP", "_NORMALMAP", "_PARALLAXMAP", "", "_DETAIL_MULX2",  "_DETAIL_MULX2", "_DETAIL_MULX2" };

        void Start()
		{
            _Childs = new List();
            //获取到所有的模型物体
            GetAllModels();

        }

        private void Update()
        {
            
            if (isChangeModelsMaterialsSettings == true&&_IsChangeModelsMaterialsSettingsComplete==false)
            {
                Debug.Log("替换开始");
                //修改每个模型材质球的贴图以及UV设置
                ModifyEveryModelMaterialSettings();
                
            }
            if (_IsChangeModelsMaterialsSettingsComplete == true)
            {
                Debug.Log("替换完成");
                isChangeModelsMaterialsSettings = false;
                return;
            }


        }

        /// 
        /// 获取到所有的模型物体
        /// 
        private void GetAllModels()
        {
           _ModelsNumbers= this.gameObject.transform.childCount;
            if (_ModelsNumbers>=1)
            {
                //获取到所有的模型物体
                foreach (Transform model in this.gameObject.transform)
                {
                    _Childs.Add(model);
                }
            }
        }


        //修改每个模型材质球的贴图以及UV设置
        private void  ModifyEveryModelMaterialSettings()
        {
            int changeNumbers = 0;
            for (int i = 0; i < _ModelsNumbers; i++)
            {
                //修改每个模型材质球的贴图以及UV设置
                ModifyEveryModelMaterialParameter(_Childs[i].gameObject);
                Debug.Log("_Childs[0].gameObject=" + _Childs[i].gameObject);
                changeNumbers = i;
               
            }
            if (changeNumbers== _ModelsNumbers - 1)
            {
                _IsChangeModelsMaterialsSettingsComplete = true;
               
            }

            //Debug.Log("_Childs[0].gameObject=" + _Childs[0].gameObject);
            //ModifyEveryModelMaterialParameter(_Childs[0].gameObject);

        }

        

        //修改每个模型的材质球参数
        private void ModifyEveryModelMaterialParameter(GameObject model)
        {
            Debug.Log("开始替换模型贴图");
            if (model != null&& model.GetComponent()!=null)
            {
                _SelfMaterial = model.GetComponent().material;
                // 在Material.SetTexture之前 开启相应的KeyWord
                _SelfMaterial.EnableKeyword(TEXTURE_TYPE[5]);
                _SelfMaterial.EnableKeyword(TEXTURE_KEYWORD[4]);
                Debug.Log("_SelfMaterial.name=" + _SelfMaterial);
                if (_SelfMaterial!=null)
                {
                    _ModelTextrue = _SelfMaterial.mainTexture;

                    //修改模型材质球参数
                    _SelfMaterial.SetTexture("_DetailAlbedoMap", _ModelTextrue);
                    _SelfMaterial.SetTexture("_MainTex", _EmptyTexture);
                    _SelfMaterial.SetInt("_UVSec", 1);

                    Debug.Log("替换模型贴图完成");
                    return;
                  
                }
                else
                {
                    Debug.LogWarning(GetType() + "/ModifyEveryModelMaterialParameter()/   " + _SelfMaterial.name + "   模型材质球不存在,请检查!!!");
                    return;
                }
            }
            else
            {
               
                Debug.LogWarning(GetType()+ "/ModifyEveryModelMaterialParameter()/   "+model.name+"   模型不存在,请检查!!!");
                return;
            }
        }



    }//Class_end
}

参考:https://blog.csdn.net/lilysara/article/details/77513123   https://docs.unity3d.com/Manual/MaterialsAccessingViaScript.html 

https://blog.csdn.net/shenmifangke/article/details/51524812

 

  

你可能感兴趣的:(Unity基础)