Legacy Documentation: Version 2017.1 (Go to current version)
LanguageEnglish
  • C#
  • JS

Script language

Select your preferred scripting language. All code snippets will be displayed in this language.

ProceduralMaterial.GetProceduralPropertyDescriptions

Suggest a change

Success!

Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable.

Close

Submission failed

For some reason your suggested change could not be submitted. Please <a>try again</a> in a few minutes. And thank you for taking the time to help us improve the quality of Unity Documentation.

Close

Cancel

Switch to Manual
public function GetProceduralPropertyDescriptions(): ProceduralPropertyDescription[];
public ProceduralPropertyDescription[] GetProceduralPropertyDescriptions();

Description

Get an array of descriptions of all the ProceduralProperties this ProceduralMaterial has.

This can be used to build generic GUI that can be used to edit the properties of any ProceduralMaterial without knowing its properties in advance.

var scrolling : Vector2;
var rend: Renderer;

function Start() { rend = GetComponent.<Renderer>(); }

function OnGUI () { if (rend.sharedMaterial as ProceduralMaterial) { // Show substance properties inside window var windowRect = new Rect (Screen.width-250, 30, 220, Screen.height-60); GUI.Window (0, windowRect, ProceduralPropertiesGUI, "Procedural Properties"); } }

function ProceduralPropertiesGUI (windowId : int) { scrolling = GUILayout.BeginScrollView (scrolling);

var substance = rend.sharedMaterial as ProceduralMaterial;

// Get a list of all the Procedural properties var inputs = substance.GetProceduralPropertyDescriptions ();

// Iterate through all the properties for (var i : int = 0; i < inputs.Length; i++) { var input = inputs[i];

// Handle the different types of properties var type = input.type;

// Show a boolean as a toggle if (type == ProceduralPropertyType.Boolean) { var inputBool = substance.GetProceduralBoolean (input.name); var oldInputBool = inputBool; inputBool = GUILayout.Toggle (inputBool, input.name); if (inputBool != oldInputBool) substance.SetProceduralBoolean (input.name, inputBool); } // Show a float as a slider else if (type == ProceduralPropertyType.Float) { // Only show GUI for numbers with a defined range if (input.hasRange) { GUILayout.Label (input.name);

var inputFloat = substance.GetProceduralFloat (input.name); var oldInputFloat = inputFloat;

inputFloat = GUILayout.HorizontalSlider (inputFloat, input.minimum, input.maximum);

if (inputFloat != oldInputFloat) substance.SetProceduralFloat (input.name, inputFloat); } } // Show a vector as multiple sliders else if (type == ProceduralPropertyType.Vector2 || type == ProceduralPropertyType.Vector3 || type == ProceduralPropertyType.Vector4 ) { // Only show GUI for numbers with a defined range if (input.hasRange) { GUILayout.Label (input.name);

// How many components are in this vector? var vectorComponentAmount = 4; if (type == ProceduralPropertyType.Vector2) vectorComponentAmount = 2; if (type == ProceduralPropertyType.Vector3) vectorComponentAmount = 3;

var inputVector = substance.GetProceduralVector (input.name); var oldInputVector = inputVector;

// Loop through the vector component and show a slider for each for (var c : int = 0; c < vectorComponentAmount; c++) inputVector[c] = GUILayout.HorizontalSlider ( inputVector[c], input.minimum, input.maximum);

if (inputVector != oldInputVector) substance.SetProceduralVector (input.name, inputVector); } } // Show a color as multiple sliders else if (type == ProceduralPropertyType.Color3 || type == ProceduralPropertyType.Color4) { GUILayout.Label (input.name);

// How many numbers are in this color? var colorComponentAmount = (type == ProceduralPropertyType.Color3 ? 3 : 4);

var colorInput = substance.GetProceduralColor (input.name); var oldColorInput = colorInput;

// Loop through the vector numbers and show a slider for each for (var d : int = 0; d < colorComponentAmount; d++) colorInput[d] = GUILayout.HorizontalSlider (colorInput[d], 0, 1);

if (colorInput != oldColorInput) substance.SetProceduralColor (input.name, colorInput); }

// Show an enum as a selection grid else if (type == ProceduralPropertyType.Enum) { GUILayout.Label (input.name);

var enumInput = substance.GetProceduralEnum (input.name); var oldEnumInput = enumInput; var enumOptions = input.enumOptions;

enumInput = GUILayout.SelectionGrid (enumInput, enumOptions, 1); if (enumInput != oldEnumInput) substance.SetProceduralEnum (input.name, enumInput); } }

// Rebuild the textures to show the changes substance.RebuildTextures();

GUILayout.EndScrollView(); }
using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour { public Vector2 scrolling; public Renderer rend; void Start() { rend = GetComponent<Renderer>(); }

void OnGUI() { if (rend.sharedMaterial as ProceduralMaterial) { Rect windowRect = new Rect(Screen.width - 250, 30, 220, Screen.height - 60); GUI.Window(0, windowRect, ProceduralPropertiesGUI, "Procedural Properties"); } }

void ProceduralPropertiesGUI(int windowId) { scrolling = GUILayout.BeginScrollView(scrolling); ProceduralMaterial substance = rend.sharedMaterial as ProceduralMaterial; ProceduralPropertyDescription[] inputs = substance.GetProceduralPropertyDescriptions(); int i = 0; while (i < inputs.Length) { ProceduralPropertyDescription input = inputs[i]; ProceduralPropertyType type = input.type; if (type == ProceduralPropertyType.Boolean) { bool inputBool = substance.GetProceduralBoolean(input.name); bool oldInputBool = inputBool; inputBool = GUILayout.Toggle(inputBool, input.name); if (inputBool != oldInputBool) substance.SetProceduralBoolean(input.name, inputBool); } else if (type == ProceduralPropertyType.Float) if (input.hasRange) { GUILayout.Label(input.name); float inputFloat = substance.GetProceduralFloat(input.name); float oldInputFloat = inputFloat; inputFloat = GUILayout.HorizontalSlider(inputFloat, input.minimum, input.maximum); if (inputFloat != oldInputFloat) substance.SetProceduralFloat(input.name, inputFloat); } else if (type == ProceduralPropertyType.Vector2 || type == ProceduralPropertyType.Vector3 || type == ProceduralPropertyType.Vector4) if (input.hasRange) { GUILayout.Label(input.name); int vectorComponentAmount = 4; if (type == ProceduralPropertyType.Vector2) vectorComponentAmount = 2;

if (type == ProceduralPropertyType.Vector3) vectorComponentAmount = 3;

Vector4 inputVector = substance.GetProceduralVector(input.name); Vector4 oldInputVector = inputVector; int c = 0; while (c < vectorComponentAmount) { inputVector[c] = GUILayout.HorizontalSlider(inputVector[c], input.minimum, input.maximum); c++; } if (inputVector != oldInputVector) substance.SetProceduralVector(input.name, inputVector); } else if (type == ProceduralPropertyType.Color3 || type == ProceduralPropertyType.Color4) { GUILayout.Label(input.name); int colorComponentAmount = ((type == ProceduralPropertyType.Color3) ? 3 : 4); Color colorInput = substance.GetProceduralColor(input.name); Color oldColorInput = colorInput; int d = 0; while (d < colorComponentAmount) { colorInput[d] = GUILayout.HorizontalSlider(colorInput[d], 0, 1); d++; } if (colorInput != oldColorInput) substance.SetProceduralColor(input.name, colorInput); } else if (type == ProceduralPropertyType.Enum) { GUILayout.Label(input.name); int enumInput = substance.GetProceduralEnum(input.name); int oldEnumInput = enumInput; string[] enumOptions = input.enumOptions; enumInput = GUILayout.SelectionGrid(enumInput, enumOptions, 1); if (enumInput != oldEnumInput) substance.SetProceduralEnum(input.name, enumInput); } i++; } substance.RebuildTextures(); GUILayout.EndScrollView(); } }
对文档有任何疑问,请移步至开发者社区提问,我们将尽快为您解答