区块链技术博客
www.b2bchain.cn

AssetDatabase.Refresh准备就绪时通知 – c#程序员分享

本文介绍了AssetDatabase.Refresh准备就绪时通知 – c#程序员分享,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

我有一个Unity3D编辑器类,可以动态创建新资产。然后,使用默认选项(强烈建议使用)调用AssetDatabase.Refresh。由于刷新是一种异步方法,因此我需要一种在刷新准备就绪时获得通知的方法。
背景:
我写了一个代码生成器来创建C#脚本。它旨在为场景中的活动游戏对象创建一个辅助组件。到目前为止,一切工作正常,该文件是通过System.File.IO中的方法创建的。现在,我想将新创建的MonoBehaviour自动添加到活动游戏对象中。
现状/限制因素:

正如预期的那样,在刷新过程中所有活动对象均被销毁。这使得无法使用任何标准的轮询方法(例如invoke或协程),因为它们在游戏对象被销毁时会终止。
轮询通常不是很好的解决方案,但是在这种情况下可以。另一方面,我不想使用线程,因为在Unity中不建议这样做。
如果刷新的准备就绪,则静态构造函数的类设置为InitializeOnLoadAttribute或在活动场景中引用该组件时,将立即调用它们。

可行的(麻烦的)方式:

定义一个ActionAfterRefresh类,其中包含要在刷新后执行的元信息和代码,例如要加载的类名称,并对其进行编码以在构造函数中为其执行AddComponent
将此类序列化为特殊缓存目录中的JSON文件
定义具有静态构造函数的类Loader

查找缓存目录中是否有匹配的JSON文件。如果是这样,请创建一个实例并执行代码
删除JSON文件

我认为这可能行得通,我想您知道我为什么撰写繁琐的文章。有没有更聪明,更好,更快的方法来实现这一目标?我是否忽略了实时保存的OnRefreshDatabaseReady事件?
谢谢你的帮助

参考方案

通知事项

方式1

这很有趣,但是您已经列出了此选项:

如果静态构造函数的类具有InitializeOnLoadAttribute设置,则在刷新准备好后立即调用它们

因此,如果调用某个带有[InitializeOnLoadAttribute]的类的静态构造函数:这是Unity刚刚重建解决方案的好兆头。

方式2.黑魔法:)

它没有记载,但是如果您在任何编辑器类的静态方法中添加[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;     } } 

这有点难看,但仍然是一个选择。

当回复有时是一个对象有时是一个数组时,如何在使用改造时解析JSON回复? – java

我正在使用Retrofit来获取JSON答复。这是我实施的一部分[email protected]("/api/report/list") Observable<Bills> listBill(@Query("employee_id") String employeeID); 而条例草案类是-public static class…

改造正在返回一个空的响应主体 – java

我正在尝试使用Retrofit和Gson解析一些JSON。但是,我得到的响应机构是空的。当我尝试从对象中打印信息时,出现NullPointerException。我确保URL正确,并且我也确保POJO也正确。我正在使用jsonschema2pojo来帮助创建POJO类。这是我要解析的JSON{ "?xml": { "@versi…

每个文件合并后添加换行 – python

我有很多类似以下内容的JSON文件:例如。1.json{"name": "one", "description": "testDescription…", "comment": ""} test.json{"name&#034…

Json到php,json_decode返回NULL – php

我正在用PHP进行JSON解析器的一些API,用于存储有关遗产的信息。我在解析时遇到问题,因为它返回的是NULL值而不是数组或对象。简单的JSON代码可以很好地解析,但是可以这样:{"success":true,"totalCount":1,"data":[{"id":99694…

您如何在列表内部调用一个字符串位置? – python

我一直在做迷宫游戏。我首先决定制作一个迷你教程。游戏开发才刚刚开始,现在我正在尝试使其向上发展。我正在尝试更改PlayerAre变量,但是它不起作用。我试过放在列表内和列表外。maze = ["o","*","*","*","*","*",…

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » AssetDatabase.Refresh准备就绪时通知 – c#程序员分享
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们