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

相關文章
相關標籤/搜索