【Unity3D日常开发】(三十一)Unity3D中修改游戏对象的材质颜色

举报
恬静的小魔龙 发表于 2021/12/13 08:45:56 2021/12/13
【摘要】 推荐阅读CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客QQ群:1040082875 一、前言前段时间比较忙,好久没更新博客了,感觉技术都下降了,还是要坚持输出呀。孔子曰:“学而不思则罔,思而不学则殆”,不能光学习,还要学会思考,要能用起来。将自己学到的东西记录下来,这样会让学习更加有效。 二、修改游戏对象的材质颜色 2.1 支持修改的材质首先,你的材质要支持颜色渲...

推荐阅读

一、前言

前段时间比较忙,好久没更新博客了,感觉技术都下降了,还是要坚持输出呀。
孔子曰:“学而不思则罔,思而不学则殆”,不能光学习,还要学会思考,要能用起来。
将自己学到的东西记录下来,这样会让学习更加有效。

二、修改游戏对象的材质颜色

2.1 支持修改的材质

首先,你的材质要支持颜色渲染通道,如果都没有颜色通道,再怎么改变都没有用的。

默认的Standard是支持颜色通道的:
在这里插入图片描述
其他支持颜色通道的Shader:
Sprites/Default
在这里插入图片描述
Sprites/Diffuse
在这里插入图片描述
Unlit/Color
在这里插入图片描述
Legacy Shaders/Diffuse
在这里插入图片描述

2.2 修改材质颜色代码

如果游戏对象只有一个材质球,可以这么写:
在这里插入图片描述

using UnityEngine;

public class test1 : MonoBehaviour
{
    public GameObject m_Cube;
    void Start()
    {
        m_Cube.GetComponent<MeshRenderer>().material.color = Color.red;
    }
}

如果游戏对象有多个材质球,可以这么写:
在这里插入图片描述

using UnityEngine;

public class test1 : MonoBehaviour
{
    public GameObject m_Cube;
    void Start()
    {
        m_Cube.GetComponent<MeshRenderer>().materials[0].color = Color.red;
        m_Cube.GetComponent<MeshRenderer>().materials[1].color = Color.blue;
    }
}

也可以直接设置材质球的颜色,但是不推荐:

using UnityEngine;

public class test1 : MonoBehaviour
{
    public Material m_Material;
    void Start()
    {
        m_Material.color = Color.red;
    }
}

因为这样写会直接修改资源中材质球的颜色,会导致所有使用这个材质球的物体都改变颜色,而且是永久性修改,在程序结束也不会修改回来。

思考
那么为什么,使用GetComponent<MeshRenderer>().material.color就没有问题呢:

using UnityEngine;

public class test1 : MonoBehaviour
{
    public GameObject m_Cube;
    void Start()
    {
        m_Cube.GetComponent<MeshRenderer>().material.color = Color.red;
    }
}

因为Unity在我们使用GetComponent<MeshRenderer>().material.color的时候做了一些事情:

在这里插入图片描述
没错,这是一个实例化的材质球,保存在内存中,程序结束,这个材质球也会被销毁了,就不会改变资源中材质球的颜色了,也不会影响其他使用这个材质球的物体了。

三、Shader为Particles时修改材质颜色

在这里插入图片描述
当Shader为Particles时可以这么修改材质颜色:

using UnityEngine;

public class test1 : MonoBehaviour
{
    public GameObject m_Cube;
    void Start()
    {
        Color color = new Color(1f, 0f, 0f, 1f);
        m_Cube.GetComponent<MeshRenderer>().material.SetColor("_TintColor", color);
    }
}

四、修改材质的透明值

这么写是不对的:
在这里插入图片描述
可以这么写:

using UnityEngine;

public class test1 : MonoBehaviour
{
    public GameObject m_Cube;
    void Start()
    {
        m_Cube.GetComponent<MeshRenderer>().material.color = new Color(1,0,0,0.5f);
    }
}

在这里插入图片描述
也可以这么写:

using UnityEngine;

public class test1 : MonoBehaviour
{
    public GameObject m_Cube;
    void Start()
    {
        Color c = m_Cube.GetComponent<MeshRenderer>().material.color;
        c.a = 0.4f;
        m_Cube.GetComponent<MeshRenderer>().material.color = c;
    }
}

在这里插入图片描述
效果一样。

结束,谢谢观看。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。