146 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			146 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| 
 | |
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.IO;
 | |
| using System.Xml.Serialization;
 | |
| 
 | |
| #if UNITY_EDITOR
 | |
| using UnityEditor;
 | |
| #endif
 | |
| 
 | |
| namespace FishNet.Configuring
 | |
| {
 | |
| 
 | |
|     public enum StrippingTypes : int
 | |
|     {
 | |
|         Redirect = 0,
 | |
|         Empty_Experimental = 1,
 | |
|     }
 | |
|     public enum SearchScopeType : int
 | |
|     {
 | |
|         EntireProject = 0,
 | |
|         SpecificFolders = 1,
 | |
|     }
 | |
| 
 | |
|     public class PrefabGeneratorConfigurations
 | |
|     {
 | |
|         public bool Enabled = true;
 | |
|         public bool LogToConsole = true;
 | |
|         public bool FullRebuild = false;
 | |
|         public bool SaveChanges = true;
 | |
|         public string DefaultPrefabObjectsPath = Path.Combine("Assets", "DefaultPrefabObjects.asset");
 | |
|         public int SearchScope = (int)SearchScopeType.EntireProject;
 | |
|         public List<string> ExcludedFolders = new List<string>();
 | |
|         public List<string> IncludedFolders = new List<string>();
 | |
|     }
 | |
| 
 | |
|     public class CodeStrippingConfigurations
 | |
|     {
 | |
|         public bool IsBuilding = false;
 | |
|         public bool IsDevelopment = false;
 | |
|         public bool IsHeadless = false;
 | |
|         public bool StripReleaseBuilds = false;
 | |
|         public int StrippingType = (int)StrippingTypes.Redirect;
 | |
|     }
 | |
| 
 | |
| 
 | |
|     public class ConfigurationData
 | |
|     {
 | |
|         //Non serialized doesn't really do anything, its just for me.
 | |
|         [System.NonSerialized]
 | |
|         public bool Loaded;
 | |
| 
 | |
|         public PrefabGeneratorConfigurations PrefabGenerator = new PrefabGeneratorConfigurations();
 | |
|         public CodeStrippingConfigurations CodeStripping = new CodeStrippingConfigurations();
 | |
|     }
 | |
| 
 | |
|     public static class ConfigurationDataExtension
 | |
|     {
 | |
|         /// <summary>
 | |
|         /// Returns if a differs from b.
 | |
|         /// </summary>
 | |
|         public static bool HasChanged(this ConfigurationData a, ConfigurationData b)
 | |
|         {
 | |
|             return (a.CodeStripping.StripReleaseBuilds != b.CodeStripping.StripReleaseBuilds);
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// Copies all values from source to target.
 | |
|         /// </summary>
 | |
|         public static void CopyTo(this ConfigurationData source, ConfigurationData target)
 | |
|         {
 | |
|             target.CodeStripping.StripReleaseBuilds = source.CodeStripping.StripReleaseBuilds;
 | |
|         }
 | |
| 
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Writes a configuration data.
 | |
|         /// </summary>
 | |
|         public static void Write(this ConfigurationData cd, bool refreshAssetDatabase)
 | |
|         {
 | |
|             /* Why is this a thing you ask? Because Unity makes it VERY difficult to read values from
 | |
|              * memory during builds since on some Unity versions the building application is on a different
 | |
|              * processor. In result instead of using memory to read configurationdata the values
 | |
|              * must be written to disk then load the disk values as needed.
 | |
|              * 
 | |
|              * Fortunatelly the file is extremely small and this does not occur often at all. The disk read
 | |
|              * will occur once per script save, and once per assembly when building. */
 | |
|             try
 | |
|             {
 | |
|                 string path = Configuration.GetAssetsPath(Configuration.CONFIG_FILE_NAME);
 | |
|                 XmlSerializer serializer = new XmlSerializer(typeof(ConfigurationData));
 | |
|                 TextWriter writer = new StreamWriter(path);
 | |
|                 serializer.Serialize(writer, cd);
 | |
|                 writer.Close();
 | |
| #if UNITY_EDITOR
 | |
|                 if (refreshAssetDatabase)
 | |
|                 {
 | |
|                     AssetDatabase.SaveAssets();
 | |
|                     AssetDatabase.Refresh();
 | |
|                 }
 | |
| #endif
 | |
|             }
 | |
|             catch (Exception ex)
 | |
|             {
 | |
|                 throw new Exception($"An error occurred while writing ConfigurationData. Message: {ex.Message}");
 | |
|             }
 | |
| 
 | |
|         }
 | |
| 
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Writes a configuration data.
 | |
|         /// </summary>
 | |
|         public static void Write(this ConfigurationData cd, string path, bool refreshAssetDatabase)
 | |
|         {
 | |
|             /* Why is this a thing you ask? Because Unity makes it VERY difficult to read values from
 | |
|              * memory during builds since on some Unity versions the building application is on a different
 | |
|              * processor. In result instead of using memory to read configurationdata the values
 | |
|              * must be written to disk then load the disk values as needed.
 | |
|              * 
 | |
|              * Fortunatelly the file is extremely small and this does not occur often at all. The disk read
 | |
|              * will occur once per script save, and once per assembly when building. */
 | |
|             try
 | |
|             {
 | |
|                 XmlSerializer serializer = new XmlSerializer(typeof(ConfigurationData));
 | |
|                 TextWriter writer = new StreamWriter(path);
 | |
|                 serializer.Serialize(writer, cd);
 | |
|                 writer.Close();
 | |
| #if UNITY_EDITOR
 | |
|                 if (refreshAssetDatabase)
 | |
|                 {
 | |
|                     AssetDatabase.SaveAssets();
 | |
|                     AssetDatabase.Refresh();
 | |
|                 }
 | |
| #endif
 | |
|             }
 | |
|             catch (Exception ex)
 | |
|             {
 | |
|                 throw new Exception($"An error occurred while writing ConfigurationData. Message: {ex.Message}");
 | |
|             }
 | |
| 
 | |
|         }
 | |
| 
 | |
|     }
 | |
| 
 | |
| 
 | |
| } |