【问题标题】:Find and change property name in a shader在着色器中查找和更改属性名称
【发布时间】:2018-10-22 03:36:20
【问题描述】:

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

首先将着色器类型设置为 Unlit/Color

第二个反照率颜色,例如将其更改为: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);

这是我想要改变的:

【问题讨论】:

  • 你试过"_Metallic"吗?

标签: c# unity3d


【解决方案1】:

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

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

您需要知道这一点,否则您需要针对要更改的每个属性提出新问题。

您的渲染器参考:

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;

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

如果着色器用于许多不同的对象会怎样。我想要所有的 当其中一个的属性发生更改时要更改的对象。

要使用相同的材​​质更改所有对象,请使用Renderer.sharedMaterial 而不是Renderer.material。共享材质会更改原始材质,只要您没有在材质上调用Renderer.material,共享材质会更改原始材质,并且该材质实际上会为所述材质创建新副本并将渲染器材质与原始材质断开连接。

【讨论】:

  • 对于颜色我在你回答之前做了这个我只使用了这样的颜色:rend.material.color = new Color(255,0,0,255);它工作正常。只是想知道,因为我没有使用 Color32
  • 不。这是一种未定义的行为。它可能有效,也可能不取决于值,这是因为我在回答中提到的原因。这个网站上有很多关于这个特定问题的问题。请注意这一点。您仍然可以在 0 到 255 的范围内使用 Color,但您必须将这些值除以 255f。 rend.material.color = new Color(255/255f,0/255f,0/255f,255/255f)
  • 感谢您的回答和cmets。
  • 这会改变使用这个着色器的所有材质,还是只改变一个?
  • 我已编辑答案为您添加该信息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-14
  • 2012-01-18
  • 1970-01-01
  • 2012-08-24
  • 2023-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多