Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 14 Next capture
2021 2022 2023
2 captures
13 Jun 22 - 14 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
0
Question by Lieene-Guo · Dec 30, 2014 at 08:12 PM · shadermaterialinspectordrawer

Custom MaterialPropertyDrawer with argument

I am working on a group of shaders. And I want to add some custom shader property GUI. By driving from MaterialPropertyDrawer class. A simple test code looks like this

 using UnityEngine;
 using System.Collections;
 using UnityEditor;
 
 public class TestMatPropDrawer : MaterialPropertyDrawer {
     public TestMatPropDrawer(int i)
     {
     }
 
     public override void OnGUI (Rect position, MaterialProperty prop, string label, MaterialEditor editor)
     {
         //Debug.Log ("Drawing");
         if(GUILayout.Button("Show Label"))
         {
             Debug.Log(label);
             EditorUtility.SetDirty(prop.targets[0]);
         }
         base.OnGUI (position, prop, label, editor);
     }
     public override void Apply (MaterialProperty prop)
     {
         Debug.Log ("Applying");
         base.Apply (prop);
     }
     public override float GetPropertyHeight (MaterialProperty prop, string label, MaterialEditor editor)
     {
         //Debug.Log ("Getting height");
         return base.GetPropertyHeight (prop, label, editor);
     }
 }
 

And with a shader like this

 Shader "Custom/TestShader" {
     Properties {
         _MainTex ("Base (RGB)", 2D) = "white" {}
         [TestMatProp]
         _testProp ("TestProp", Float) = 1
     }
     SubShader {
         Tags { "RenderType"="Opaque" }
         LOD 200
         
         CGPROGRAM
         #pragma surface surf Lambert
 
         sampler2D _MainTex;
 
         struct Input {
             float2 uv_MainTex;
         };
 
         void surf (Input IN, inout SurfaceOutput o) {
             half4 c = tex2D (_MainTex, IN.uv_MainTex);
             o.Albedo = c.rgb;
             o.Alpha = c.a;
         }
         ENDCG
     } 
     FallBack "Diffuse"
     CustomEditor "TestCustomMatProp"
 }
 

This drawer works find as long as I keep [TestMatProp] without arguments

What I am trying to do is to add some arguments like [KeywordEnum(None, Add, Multiply)] when I try to add some simple argument like[TestMatProp(1)] Unity is giving me a

Failed to create material drawer TestMatProp with arguments '1'

But as I look through the doc there no clear reference about how to implement a argumented version of MaterialPropertyDrawer.

Any one have any idea?

Comment
Add comment
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

2 Replies

· Add your reply
  • Sort: 
avatar image
2

Answer by Lex-DRL · Jun 17, 2015 at 06:27 AM

Just faced the same issue.

Man, you just need to add several overloaded constructors. I.e.:

your custom GUI script:

 public class TestMatPropDrawer : MaterialPropertyDrawer {
     
     protected bool isArgumentGiven;
     protected int argValue;
     
     public TestMatPropDrawer()
     {
         isArgumentGiven = false;
         argValue = 0; // <- some default value
     }
     
     public TestMatPropDrawer(int i)
     {
         isArgumentGiven = true;
         argValue = i;
     }
     
     public override void OnGUI (Rect position, MaterialProperty prop, string label, MaterialEditor editor)
     {
         if(isArgumentGiven)
         {
             // perform some "default" stuff if user didn't pass an argument
         }
         else
         {
             // some other stuff if the argument is manually specified
         }
     }
     
 }

But keep in mind that if your argument is string (not int) and you want to pass "BlaBlaBla" as an argument, you need to write it like this in your shader:

 [TestMatProp(BlaBlaBla)]
 _testProp ("TestProp", Float) = 1

i.e., without quotes. That's really disappointing since that's why we're stuck with a LongCamelCaseStrings and can't pass a "real string" (with spaces, special characters etc).

Comment
Add comment · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image
0

Answer by jmgek · Dec 30, 2014 at 08:32 PM

I think this is what you are asking, .cs

  float TestProp = //Anything here;
  renderer.material.SetFloat("_TestProp ", TestProp );

Comment
Add comment · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this Question

Answers Answers and Comments

4 People are following this question.

avatar image avatar image avatar image avatar image

Related Questions

HDRP shader graph - Surface options missing "Material Type" in inspector 0 Answers

Material instantiation problem 1 Answer

Material doesn't have a color property '_Color' 4 Answers

One outline material for multiple objects? 2 Answers

Changing material color´s alpha in self iluminated shader 1 Answer


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges