private void EnsureConfig() { if (BoltCore.instance == null || BoltCore.Configuration == null) { PluginContainer.Initialize(); } }
// Automatically generates the link.xml file to prevent stripping. // Currently only used for plugin assemblies, because blanket preserving // all setting assemblies sometimes causes the IL2CPP process to fail. // For settings assemblies, the AOT stubs are good enough to fool // the static code analysis without needing this full coverage. // https://docs.unity3d.com/Manual/iphone-playerSizeOptimization.html // However, for FullSerializer, we need to preserve our custom assemblies. // This is mostly because IL2CPP will attempt to transform non-public // property setters used in deserialization into read-only accessors // that return false on PropertyInfo.CanWrite, but only in stripped builds. // Therefore, in stripped builds, FS will skip properties that should be // deserialized without any error (and that took hours of debugging to figure out). private void GenerateLinker() { var linker = new XDocument(); var linkerNode = new XElement("linker"); if (!PluginContainer.initialized) { PluginContainer.Initialize(); } foreach (var pluginAssembly in PluginContainer.plugins .SelectMany(plugin => plugin.GetType() .GetAttributes <PluginRuntimeAssemblyAttribute>() .Select(a => a.assemblyName)) .Distinct()) { var assemblyNode = new XElement("assembly"); var fullnameAttribute = new XAttribute("fullname", pluginAssembly); var preserveAttribute = new XAttribute("preserve", "all"); assemblyNode.Add(fullnameAttribute); assemblyNode.Add(preserveAttribute); linkerNode.Add(assemblyNode); } linker.Add(linkerNode); PathUtility.CreateDirectoryIfNeeded(BoltCore.Paths.transientGenerated); PathUtility.DeleteProjectFileIfExists(linkerPath, true); // Using ToString instead of Save to omit the <?xml> declaration, // which doesn't appear in the Unity documentation page for the linker. File.WriteAllText(linkerPath, linker.ToString()); }
private void EnsureConfig() { if (_vsCoreConfig != null) { return; } if (BoltCore.instance == null || BoltCore.Configuration == null) { UnityAPI.Initialize(); PluginContainer.Initialize(); } _vsCoreConfig = BoltCore.Configuration; }
public void OnPreprocessBuild(BuildReport report) { // If the user isn't using Visual Scripting, we don't do any of this if (!VSUsageUtility.isVisualScriptingUsed) { return; } if (!PluginContainer.initialized) { PluginContainer.Initialize(); } if (instance == null || BoltCore.instance == null) { UnityEngine.Debug.Log($"Aborting AOT Prebuild, reason: {(instance == null ? "No instance" : BoltCore.instance == null ? "No BoltCore.instance" : "???")}"); return; } if (PlayerSettings.GetScriptingBackend(report.summary.platformGroup) != ScriptingImplementation.IL2CPP) { return; } GenerateAotStubs(); }