• 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
1
Question by whitedrow · Oct 24, 2017 at 11:53 AM · c#addcomponent

AddComponent with dynamic parameter

Hi there,

it's a long time that I used Unity so I stumbled upon the new AddComponent. And I switched to C# - so problems have doubled :-)

My problem is, that I need to pass a string at runtime to AddComponent but I can't get it to work. I've got a lot of scripts like: "Level001.cs", "Level002.cs" and so on.


This is working - but not what I want:
gameObject.AddComponent<Level001>();
gameObject.GetComponent<Level001>().Test();


This is not working
string levelname = "001";
gameObject.AddComponent<"Level" + levelname>();
gameObject.GetComponent<"Level" + levelname>().Test();


Is it possible at all?
Can you tell me how?

Examples are appreciated ;-)

Greetings,
Whitedrow

Comment
Add comment · Show 1
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 PizzaPie · Oct 24, 2017 at 12:22 PM 0
Share

Use the other overload GetComponent(Type type) same goes for Add, ex

 Type mType = typeof(Level001);
 
 Component comp = GetComponent(mType);

For more help post the rest of the script where you aquire or set those string.

3 Replies

· Add your reply
  • Sort: 
avatar image
0

Answer by OutOfRam · Oct 24, 2017 at 03:47 PM

Hey there,

From what I can tell, your issue is that you are trying to use a string to add a component. Sadly, AddComponent() was removed from unity 5.0 and onward, in an attempt to break dependencies.

Here is a post explaining the work arounds you can attempt:

https://blogs.unity3d.com/2015/01/21/addcomponentstring-api-removal-in-unity-5-0/

I hope this helps!

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
avatar image
1

Answer by JVLVince · Oct 24, 2017 at 12:54 PM

This is not working
string levelname = "001";
gameObject.AddComponent<"Level" + levelname>();
gameObject.GetComponent<"Level" + levelname>().Test();


The problem here is that you using the generic type of Add and GetComponent. As This documented you only alow use Type inside . I think you should take a look here for more information about generic type. An other way to approach your Idea is use Type in C#

Something like this: (not tested yet)

string levelname = "001";
var t = Type.GetType("Level" + levelname).
gameObject.AddComponent(t);
gameObject.GetComponent(t).Test();


P/S: But I highly recommend you use

gameObject.AddComponent< typeof(t) >();
gameObject.GetComponent< typeof(t) >().Test();
instead

Hope this help.

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
avatar image
1

Answer by Flokky_ · Oct 24, 2017 at 12:01 PM

What about that way:

 // Adds the script named FoobarScript to the game object
 gameObject.AddComponent ("FoobarScript");
 // Gets the script named FoobarScript from the game object
 gameObject.GetComponent ("FoobarScript");




Comment
Add comment · Show 7 · 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 whitedrow · Oct 24, 2017 at 12:10 PM 0
Share

That was my first try and ended me to the forum. The console says:
UnityEngine.GameObject.AddComponent(string)' is obsolete: `GameObject.AddComponent with string argument has been deprecated. Use GameObject.AddComponent() ins$$anonymous$$d.

avatar image Flokky_ whitedrow · Oct 24, 2017 at 12:41 PM 0
Share

Yeap, it's true. I just forgot that thing cause I don't use this method.
Try this GameObject.AddComponent(Type.GetType("TypeName")). I can't check now wether it's usefull, but it might be.

avatar image JVLVince whitedrow · Oct 24, 2017 at 12:43 PM 0
Share

Did you try?
gameObject.AddComponent(typeof(Level001)); gameObject.GetComponent(typeof(Level001));

avatar image Harinezumi whitedrow · Oct 24, 2017 at 12:52 PM 0
Share

What the console says is a warning, not an error, so in your current version of Unity it will work, but it might disappear in the future. Even so, I wouldn't recommend using deprecated functionality, usually there is a reason behind it why.

I quickly checked what Flokky_ wrote, and it does seem to work (even though I wouldn't recommend relying on type names).

I'm not exactly sure what you are doing, but you can usually avoid adding components based on what level you are in. What if you stored references to prefabs that have the correct script on them, and all of those scripts derived from a public abstract class LevelBase : $$anonymous$$onoBehaviour which has a public abstract void Test (); method, and then in your Level### scripts you implement Test()?

avatar image whitedrow Harinezumi · Oct 24, 2017 at 06:25 PM 0
Share

Following code works:

 string s = "001";  
 System.Type myType = Type.GetType("Level" + s);  
 gameObject.AddComponent(myType);  

In the inspector I can see that the script Level001.cs is attached to the game object.

But this code fails:

 gameObject.GetComponent(myType).Test();  

It throws an error:

 Assets/scripts/GameControl.cs(52,37): error CS1061: Type `UnityEngine.Component' does not contain a definition for `Test' and no extension method `Test' of type `UnityEngine.Component' could be found. Are you missing an assembly reference?




Show more comments

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

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

Multiple Cars not working 1 Answer

Distribute terrain in zones 3 Answers

How to check if a script component exists before adding it? 2 Answers

Illuminating a 3D object's edges OnMouseOver (script in c#)? 1 Answer

Instantiate creating infinite clones 0 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