英文:
Unity: Catch exception thrown during Awake()
问题
我有一个Unity项目,其中我动态实例化了一个预制件,而该预制件具有一个自定义脚本组件,在Awake()函数中进一步初始化该组件。在这一点上,初始化可能会失败,并且需要中止,这意味着当前游戏对象和被调用的对象都需要以某种方式通知。虽然销毁游戏对象没有问题,但优雅地通知调用者正在变得更加困难。
实例抛出的异常显示在Unity Console中,异常的堆栈跟踪还包括Instantiate调用,但尝试在具有Instantiate调用的行上捕获任何异常都不起作用。
如何在调用者的那一点上捕获异常,或者以其他方式使用内置功能来表示需要中止初始化?
附言:
我知道我可以让实例设置一个标志,并从调用者那里检查它,或者首先让Unity处理游戏对象的初始化,并在直接调用中处理我的初始化并捕获错误,但我希望有可能找到一个更好的解决方案。
英文:
I have a Unity project where I'm dynamically instantiating a prefab, and that prefab has a custom script component that further initializes the component during the Awake() function. At this point initizalization might fail and need to be aborted, which means that both the current game object needs to be destroyed, and the called needs to be notified in some way. While destroying the game object is no problem, elegantly notifying the caller is proving more difficult.
The exception thrown by the instance appears in the Unity Console, where the stack trace of the exception also includes the Instantiate call, but attempting to catch any exception on the line with the Instantiate call does nothing.
How can I catch an exception at that point in the caller, or otherwise use built-in functionality to signal that initialization needs to be aborted?
P.S.<br>
I Know I could let the instance set a flag and inspect that from the caller, or first let Unity handle initialization of the game object, and handle my initialization in a direct call and catch an error there, but I was hoping a nicer solution is possible.
答案1
得分: 2
Instantiate
方法在内部捕获异常,因此您无法在外部捕获任何异常,必须在Awake
消息中捕获它们,然后使用DestroyImmediate
方法立即销毁实例。
void Awake()
{
try
{
throw new System.Exception();
}
catch
{
DestroyImmediate(gameObject);
}
}
通过使用这种方法,Instantiate
方法可以抛出UnityException
,您可以捕获它。
try
{
Instantiate(prefab);
}
catch(UnityException)
{
print("Instantiate prefab failed");
}
英文:
The Instantiate
method catches exceptions internally, so that you cannot catch any exceptions outside, you must catch them inside the Awake
message and then use the DestroyImmediate
method to destroy the instance immediately.
void Awake()
{
try
{
throw new System.Exception();
}
catch
{
DestroyImmediate(gameObject);
}
}
By using this method, the Instantiate
method can throw a UnityException
which you are able to catch.
try
{
Instantiate(prefab);
}
catch(UnityException)
{
print("Instantiate prefab failed");
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论