Init.cs 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. using System;
  2. using System.Threading;
  3. using CommandLine;
  4. using UnityEngine;
  5. namespace ET
  6. {
  7. public class Init: MonoBehaviour
  8. {
  9. private void Start()
  10. {
  11. DontDestroyOnLoad(gameObject);
  12. // 为当前应用程序域添加未处理异常的事件处理器
  13. AppDomain.CurrentDomain.UnhandledException += (sender, e) =>
  14. {
  15. // 记录异常信息到日志中
  16. Log.Error(e.ExceptionObject.ToString());
  17. };
  18. // 添加线程同步处理功能
  19. Game.AddSingleton<MainThreadSynchronizationContext>();
  20. // 命令行参数
  21. // 使用 CommandLineParser 来标准化地解析命令行
  22. // CommandLineParser 是一款用于解析命令行参数的 NuGet 包。
  23. // 我们可以将下面的参数改为string[] args = "--AppType GameTool --StartConfig StartConfig/Localhost --Process 2 --Develop 1 --LogLevel 2 --Console 1 --CreateScenes 0".Split(" ");
  24. string[] args = "".Split(" ");
  25. Parser.Default.ParseArguments<Options>(args) // 将args数组中的元素解析为Options类型的对象
  26. .WithNotParsed(error => throw new Exception($"命令行格式错误! {error}"))// 如果解析失败,调用WithNotParsed方法,抛出一个异常,异常信息包含错误原因
  27. .WithParsed(Game.AddSingleton);// 如果解析成功,调用WithParsed方法,将解析得到的Options对象作为参数传递给Game.AddSingleton方法
  28. Game.AddSingleton<TimeInfo>();
  29. Game.AddSingleton<Logger>().ILog = new UnityLogger();
  30. Game.AddSingleton<ObjectPool>();
  31. Game.AddSingleton<IdGenerater>();
  32. Game.AddSingleton<EventSystem>();
  33. Game.AddSingleton<TimerComponent>();
  34. Game.AddSingleton<CoroutineLockComponent>();
  35. ETTask.ExceptionHandler += Log.Error;
  36. Game.AddSingleton<CodeLoader>().Start();
  37. }
  38. private void Update()
  39. {
  40. // 更新游戏中的单例对象
  41. Game.Update((int)(Time.deltaTime * 1000));
  42. }
  43. private void LateUpdate()
  44. {
  45. // 更新游戏中的单例对象
  46. Game.LateUpdate();
  47. Game.FrameFinishUpdate();
  48. }
  49. private void OnApplicationQuit()
  50. {
  51. Game.Close();
  52. }
  53. }
  54. }