gpt4 book ai didi

c# - 是否可以在 Unity Editor 中选择性地阻止重新加载某些程序集?

转载 作者:行者123 更新时间:2023-12-03 12:54:36 30 4
gpt4 key购买 nike

遇到了线程和 Unity 的一些问题,其中如果线程在后台运行,并且编辑器调用重新加载,例如,如果您最终或立即编辑脚本,Unity 将崩溃或卡住。

问题是因为所有程序集都被重新加载,因此线程程序集/dll 有一个悬空指针。

使问题更加复杂的是,即使线程真正完成了它的主程序,例如在运行外部可执行文件并关闭该可执行文件或返回退出代码的情况下,线程仍然没有正确清理,并且仍然会导致崩溃。中止、取消甚至加入主线程也不起作用。还有
一旦 Unity 重新加载它的所有程序集,就会发生一些奇怪的事情。日志文件总是显示 Unity 成功完成了重新加载,但紧接着,我们就有了悬空指针。

我知道你可以阻止重新加载

EditorApplication.LockReloadAssemblies();

,甚至你可以通过回调预重载来拦截重载......但是如果有一种方法可以阻止重新加载所有特定程序集,那将解决崩溃问题。

更简单的是一个文件夹,比如插件,其中的任何程序集都不会重新编译。

这个问题与运行时/播放模式无关,而只是在编辑器内部,因为我正在研究生产工具和插件。

有没有人知道这个非常令人沮丧的问题的解决方案?

最佳答案

在 Unity Editor 中使用 Thread 进行一些后台工作时,我也遇到了这个问题。我能够通过使用 UnityEditor.Callbacks.DidReloadScripts 中止并重新启动线程来解决挂起问题。 .这是我测试的代码:

using System.Threading;
using UnityEngine;

public static class Manager1
{
public static int Counter = 0;

private static Thread Thread;

static Manager1()
{
ThreadStart();
}

[UnityEditor.Callbacks.DidReloadScripts]
static void DidReload()
{
Restart();
}

static void Task()
{
while (true)
{
Counter++;
Thread.Sleep(100);
}
}

static void Abort()
{
Debug.Log("ABORT");
Thread.Abort();
Thread = null;
}

static void Restart()
{
Abort();
ThreadStart();
}

static void ThreadStart()
{
Thread = new Thread(Task);
Thread.Start();
}
}

但是,请注意我 还有必须将调用添加到 Thread.Sleep线程内。我无法找到任何有关此的信息,但我观察到如果没有那个电话, ThreadAbortException永远不会在线程中提出,线程当然永远不会结束。

关于c# - 是否可以在 Unity Editor 中选择性地阻止重新加载某些程序集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44504850/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com