Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 13 Next capture
2021 2022 2023
1 capture
13 Jun 22 - 13 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 Tuck · Mar 23, 2011 at 07:07 PM · materialeditor-scripting

Checking Object Material against list of materials

I have a list of materials set in an inspector window, and I want to check several objects to see if they are using any of the materials in the list. The code I have currently looks roughly like:

if(materialsList.Contains(targetObject.renderer.sharedMaterial))
   doStuff();

However this does not work because the materials attached to the object are of a different instance. For example, if I log the names of a material in the list called 'testMaterial,' and the name of the same material when attached to an object, I get

Debug.Log(materialsList[appropriateIndex].name) //Output is 'testMaterial (UnityEngine.Material)'
Debug.Log(targetObject.renderer.sharedMaterial.name) //Output is 'testMaterial (Instance) (UnityEngine.Material)'

Is there a way for me to show that these two materials are the same? Thanks.

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
0
Best Answer

Answer by Tuck · Mar 23, 2011 at 08:04 PM

Alright, so what I ended up doing was using string.split (reference here) to separate the strings of each material name into substrings whenever it encounters the '(' character, and then just compared the names of each material.

i.e. 'testMaterial (UnityEngine.Material)' and 'testMaterial (Instance) (UnityEngine.Material)' both become 'testMaterial ' so I can just compare the split name of the target object against the split name of each object in the list! Not quite as elegant as a simple list.contains() but works just fine :)

Comment
Add comment · Show 1 · 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 Petr Benysek · Mar 13, 2013 at 10:31 AM 0
Share

Unfortunately, checking just names is quite error-prone: if you'll have more materials with the same name in your project, you can easily mix them up.

A correct solution should be tracking down the source instance and comparing this. Unfortunately I don't know whether this is possible.

avatar image
0

Answer by Alexandre Zakime · Mar 23, 2011 at 07:17 PM

You could change the name of the instance.

var myObject = instantiate(prefab, transform.position, Quaternion.identity);

myObject.name = "testMaterial";

Don't know if it works properly

Comment
Add comment · Show 2 · 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 Tuck · Mar 23, 2011 at 07:33 PM 0
Share

Ha that actually might work with some tweaks. I'd been operating under the assumption that names were Read Only. I'll try it out and post my results.

avatar image Tuck · Mar 23, 2011 at 07:41 PM 0
Share

Hmmm after some messing about that solution seems doable but really messy. I would have to essentially insert the string "(Instance)" in between the name of the material and the auto generated "(UnityEngine.$$anonymous$$aterial)" bit. I'm going to poke around for another solution for a while.

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

1 Person is following this question.

avatar image

Related Questions

Setting an object's material causes strange behavior in custom editor 0 Answers

Normal map not rendered until the material asset is selected in the inspector 1 Answer

Making new material instance of sharedMaterial in editor mode 1 Answer

Material.mainTexture not working outside of runtime? 1 Answer

Customizing Editor Interface 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