Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 12 Next capture
2021 2022 2023
1 capture
12 Jun 22 - 12 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 UnityAccnt · Oct 02, 2019 at 12:59 AM · editorserializationeditorguilayoutserializedpropertyserializedobject

Display function parameters in inspector

Basically trying to make my own version of the UnityEvents in the inspector, you place this script on a game object and it populates a dropdown with all the public functions. I've gotten pretty far, but I want it to create property fields for the parameters in the selected function, I'm not sure how to do it though, been trying to figure this out for quite a while to no avail.

The script to get the functions and parameters.

[ExecuteInEditMode] public class MageInteraction : MonoBehaviour {

 // For displaying the initial option in the custom editor
 public int index;
 // For getting the right methods
 public MonoBehaviour[] monoBehaviours;
 public List<MethodInfo> methods = new List<MethodInfo>();
 public List<string> methodNames = new List<string>();
 public Dictionary<string, ParameterInfo[]> methodParameters = new Dictionary<string, ParameterInfo[]>();

 private BindingFlags flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly;

 // Start is called before the first frame update
 void Start()
 {
     monoBehaviours = gameObject.GetComponents<MonoBehaviour>();
     GetFunctions();
 }

 // Update is called once per frame
 void Update()
 {
     //GetFunction();
 }

 void GetFunctions()
 {
     // Add all the methods found in the script to the list
     foreach (MonoBehaviour element in monoBehaviours)
     {
         methods.AddRange(element.GetType().GetMethods(flags));
     }

     methodNames.Clear();

     foreach (MethodInfo element in methods)
     {
         // Add all the names of the methods to a list
         methodNames.Add(element.ToString());
         // Add all the Parameters to the dictionary
         methodParameters.Add(element.ToString(), element.GetParameters());
         Debug.Log("Parameters " + methodParameters[element.ToString()].ToStringFull());
     }

     Debug.Log(methodNames.ToArray().ToStringFull());
 }

}

The custom editor to display the functions in the inspector

[CustomEditor(typeof(MageInteraction))] [CanEditMultipleObjects] public class MageInteractionEditor : Editor { public override void OnInspectorGUI() { // Update the serializedProperty - always do this in the beginning of OnInspectorGUI. serializedObject.Update();

     MageInteraction mageInteraction = (MageInteraction)target;

     // Create the dropdown in the inspector for the found methods 
     mageInteraction.index = EditorGUILayout.Popup("Function", mageInteraction.index, mageInteraction.methodNames.ToArray());
     //Debug.Log(mageInteraction.index);

     // Create a propertyfield array as large as the ParameterInfo array retrieved by getParameters
     EditorGUILayout[] guiLayouts = new EditorGUILayout[mageInteraction.methodParameters[mageInteraction.methodNames[mageInteraction.index]].Length];
     Debug.Log("GUILayouts Length: " + guiLayouts.Length);

     for (int i = 0; i < guiLayouts.Length; i++)
     {
         // Create property fields for each parameter found in the method
         //SerializedProperty prop = serializedObject.FindProperty(mageInteraction.methodParameters[mageInteraction.methodNames[mageInteraction.index]][i].Name);
         SerializedProperty prop = serializedObject.FindProperty(mageInteraction.methodParameters["Void OpenChest(Int32, System.String)"][i].Name);
         Debug.Log("SerializedProperty: " + prop);
         Debug.Log("ParameterName: " + mageInteraction.methodParameters["Void OpenChest(Int32, System.String)"][i].Name);
         //guiLayouts[i] = EditorGUILayout.PropertyField(prop);
     }

     // Apply changes to the serializedProperty - always do this in the end of OnInspectorGUI.
     serializedObject.ApplyModifiedProperties();
 }

What it looks like in the inspector alt text

Link in case the image doesn't load https://gyazo.com/00d62deb8b49c2708ecf97423eeb8ee0

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

0 Replies

· Add your reply
  • Sort: 

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

154 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

Finding property with serializedObject on script with a generic 0 Answers

How do you actually use CanEditMultipleObjects 1 Answer

Access another objects property in an editor script 1 Answer

Is there a way to get the names of all SerializedProperty objects in a SerializedProperty object? 1 Answer

Get UnityEvent reference from SerializedProperty 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