• 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 Ben Humphreys · Jun 27, 2013 at 10:18 AM · c#stringaddcomponent

Add Component Using String, Runtime Types?

I'm trying to add a component to an object at run-time based on the contents of a string.

I know I can do GameObject.AddComponent(componentName), but I then need to call a function on it, and C# errors as it doesn't know the class type.

I usually add components with GameObject.AddComponent(), so I tried:

 Type t = Type.GetType(componentName);
 t comp = obj.AddComponent<t>();
 comp.MyFunction();

But C# throws "The type or namespace name `t' could not be found. Are you missing a using directive or an assembly reference?"

What am I doing wrong?

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

3 Replies

· Add your reply
  • Sort: 
avatar image
2
Best Answer

Answer by Jamora · Jun 27, 2013 at 12:42 PM

If the components you are trying to add are written by you and inherit MonoBehaviour, simply put the function call into either Start() or Awake() of the script.

If these aren't one-off function calls, consider using interfaces. Create an interface that defines the behavior of your addable components (their functions, mainly) and do something like:

 IAddableComponent component = (IAddableComponent)obj.addComponent(componentName);
 component.MyFunction();

On the off chance, that what you're trying to add aren't scripts made by you... I would rethink my design or use a switch-case.

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 Ben Humphreys · Jun 27, 2013 at 01:15 PM 0
Share

This seems like a pretty good work-around, thanks! I can't use the Start() suggestion but the component one will work :)

avatar image
2

Answer by amphoterik · Jun 27, 2013 at 12:03 PM

Let's say the value of the component you want to add is in string s1:

 string s1 = "Light";

Adding it to your object is really easy:

 gameObject.AddComponent(s1);

That's it! AddComponent takes in a string as its value. More info: http://docs.unity3d.com/Documentation/ScriptReference/GameObject.AddComponent.html

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 Ben Humphreys · Jun 27, 2013 at 01:13 PM 0
Share

Thanks for the reply, I knew about the string version of AddComponent, but I need to get a reference to the component that has been added with its correct type, so it doesn't help.

I really need Type newComponent = gameObject.AddComponent(s1);

avatar image
1

Answer by McCorner · Aug 05, 2016 at 10:51 AM

Well, now you can get type of your component like this :

 private Type AddComponent(string component){
  Component tmp =UnityEngineInternal.APIUpdaterRuntimeServices.AddComponent 
  (this.gameObject, "", component);
  return tmp.GetType ();     
 }
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.

Welcome to Unity Answers

If you’re new to Unity Answers, please check our User Guide to help you navigate through our website and refer to our FAQ for more information.

Before posting, make sure to check out our Knowledge Base for commonly asked Unity questions.

Check our Moderator Guidelines if you’re a new moderator and want to work together in an effort to improve Unity Answers and support our users.

Follow this Question

Answers Answers and Comments

18 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

Related Questions

C# string as type for AddComponent 2 Answers

Multiple Cars not working 1 Answer

Distribute terrain in zones 3 Answers

string.TrimEnd() not working as expected 1 Answer

How to split alphanumeric string into array of strings based from their type : alpha or numeric ? 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