Unity动态创建材质球

我们在做一些AR类似与涂涂乐的功能时,经常会用到给模型替换材质球的功能。当我们的用户创建好贴图时就需要动态将新的贴图转换成材质贴在模型上。他的原理其实很简单,主要分为三步:1、获取贴图,2、创建材质球,3、将材质贴在模型上,下面我们一起来看看应该怎么做吧!


一、获取贴图

注意:贴图为Texture2D格式

获取贴图主要有以下几种方法获取:

1:从Assets文件中获取

方法一: 返回给定路径 assetPath 下 type 类型的第一个资源对象。

首先我们知道目标文件的在Assets下的地址,一些资源文件可能会包含多个对象。(例如,一个 Maya 文件可能会包含多个网格和游戏对象)。 所有路径均是相对于项目文件夹的路径,以Textures文件下的hello.png为例,路径为:“Assets/Textures/hello.png”。主要用到的是unity下的:AssetDatabase.LoadAssetAtPath

Texture2D tex;           //新建贴图格式为Texture2D
//AssetDatabase.LoadAssetAtPath(访问路径,返回某个实例具体引用的数据类型)
tex = AssetDatabase.LoadAssetAtPath("Assets/Textures/texture.jpg", typeof(Texture2D));

方法二:在Assets下创建一个名为Resources的文件夹,将我们所有需要动态加载的资源放入该文价夹中。

 利用Resources.Load加载存储在Resources文件下path下的文件

Texture2D tex;
//Resources.Load(路径无重名可不加后缀) 利用as转换成Texture2D
tex = Resources.Load("hello") as Texture2D;

2:从本地文件中获取

注意:与其经常通过路径去一个一个寻找,不如在加载场景时就用一个数组将我们可能会用到的所有材质创建好,每次需要时直接通过数组下标获取。

这里主要用到的脚本是Application.persistentDataPath(参考链接:(16条消息) Unity 之 Application各种路径在终端的本地路径_陈言必行的博客-CSDN博客)更多详情见unity脚本API官方文档。

void Start()
    {
        //创建路径,数据类型为字符串类型private string directory
        //连接两个字符串Path.Combine(string,string)
        directory = Path.Combine(Application.persistentDataPath, "ProjectName");

        //若不存在则创建
        if (!Directory.Exists(directory)) 
        {
            Directory.CreateDirectory(directory);
        }

        //加载本地文件
        LoadLocalFiles();
    }


    private void LoadLocalFiles()
    {
        Dictionary<string, string> ImgFileDir = GetImgWithDir(directory);
        //挨个遍历ImgFileDir中的所有文件
        foreach(var obj in ImgFileDir)
        {
            //imgnum:目标文件数量
            imgnum++;
            //创建为贴图
            CreatImageTarget(obj.Key ,obj .Value);
        }
    }


    //获取目标路劲下所有满足条件的图片文件
    private Dictionary<string,string> GetImgWithDir(string path)
    {
        Dictionary<string, string> ImgFiles = new Dictionary<string, string>();
        foreach(var file in Directory.GetFiles (path))
        {
            //Path.GetExtension()文件的拓展名
            if (Path.GetExtension(file) == ".jpg" || Path.GetExtension(file) == ".bmp" || Path.GetExtension(file) == ".png")
                ImgFiles.Add(Path.GetFileName(file), file);
        }
        return ImgFiles;
    }


    //创建贴图
    private void CreatImageTarget(string imgname,string imgpath)
    {
        Texture2D tex;
        tex.LoadImage(File.ReadAllBytes(imgpath));
    }

二、创建材质球

注意:动态创建的材质球在非编译状态下是看不见的,只有在编译状态下替换了创建的材质才能看见。代码如下(示例):

 //创建模型自定义Shader
 Material mat = new Material(Shader.Find("Standard"));
 //模型的贴图为上面获取到的贴图
 mat.mainTexture = tex;
 //Material.SetInt() Material.SetFloat() Material.SetColor()等可以用来修改材质的相关属性
 mat.SetFloat("_Glossiness", 0);                       //修改模型的smothness 0~1

三、替换材质

//获取MeshRenderer组件修改material属性为我们动态创建的材质
model.GetComponent<MeshRenderer>().material = mat

总结


  以上就是今天的全部内容,本文仅仅简单介绍了如何在unity里面动态创建材质,最主要的是掌握对unity中相关API的使用,本人为在校大学生,发表个人的一些日常学习笔记,若出现错误,望各位大佬指出。

猜你喜欢

转载自blog.csdn.net/Ma_Mihong/article/details/130463862
今日推荐