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 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.

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

C# String Array Has Missing or Incorrect Keycode Strings 2 Answers

Can I create a list with an int/float and a string? C# 2 Answers


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