Unity 琐碎5 : 利用反射设置编辑器参数

问题

最近处理unity资源打包问题时候常常遇到的一个问题就是平台切换和Bundle编译。通常状况下,平台转换我须要依赖Cache Serbver加快转换速度,可是在Build Bundle的时候我又不想打开Cache Server,由于会很是很是慢(bundle文件超过2000个)。每次都记得这个操做不现实,因此就考虑是否能够在平时打开Cache Server,Build Bundle时关闭。html

Unity 自身Editor没提供这个方面的API参考钱康来C#反射——掀起Unity Editor面纱一问的思路,只要是编辑器下能够操做的按钮或者界面应该均可以经过反射进行额外的设置(前提手里有源码哈)。CacheServerPreferences类是UnityEditor内部类,主要处理菜单Editor-->Preferences中 Cache Server 界面的数据处理,so,折腾了一会发射就会有下面的代码:编辑器

参考代码

private static void SetCacheServer(bool enable, string ipAddr = "10.8.21.74")
 {
     //1 获取程序集
     Assembly asm = Assembly.GetAssembly(typeof(UnityEditor.AssetImporter));
     if (asm == null)
     {
         return;
     }

     //2 UnityEditor 内部类
     Type cacheServerType = asm.GetType("UnityEditor.CacheServerPreferences");

     //3 建立实例
     object cacheServerPreferencesObj = System.Activator.CreateInstance(cacheServerType);

     //4 经过反射读取已设置的参数
     MethodInfo readPreferencesMethod = cacheServerType.GetMethod("ReadPreferences");
     readPreferencesMethod.Invoke(cacheServerPreferencesObj, null);

     //5 经过反射设置CacheServer 参数
     FieldInfo CacheServerMode = cacheServerType.GetField("s_CacheServerMode", BindingFlags.NonPublic | BindingFlags.Static);
     FieldInfo CacheServerIPAddress = cacheServerType.GetField("s_CacheServerIPAddress", BindingFlags.NonPublic | BindingFlags.Static);

     CacheServerMode.SetValue(cacheServerPreferencesObj, enable? 1:2);
     CacheServerIPAddress.SetValue(cacheServerPreferencesObj, ipAddr);

     //6 经过反射 保存 CacheServer 参数
     MethodInfo writePreferencesMethod = cacheServerType.GetMethod("WritePreferences");
     writePreferencesMethod.Invoke(cacheServerPreferencesObj, null);
 }

参考

在命名空间中经过反射,获取全部类型
C#反射Assembly 详细说明
Assembly 类
C#反射——掀起Unity Editor面纱ui

相关文章
相关标签/搜索