在着色器中查找和更改属性名称

时间:2018-10-22 03:36:21

标签: c# unity3d

我要在设置新材质后更改并设置3件事:

首先将着色器类型更改为“不亮/彩色”

第二个反照率颜色,例如将其更改为:255,0,0,255

第三金属值从0到1

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

public class DoorsLockManager : MonoBehaviour
{
    public bool locked;
    public Color lockedColor = Color.red;
    public Color unlockedColor = Color.green;
    public Renderer rend;

    private GameObject[] doorPlanes;

    private void Start()
    {
        doorPlanes = GameObject.FindGameObjectsWithTag("DoorPlane");

        for (int i = 0; i < doorPlanes.Length; i++)
        {
            rend = doorPlanes[i].GetComponent<Renderer>();
            if (locked)
            {
                rend.material.SetFloat("Metallic", 1);
                rend.material.color = lockedColor;
            }
            else
            {
                rend.material.color = unlockedColor;
            }
        }
    }

    // Update is called once per frame
    void Update ()
    {

    }
}

此行不执行任何操作:

rend.material.SetFloat("Metallic", 1);

这是我要更改的内容:

Material/Shader

1 个答案:

答案 0 :(得分:4)

当您需要更改着色器属性,但不知道要使用什么名称来命名时,请选择材质,单击其设置图标,然后单击“选择着色器” 。从那里,您将看到所有着色器属性名称及其类型,并且您将知道用于更改着色器属性的函数和名称。

enter image description here

使用默认的标准着色器,它看起来像这样:

enter image description here

您需要知道这一点,否则您将需要为每个要更改的属性询问新问题。

您的渲染器参考:

public Renderer rend;

要进行设置,请使用SetXXX函数:

rend.material.SetFloat("_Metallic", 1); //Metallic is a float

要使用GetXXX函数来获取它:

float metallic = rend.material.GetFloat("_Metallic"); //Metallic is a float

将反照率颜色更改为255,0,0,255。

rend.material.SetColor("_Color", new Color32(255, 0, 0, 255));
Color color = rend.material.GetColor("_Color");

请注意,我使用Color32而不是Color是因为Color32的取值介于0255之间,而Color则需要取值在01之间。

要将材质的着色器更改为“ Unlit / Color” ,只需找到它,然后将其分配给材质即可:

Shader shader = Shader.Find("Unlit/Color");
rend.material.shader = shader;

请注意,“不亮/彩色” 着色器不具有_Metallic属性。它具有一个属性,即“ _ Color” 。您可以使用我描述的第一种方法来确定它具有的属性,然后再尝试更改它们。

  

如果将着色器用于许多不同的对象,该怎么办。我想要所有   当其中一个属性更改时,对象也会更改。

要使用相同的材​​质更改所有对象,请使用Renderer.sharedMaterial而不是Renderer.material。共享材质会更改原始材质,并且只要您尚未在材质上调用Renderer.material(实际上是为该材质创建新副本并断开渲染器材质与原始材质的连接),其他所有对象都应拾取该新材质。材料。