飞道的博客

【unity3d】通过代码改变材质球颜色

679人阅读  评论(0)

unity通过代码改变材质球颜色

gitee地址:https://gitee.com/asiworld

csdn博客地址:https://blog.csdn.net/JianShengShuaiest

bilibili地址:https://space.bilibili.com/15766978

大家好我是谢斯,一个unity开发工程师,今天来介绍一下unity中改变材质球颜色的方法,有的人不知道材质球的说法,也叫做

  • 通过代码修改模型颜色
  • 通过代码修改材质球颜色
  • 通过代码改变模型颜色
  • 通过代码改变材质球颜色
  • 动态修改模型材质球颜色
  • 逐渐改变材质球颜色

但实际上都是一个意思,就是修改材质球的颜色,因为模型上的颜色和材质球是有关系的,也可以解决多材质球改变颜色的问题

下面进入正题

得到材质球

对于材质球的修改方法有很多,但是万变不离其宗,第一个我们需要的就是得到材质球,有了材质球,我们才可以按照我们想要的操作去操作材质球,材质球是一个数组,有的很简单,只有一个材质球

有的比较负责,有多个材质球

我们得到材质球的方法也有一次得到一个的,和一次得到很多的,大体上有两种方式,

第一种是得到第一个材质球

m_material = GetComponent<Renderer>().material;

返回分配给渲染器的第一个实例化的Material。

第二种是得到一个材质球的list

Material[] m_arr_material = GetComponent<Renderer>().materials;

返回此对象的所有实例化材料。

通过以上两种方式呢,就有很多种改变材质球的颜色或者其他属性的方式,

改变材质球颜色

1. 简单粗暴法1

using UnityEngine;

public class 方法1 : MonoBehaviour
{
    private Material m_material;

    // 加载脚本实例时调用 Awake
    private void Awake()
    {
        m_material = GetComponent<Renderer>().material;
    }

    // 当鼠标进入 GUIElement 或碰撞器时调用 OnMouseEnter
    private void OnMouseEnter()
    {
        m_material.color = Color.red;
    }

    // 当鼠标不再停留在 GUIElement 或碰撞器上时调用 OnMouseExit
    private void OnMouseExit()
    {
        m_material.color = Color.white;
    }
}

通过这种方式直接改变材质球颜色

2. 简单粗暴法2

这个和方法1差不多只是修改的方式发生了变化

using UnityEngine;

public class 方法2 : MonoBehaviour
{
    private Material m_material;

    // 加载脚本实例时调用 Awake
    private void Awake()
    {
        m_material = GetComponent<Renderer>().material;
    }

    // 当鼠标进入 GUIElement 或碰撞器时调用 OnMouseEnter
    private void OnMouseEnter()
    {
        m_material.SetColor("_Color", Color.red);
    }

    // 当鼠标不再停留在 GUIElement 或碰撞器上时调用 OnMouseExit
    private void OnMouseExit()
    {
        m_material.SetColor("_Color", Color.white);
    }
}

3. 粗中有细法

这个方法的改变方法和1,2相同只是不同的在于得到材质球的方式不同

using UnityEngine;

public class 方法5 : MonoBehaviour
{
    private Material m_material;

    // 加载脚本实例时调用 Awake
    private void Awake()
    {
        m_material = GetComponent<Renderer>().materials[1];
    }

    // 当鼠标进入 GUIElement 或碰撞器时调用 OnMouseEnter
    private void OnMouseEnter()
    {
        m_material.SetColor("_Color", Color.red);
    }

    // 当鼠标不再停留在 GUIElement 或碰撞器上时调用 OnMouseExit
    private void OnMouseExit()
    {
        m_material.SetColor("_Color", Color.white);
    }
}

4. 自我复杂法

这个方法就是很稳定,绝对不会出现任何错误,但是很麻烦,会多写很多句

using UnityEngine;

public class 方法6 : MonoBehaviour
{
    private Renderer m_renderer;
    private Material[] m_arr_material;

    // 加载脚本实例时调用 Awake
    private void Awake()
    {
        m_renderer = GetComponent<Renderer>();
        m_arr_material = m_renderer.materials;
    }

    // 当鼠标进入 GUIElement 或碰撞器时调用 OnMouseEnter
    private void OnMouseEnter()
    {
        m_arr_material[1].SetColor("_Color", Color.red);
        m_renderer.materials = m_arr_material;
    }

    // 当鼠标不再停留在 GUIElement 或碰撞器上时调用 OnMouseExit
    private void OnMouseExit()
    {
        m_arr_material[1].SetColor("_Color", Color.white);
        m_renderer.materials = m_arr_material;
    }
}

逐渐的改变材质球颜色

可以使用lerp 也可以使用其他插件 比如dotween

1. 使用lerp

using UnityEngine;

public class 方法4 : MonoBehaviour
{
    private Material m_material;
    private Color m_color = Color.white;

    // 加载脚本实例时调用 Awake
    private void Awake()
    {
        m_material = GetComponent<Renderer>().material;
    }

    // 如果 MonoBehaviour 已启用,则在每一帧都调用 Update
    private void Update()
    {
        m_material.SetColor("_Color", Color.Lerp(m_material.GetColor("_Color"), m_color, Time.deltaTime));
    }

    // 当鼠标进入 GUIElement 或碰撞器时调用 OnMouseEnter
    private void OnMouseEnter()
    {
        m_color = Color.red;
    }

    // 当鼠标不再停留在 GUIElement 或碰撞器上时调用 OnMouseExit
    private void OnMouseExit()
    {
        m_color = Color.white;
    }
}

2. 使用dotween

using DG.Tweening;

using UnityEngine;

public class 方法3 : MonoBehaviour
{
    private Material m_material;

    // 加载脚本实例时调用 Awake
    private void Awake()
    {
        m_material = GetComponent<Renderer>().material;
    }

    // 当鼠标进入 GUIElement 或碰撞器时调用 OnMouseEnter
    private void OnMouseEnter()
    {
        m_material.DOColor(Color.red, 1.0f);
    }

    // 当鼠标不再停留在 GUIElement 或碰撞器上时调用 OnMouseExit
    private void OnMouseExit()
    {
        m_material.DOColor(Color.white, 1.0f);
    }
}


转载:https://blog.csdn.net/JianShengShuaiest/article/details/104520425
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场