public override void OnInspectorGUI()
    {
        MaterialPropertySetter obj = target as MaterialPropertySetter;

        if (obj == null)
        {
            return;
        }
        var serialized = new SerializedObject(target);

        if (serialized == null)
        {
            return;
        }

        var serializedRenderer = serialized.FindProperty("rend");

        obj._updateInEditor    = EditorGUILayout.Toggle("Update in edit-mode", obj._updateInEditor);
        obj._useSharedMaterial = EditorGUILayout.Toggle("Use shared-materials", obj._useSharedMaterial);
        EditorGUILayout.PropertyField(serializedRenderer, new GUIContent("Renderer: "));
        Renderer rend             = serializedRenderer.objectReferenceValue as Renderer;
        Material selectedMaterial = null;

        if (rend != null)
        {
            int selectedMaterialIndex = 0;
            if (rend.sharedMaterials != null && rend.sharedMaterials.Length > 1)
            {
                int      materialCount     = rend.sharedMaterials.Length;
                string[] materialSelection = new string[materialCount];
                for (int m = 0; m < rend.sharedMaterials.Length; ++m)
                {
                    materialSelection[m] = rend.sharedMaterials[m] != null ? rend.sharedMaterials[m].name : "NULL_MATERIAL";
                }
                selectedMaterialIndex = Mathf.Max(0, EditorGUILayout.Popup("Material: ", obj.materialIndex, materialSelection));
                selectedMaterial      = rend.sharedMaterials[obj.materialIndex];
            }
            else if (rend.sharedMaterial != null)
            {
                selectedMaterial = rend.sharedMaterial;
            }

            serializedObject.FindProperty("materialIndex").intValue = selectedMaterialIndex;
            obj.materialIndex = selectedMaterialIndex;

            var serializedPropertyName = serializedObject.FindProperty("propertyName");

            if (selectedMaterial != null && serializedRenderer.objectReferenceValue != null)
            {
                Shader        shader               = selectedMaterial.shader;
                string        selectedShaderProp   = serializedPropertyName.stringValue;
                int           shaderPropCount      = ShaderUtil.GetPropertyCount(shader);
                List <string> shaderPropertiesList = new List <string>();
                for (int sp = 0; sp < shaderPropCount; ++sp)
                {
                    shaderPropertiesList.Add(ShaderUtil.GetPropertyName(shader, sp));
                }
                bool missingSelectedShaderProp = false;
                if (!shaderPropertiesList.Contains(selectedShaderProp))
                {
                    missingSelectedShaderProp = true;
                    shaderPropertiesList.Add(selectedShaderProp);
                }
                GUIContent[] shaderProperties = new GUIContent[shaderPropertiesList.Count];
                for (int i = 0; i < shaderProperties.Length; ++i)
                {
                    string contentPrefix = missingSelectedShaderProp && shaderPropertiesList[i] == selectedShaderProp
                        ? "(MISSING) "
                        : "";

                    shaderProperties[i] = new GUIContent(contentPrefix + shaderPropertiesList[i]);
                }
                int shaderPropIndex = -1;
                for (int i = 0; i < shaderPropertiesList.Count; ++i)
                {
                    if (shaderPropertiesList[i] == selectedShaderProp)
                    {
                        shaderPropIndex = i;
                    }
                }
                shaderPropIndex = Mathf.Max(0, EditorGUILayout.Popup(new GUIContent("Shader property: "), shaderPropIndex, shaderProperties));
                if (shaderPropIndex >= 0 && shaderPropIndex < shaderProperties.Length)
                {
                    obj.propertyName = shaderPropertiesList[shaderPropIndex];
                    serializedPropertyName.stringValue = shaderPropertiesList[shaderPropIndex];
                }

                serialized.ApplyModifiedProperties();
                if (shaderPropIndex < shaderPropCount)
                {
                    ShaderUtil.ShaderPropertyType shaderPropType = ShaderUtil.GetPropertyType(shader, shaderPropIndex);
                    var serializedPropertyType = serializedObject.FindProperty("_propertyType");
                    switch (shaderPropType)
                    {
                    default:
                    case ShaderUtil.ShaderPropertyType.Color: {
                        var serializedColorField = serialized.FindProperty("value_color");
                        EditorGUILayout.PropertyField(serializedColorField, new GUIContent("Value: "));
                        obj._propertyType = MaterialPropertySetter.PropertyType.Color;
                        break;
                    }

                    case ShaderUtil.ShaderPropertyType.Range:
                    case ShaderUtil.ShaderPropertyType.Float: {
                        var serializedFloatField = serialized.FindProperty("value_float");
                        EditorGUILayout.PropertyField(serializedFloatField, new GUIContent("Value: "));
                        obj._propertyType = MaterialPropertySetter.PropertyType.Float;
                        break;
                    }

                    case ShaderUtil.ShaderPropertyType.TexEnv: {
                        var serializedTextureField = serialized.FindProperty("value_tex");
                        EditorGUILayout.PropertyField(serializedTextureField, new GUIContent("Value: "));
                        obj._propertyType = MaterialPropertySetter.PropertyType.Texture;
                        break;
                    }

                    case ShaderUtil.ShaderPropertyType.Vector: {
                        var serializedVectorField = serialized.FindProperty("value_vec4");
                        serializedVectorField.vector4Value = EditorGUILayout.Vector4Field(new GUIContent("Value: "), serializedVectorField.vector4Value);
                        obj._propertyType = MaterialPropertySetter.PropertyType.Vector;
                        break;
                    }
                    }
                }
            }
        }

        serialized.ApplyModifiedProperties();

        if (obj._updateInEditor)
        {
            obj.DoUpdate();
        }
    }
Exemplo n.º 2
0
 void OnEnable()
 {
     currentTime = Mathf.Atan2(center.position.y - transform.position.y, center.position.x - transform.position.x);
     currentTime = currentTime / Mathf.PI * 0.5f;
     setter      = GetComponentInChildren <MaterialPropertySetter>();
 }