Найти и изменить имя свойства в шейдере - PullRequest
0 голосов
/ 22 октября 2018

Я хочу изменить и установить 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);

Это то, что я хочу изменить:

Material/Shader

1 Ответ

0 голосов
/ 22 октября 2018

Если вам нужно изменить свойство шейдера, но вы не знаете, что использовать для правильного имени, выберите материал, нажмите на значок его настроек, затем нажмите «Выбрать шейдер» .Оттуда вы увидите все имена свойств шейдера и их типы, а также узнаете, какую функцию и имя использовать для изменения свойств шейдера.

enter image description here

При использовании стандартного шейдера по умолчанию это выглядит примерно так:

enter image description here

Вам нужно знать это, в противном случае вам нужно будет задать новый вопрос для каждого свойства, которое выхочу изменить.

Ваш справочник по Renderer:

public Renderer rend;

Чтобы установить его, используется функция SetXXX:

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

Toполучить его * используется функция GetXXX:

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

Чтобы изменить или получить цвет Альбедо на 255,0,0255.

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

Обратите внимание, что я использовал Color32 вместо Color, поскольку Color32 принимает значения от 0 до 255, а Color ожидает значения от 0 до 1.

Чтобы изменить шейдер материала на "Unlit / Color" , просто найдите его, а затем назначьте его на материал:

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

Обратите внимание, что "Unlit/ Color " шейдер не имеет свойства _Metallic.У него есть одно свойство: "_ Color" .Вы можете использовать первый метод, который я описал, чтобы определить, какими свойствами он обладает, прежде чем пытаться их изменить.

Что если шейдер используется на многих различных объектах.Я хочу, чтобы все объекты изменялись при изменении свойства одного из них.

Чтобы изменить все объекты с использованием того же материала, используйте Renderer.sharedMaterial вместо Renderer.material.Разделяемый материал изменяет исходный материал, и все остальные объекты должны подбирать этот новый материал, если вы не вызвали Renderer.material для материала, который фактически делает новую копию для указанного материала и отсоединяет материал визуализации от исходного материала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...