- Home /
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?
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.
This seems like a pretty good work-around, thanks! I can't use the Start()
suggestion but the component one will work :)
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
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);
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 ();
}
Your answer
Follow this Question
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