Unity动态创建材质球

这篇具有很好参考价值的文章主要介绍了Unity动态创建材质球。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、获取贴图

1:从Assets文件中获取

2:从本地文件中获取

二、创建材质球

三、替换材质

总结


前言

我们在做一些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的文件夹,将我们所有需要动态加载的资源放入该文价夹中。

Unity动态创建材质球

 利用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的使用,本人为在校大学生,发表个人的一些日常学习笔记,若出现错误,望各位大佬指出。文章来源地址https://www.toymoban.com/news/detail-448073.html

到了这里,关于Unity动态创建材质球的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity制作二次元卡通渲染角色材质——3、高光反射与ILM贴图

    Unity制作二次元材质角色 回到目录 大家好,我是阿赵。 这里继续来讲二次元角色的材质。上次讲了光影的色阶化问题,这次继续讲光照模型效果的问题。 之前我们说过,光照模型的最后效果是: 环境色+漫反射+高光+反射。 这里我们可以先忽略环境光,然后之前做了漫反射

    2024年02月11日
    浏览(48)
  • Unity工程目录下的文件夹(Assets、Library、Logs、Packages、ProjectSettings、UserSettings)

    通常Unity里的工程目录都是这样: 一、Assets  工程资源文件夹(美术资源,脚本等等)         Unity工程中所用到的所有Asset资源都放到这个文件夹里,是资源文件的要目录,很多API都是基于这个文件目录。查找目录都需要带上Assets,例如AssetDataBase 二、Library    库文件夹

    2023年04月09日
    浏览(41)
  • Unity AmplifyShader-获取Image贴图

    2024年02月14日
    浏览(20)
  • Unity地面交互效果——2、动态法线贴图实现轨迹效果

    回到目录 Unity引擎动态法线贴图制作球滚动轨迹   大家好,我是阿赵。   之前说了一个使用局部UV采样来实现轨迹的方法。这一篇在之前的基础上,使用法线贴图进行凹凸轨迹的绘制。   先来回顾一下,上一篇最终我们已经绘制了一个轨迹的贴图   可以思考一下,

    2024年02月06日
    浏览(49)
  • Unity TMP (TextMeshPro) 创建字体材质

    完整名称:Text Mesh Pro ,unity新一代主流字体插件 1.1 组件变化 内置的Text组件以及与内置Text组件绑定的Button、DropDown、InputField均被替换为使用TextMeshPro的版本 内置的Text组件以及与内置Text组件绑定的Button、DropDown、InputField则被移动到Legacy菜单 1.2 变化说明 旧的组件只是移动到

    2024年02月10日
    浏览(27)
  • Blender如何给fbx模型添加材质贴图并导出带有材质贴图的模型

    推荐:使用 NSDT场景编辑器快速助你搭建可二次编辑的3D应用场景 此教程适合新手用户,专业人士直接可直接绕路。   本教程中介绍了利用Blender建模软件,只需要简单几步就可以为模型添加材质贴,图,并且导出带有材质的模型文件。 1、第一步,打开Blender软件,导入模型

    2024年02月13日
    浏览(29)
  • Unity中对预制体烘焙光照贴图,在其他Scene中使用或者动态生成带光照贴图的预制体

    记录个人开发笔记,如果有大佬有更好的方法或者觉得我这个方法哪里有问题欢迎指正! 首先说下为什么会弄预制体烘焙光照贴图,因为项目需求需要动态生成一个房间的,因此是将房间弄成预制体,动态生成就好了,这个很简单,但是呢最后程序是在一体机中跑的,性能比

    2024年02月09日
    浏览(28)
  • 一文看懂-纹理/贴图/材质

    纹理(Texture) 应用于网格表面上的标准位图图像,即3D 对象的 2D 贴图。 贴图(Map) 指的是绘制在对象模型表面上的那些图像数据,其所使用的图像文件称为纹理。贴图还包含纹理图在对象表面的坐标(UV坐标)等其他数据信息。 可以说, 纹理是贴图的子集 。 另外。Map也

    2024年02月08日
    浏览(33)
  • Three.js 设置模型材质纹理贴图和修改材质颜色,材质透明度,材质网格

    1 traverse (模型循环遍历方法) 2. THREE.TextureLoader(用于加载和处理图片纹理) 3. THREE.MeshLambertMaterial(用于创建材质) 4. getObjectByProperty(通过材质的属性值获取材质信息) 在上一篇 Three.js加载外部glb,fbx,gltf,obj 模型文件 的文章基础上加入onSetSystemModelMap (设置模型材质方法

    2024年02月13日
    浏览(38)
  • UE4中C++动态创建材质的几种方法Material

    第一种方式:         1、首先加载材质,代码如下: UMaterialInterface* Material = LoadObjectUMaterialInterface(nullptr, TEXT(\\\"Material\\\'/Game/Materials/ColorMaterial.ColorMaterial\\\'\\\"));         2、然后调用CreateDynamicMaterialInstance创建静态材质实例,如下: UMaterialInstance * DynamicMaterial = UKismetMaterialLibr

    2024年02月08日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包