Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 14 Next capture
2021 2022 2023
2 captures
12 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 /
  • Help Room /
avatar image
0
Question by betaFlux · Sep 10, 2016 at 08:53 AM · menuforeachcustom-inspectorgenericlambda

UnityEditor GenericMenu - Problem with 'AddItem' in Foreach Loop

I'm working on a custom inspector and I'm trying to populate a GenericMenu with the content of a string array like this:

 public override void OnInspectorGUI()
 {
             if(GUILayout.Button("Add Type"))
             {
                 var menu = new GenericMenu();
     
                 foreach(string s in typeNames)
                 {
                     menu.AddItem(new GUIContent(s), false, () => Debug.Log("s = " + s));
                 }
     
                 menu.ShowAsContext();
                 Event.current.Use();
             }
 }

which works perfectly fine. The menu gets populated with all the different strings.

The problem is that, no matter what option I click on the generic menu later on, the Debug.Log() always prints the first element from the array. Can someone explain to me, why GUIContent(s) works, but the lambda expression doesn't?

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

1 Reply

· Add your reply
  • Sort: 
avatar image
0

Answer by stektpotet · Aug 04, 2018 at 01:13 PM

I'm not sure how capturing of variables work in C# lambdas, but I think that's the problem here... The state of the string isn't captured for the lambda, making them all print the same string.

A fix for this is to use the alternative GenericMenu.Menufunction2: Its signature is void(object) and the correlated AddItem-function takes an extra parameter which is the object that should be passed through the expression. For the case above:

 menu.AddItem(new GUIContent(s), false, str => Debug.Log("s = " + (string)str), s);

The only difference between the two is the fact that the parameter s now will be captured as part of the menu item allowing the item to pass the parameter through the lambda.

My best guess is that the compiler otherwise sees the lambda expression as the same expression for all the added menuitems, and therefore doesn't need to evaluate the value of s before the loop is completed (though don't quote me on that, I'm pretty sure there's a better explanation of what's happening behind the scenes here).

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

68 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

Related Questions

AddListener in foreach 2 Answers

how to make a button make an image show inside another button 1 Answer

Cursor dissapearing in my menu 0 Answers

ReEnable mouse(movement,selection,etc) after loading game menu 1 Answer

Restart a Scene 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