gpt4 book ai didi

c# - Unity3D有什么好的全局异常处理策略?

转载 作者:IT王子 更新时间:2023-10-29 04:49:24 24 4
gpt4 key购买 nike

我正在考虑编写一些 Unity3D 脚本,我想设置全局异常处理系统。这不是为了在游戏的发布版本中运行,目的是捕获用户脚本和编辑器脚本中的异常,并确保将它们转发到数据库进行分析(并向相关开发人员发送电子邮件,以便他们可以解决他们的问题)。

在普通的 C# 应用程序中,我会围绕 Main 方法进行 try catch 。在 WPF 中,我会 Hook 一个或多个 unhandled exception events .在 Unity 中...?

到目前为止,我能想到的最好的是这样的:

using UnityEngine;
using System.Collections;

public abstract class BehaviourBase : MonoBehaviour {

// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {
try
{
performUpdate();
print("hello");
}
catch (System.Exception e)
{
print(e.ToString());
}

}

public abstract void performUpdate();

}

在其他脚本中,我派生了 BehaviourBase 而不是 MonoBehavior 并实现了 performUpdate() 而不是 Update()。我还没有为编辑器类实现并行版本,但我想我必须在那里做同样的事情。

但是,我不喜欢这种策略,因为我必须将它反向移植到我们从社区获取的任何脚本(并且我必须在团队中强制执行)。编辑器脚本也没有可与 MonoBehavior 相媲美的单一入口点,因此我假设我必须实现向导、编辑器等的异常安全版本。

我看到过关于使用 Application.RegisterLogCallback 捕获日志消息(而不是异常)的建议,但这让我感到不舒服,因为我需要解析调试日志字符串而不是访问实际的异常和堆栈跟踪。

那么...正确的做法是什么?

最佳答案

在您的场景中创建一个空的游戏对象并将此脚本附加到它:

using UnityEngine;
public class ExceptionManager : MonoBehaviour
{
void Awake()
{
Application.logMessageReceived += HandleException;
DontDestroyOnLoad(gameObject);
}

void HandleException(string logString, string stackTrace, LogType type)
{
if (type == LogType.Exception)
{
//handle here
}
}
}

确保有一个实例

剩下的就看你了。您还可以将日志存储在文件系统Web 服务器云存储 中。


请注意,DontDestroyOnLoad(gameObject) 使此 GameObject 持久化,防止它在场景更改时被销毁。

关于c# - Unity3D有什么好的全局异常处理策略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15061050/

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