- Home /
Created a new C# class via editor script, but error arise when I attempt to add the new component to a gameobject
I created a class via editor script, something similar to
string path = "Assets/Script/NewClass.cs";
using (StreamWriter sw = new StreamWriter(path)) {
sw.WriteLine("using UnityEngine;");
sw.WriteLine("using System.Collections;");
sw.WriteLine("");
sw.WriteLine("public class NewClass : MonoBehaviour {");
sw.WriteLine(" blah blah blah...");
sw.WriteLine("}");
}
AssetDatabase.ImportAsset(path, ImportAssetOptions.ForceUpdate);
AssetDatabase.Refresh();
Then later in the same function
GameObject newGameObject = new GameObject("NewGameObject");
newGameObject.AddComponent("NewClass");
Weird error message shows up, indicating the line 'newGameObject.AddComponent("NewClass");' is problematic.
klass != SCRIPTING_NULL
Any idea on this? Thanks in advance.
is you use the class manually (attach it to gameobject) does it work ? i am using class creation for storing mecanim state infos, becase they are not accesible in runtime, but it's not monobehaviour i produce, and i refresh manually and everything works
my guess is there's just something missing in the class
Answer by thedarknomad · Aug 24, 2014 at 12:57 PM
That's an assertion when the class is not found (at least it was in my case). Are you sure the name is correct ? I had this issue when I created a class, renamed the class and forgot to rename the file as well and I accidentally called AddComponent() with the incorrect name.
Answer by Leslie-Young · Jan 17, 2015 at 02:36 PM
Unity needs to import and compile the script before you can use it.
That happens after your call to ImportAsset and AssetDatabase.Refresh. I'm not sure about the exact timing but it is not before Refresh returns so by the time you try to use the script it is not yet ready.
For my own solution I tried to hook into the EditrApplication.update to check when EditrApplication.isCOmpiling is triggered and done but a problem arise since the editor script is also recompiled and thus the callback is destroyed.
The final solution for me was to write data to an asset file that I could check when my editor scripts are back up (using InitializeOnLoad to get the editor script to run) and then to add the script from info in this asset file.