我有一个Unity3D编辑器类,可以动态创建新资产。然后我使用默认选项(强烈建议)调用AssetDatabase.Refresh。由于刷新是一种异步方式,我需要一种在刷新准备就绪时获取信息的方法。
背景:
我编写了一个代码生成器,用于创建C#脚本。它旨在为场景中的活动游戏对象创建辅助组件。到目前为止一切正常,该文件是由System.File.IO中的方法创建的。现在我想自动将新创建的MonoBehaviour添加到活动游戏对象中。
当前状态/限制因素:
可能有用(繁琐)的方式:
ActionAfterRefresh
,其中包含元数据和刷新后要执行的代码,例如:要加载的类名和在构造函数中为其执行AddComponent
的代码。Loader
:
我认为这可行,我猜你知道为什么我写了繁琐的。有没有更智能,更好,更快的方法来实现这一目标?我是否忽略了实时保存的OnRefreshDatabaseReady事件?
感谢您的帮助
答案 0 :(得分:6)
很有趣,但您已经列出了这个选项:
- 如果其类具有InitializeOnLoadAttribute set
,则在刷新就绪后立即调用静态构造函数
因此,如果调用某个带有[InitializeOnLoadAttribute]
的类的静态构造函数:这是Unity刚刚重建解决方案的一个好兆头。
它没有记录,但如果在任何编辑器类中向静态方法添加[DidReloadScripts]
属性,则在Unity重新编译脚本后将调用此方法。见例:
public class SomeEditorClass
{
[DidReloadScripts]
public static void OnCompileScripts()
{
Debug.Log("Bla-bla-bla");
}
}
但是为了使用所有这些来解决您的问题,您仍然需要一种在解决方案重建之间存储一些数据的方法。如果您正在从编辑器窗口进行“操作”,那么您可以使用以下技巧:Unity存储EditorWindow对象状态。所以,你可以这样做:
[InitializeOnLoadAttribute]
public class YourWindow : EditorWindow
{
const string path = @"Assets/Bla-bla-bla.cs";
private static bool justRecompiled;
static YourWindow()
{
justRecompiled = true;
}
[MenuItem("Test/YourWindow")]
public static void Generate()
{
GetWindow(typeof(YourWindow));
}
private bool waitingForRecompiling;
private GameObject gameObject;
public void OnRecompile()
{
MonoScript monoScript = AssetDatabase.LoadAssetAtPath(path, typeof(MonoScript)) as MonoScript;
Type monoScriptClass = monoScript.GetClass();
if (gameObject.GetComponent(monoScriptClass) == null)
gameObject.AddComponent(monoScriptClass);
}
public void OnGUI()
{
if (GUILayout.Button("Execute"))
if (Selection.activeGameObject != null)
{
// Do your script file generation here
waitingForRecompiling = true;
gameObject = Selection.activeGameObject;
AssetDatabase.ImportAsset(path);
}
}
public void Update()
{
if (justRecompiled && waitingForRecompiling)
{
waitingForRecompiling = false;
OnRecompile();
}
justRecompiled = false;
}
}
这有点难看,但仍然是一种选择。