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

Ben*_*umi 3 c# unity-game-engine

设置新材质后,我想更改并设置3件事:

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

Second反照率颜色,例如将其更改为: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 ()
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

该行不执行任何操作:

rend.material.SetFloat("Metallic", 1);
Run Code Online (Sandbox Code Playgroud)

这是我要更改的内容:

材质/明暗器

Pro*_*mer 5

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

在此处输入图片说明

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

在此处输入图片说明

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

您的渲染器参考:

public Renderer rend;
Run Code Online (Sandbox Code Playgroud)

要设置它,使用SetXXX函数:

rend.material.SetFloat("_Metallic", 1); //Metallic is a float
Run Code Online (Sandbox Code Playgroud)

要获得此GetXXX功能,请使用以下功能:

float metallic = rend.material.GetFloat("_Metallic"); //Metallic is a float
Run Code Online (Sandbox Code Playgroud)

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

rend.material.SetColor("_Color", new Color32(255, 0, 0, 255));
Color color = rend.material.GetColor("_Color");
Run Code Online (Sandbox Code Playgroud)

请注意,我用Color32的,而不是Color因为Color32之间取值0255Color与预期值01

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

Shader shader = Shader.Find("Unlit/Color");
rend.material.shader = shader;
Run Code Online (Sandbox Code Playgroud)

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

如果将着色器用于许多不同的对象,该怎么办。我希望所有对象都在其中一个属性更改时更改。

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