UnityChainloader.cs 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. using BepInEx.Configuration;
  2. using BepInEx.Logging;
  3. using System.Diagnostics;
  4. using System.IO;
  5. using System.Reflection;
  6. using BepInEx.Bootstrap;
  7. using BepInEx.Preloader.Core.Logging;
  8. using BepInEx.Unity.Logging;
  9. using MonoMod.Utils;
  10. using UnityEngine;
  11. using Logger = BepInEx.Logging.Logger;
  12. namespace BepInEx.Unity.Bootstrap
  13. {
  14. /// <summary>
  15. /// The manager and loader for all plugins, and the entry point for BepInEx plugin system.
  16. /// </summary>
  17. public class UnityChainloader : BaseChainloader<BaseUnityPlugin>
  18. {
  19. /// <summary>
  20. /// The GameObject that all plugins are attached to as components.
  21. /// </summary>
  22. public static GameObject ManagerObject { get; private set; }
  23. private static void StaticStart(string gameExePath = null)
  24. {
  25. var instance = new UnityChainloader();
  26. instance.Initialize(gameExePath);
  27. instance.Execute();
  28. }
  29. private string _consoleTitle;
  30. protected override string ConsoleTitle => _consoleTitle;
  31. public override void Initialize(string gameExePath = null)
  32. {
  33. UnityTomlTypeConverters.AddUnityEngineConverters();
  34. ThreadingHelper.Initialize();
  35. ManagerObject = new GameObject("BepInEx_Manager");
  36. UnityEngine.Object.DontDestroyOnLoad(ManagerObject);
  37. var productNameProp = typeof(Application).GetProperty("productName", BindingFlags.Public | BindingFlags.Static);
  38. _consoleTitle = $"{CurrentAssemblyName} {CurrentAssemblyVersion} - {productNameProp?.GetValue(null, null) ?? Path.GetFileNameWithoutExtension(Process.GetCurrentProcess().ProcessName)}";
  39. base.Initialize(gameExePath);
  40. }
  41. protected override void InitializeLoggers()
  42. {
  43. Logger.Listeners.Add(new UnityLogListener());
  44. base.InitializeLoggers();
  45. if (Utility.CurrentPlatform != Platform.Windows)
  46. {
  47. Logger.LogInfo($"Detected Unity version: v{Application.unityVersion}");
  48. }
  49. if (!ConfigDiskWriteUnityLog.Value)
  50. {
  51. DiskLogListener.BlacklistedSources.Add("Unity Log");
  52. }
  53. ChainloaderLogHelper.RewritePreloaderLogs();
  54. if (ConfigUnityLogging.Value)
  55. Logger.Sources.Add(new UnityLogSource());
  56. }
  57. public override BaseUnityPlugin LoadPlugin(PluginInfo pluginInfo, Assembly pluginAssembly)
  58. {
  59. return (BaseUnityPlugin)ManagerObject.AddComponent(pluginAssembly.GetType(pluginInfo.TypeName));
  60. }
  61. private static readonly ConfigEntry<bool> ConfigUnityLogging = ConfigFile.CoreConfig.Bind(
  62. "Logging", "UnityLogListening",
  63. true,
  64. "Enables showing unity log messages in the BepInEx logging system.");
  65. private static readonly ConfigEntry<bool> ConfigDiskWriteUnityLog = ConfigFile.CoreConfig.Bind(
  66. "Logging.Disk", "WriteUnityLog",
  67. false,
  68. "Include unity log messages in log file output.");
  69. }
  70. }