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?
Jamora
June 27, 2013, 12:42pm
3
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.
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 ();
}
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: Unity - Scripting API: GameObject.AddComponent