unity 程式碼批量修改Remove Missing Script和批量修改指定元件的內容
昨天在專案開發中,發現一個問題,就是一些指令碼已經被廢棄,但是這些廢棄指令碼還是被繫結在某些預製體中,這時候執行就會產生很多Missing Script的警告資訊,這些警告雖不影響程式碼的實際執行,但是一個大專案肯定不能出現的N多的警告資訊,並且這裡通過手動去找肯定不現實,所以這裡我們就同一個指令碼去實現自動去遍歷所有的prefab然後移除Missing的元件,下面是具體的程式碼資訊。
1.首先在工程中建立一個Editro資料夾,將指令碼放在Editor資料夾下
2.通過選中檔案,通過編輯器實現遍歷該資料夾下的所有prefab:
[MenuItem("工具/物件移除丟失指令碼")]
static void GetAllGo()
{
//尋找你選中資料夾下的所有檔案
object[] obj = Selection.GetFiltered(typeof(object), SelectionMode.DeepAssets);
for (int i = 0; i < obj.Length; i++)
{
//獲取檔案的字尾資訊
string ext = System.IO.Path.GetExtension(obj[i].ToString());
//這裡篩選出不是預製體的物體
if (!ext.Contains(".GameObject"))
{
continue;
}
GameObject go = (GameObject)obj[i];
// 移除子物體下的指令碼丟失
foreach (Transform trans in go.GetComponentsInChildren<Transform>(true))
{
CleanMissingScript(trans.gameObject, go);
}
}
}
3.找到prefab,去遍歷她的所有子物體,並實現直接移除相應的空元件:
static void CleanMissingScript(GameObject go, GameObject parentGO)
{
var components = go.GetComponents<Component>();
var serializedObject = new SerializedObject(go);
var prop = serializedObject.FindProperty("m_Component");
int r = 0;
for (int j = 0; j < components.Length; j++)
{
if (components[j] == null)
{
prop.DeleteArrayElementAtIndex(j - r);
MyDebug.Log("成功移除丟失指令碼,gameObject name: " + go.name + " ---父類prefab name:" + parentGO.name);
r++;
}
}
serializedObject.ApplyModifiedProperties();
}
4.如果還要做其他操作,比如我們寫了一個擴充套件的button指令碼,這時候我們不可能通過手動去把所有之前的button換成新的butonPlus,所以這時候就需要去程式碼自動實現:
static void CleanMissingScript(GameObject go, GameObject parentGO)
{
var components = go.GetComponents<Component>();
//如果當前元件有按鈕
if (go.GetComponent<UnityEngine.UI.Button>() != null)
{
Button btn = go.GetAddComponent<Button>();
//copy之前的元件資訊
UnityEditorInternal.ComponentUtility.CopyComponent(btn);
//移除元件資訊
GameObject.DestroyImmediate(btn);
//TODO:新增新的元件資訊
}
serializedObject.ApplyModifiedProperties();
}
5.下面是完整指令碼:
using UnityEngine;
using UnityEditor;
using UnityEngine.UI;
/// <summary>
/// 移除專案中go上丟失的指令碼
/// </summary>
public class RemoveMissingScript
{
[MenuItem("SlgTool/程式工具/物件移除丟失指令碼")]
static void GetAllGo()
{
object[] obj = Selection.GetFiltered(typeof(object), SelectionMode.DeepAssets);
for (int i = 0; i < obj.Length; i++)
{
string ext = System.IO.Path.GetExtension(obj[i].ToString());
Debug.Log("name:" + ext);
if (!ext.Contains(".GameObject"))
{
continue;
}
GameObject go = (GameObject)obj[i];
// 移除子物體下的指令碼丟失
foreach (Transform trans in go.GetComponentsInChildren<Transform>(true))
{
CleanMissingScript(trans.gameObject, go);
}
}
}
static void CleanMissingScript(GameObject go, GameObject parentGO)
{
var components = go.GetComponents<Component>();
var serializedObject = new SerializedObject(go);
var prop = serializedObject.FindProperty("m_Component");
int r = 0;
for (int j = 0; j < components.Length; j++)
{
if (components[j] == null)
{
prop.DeleteArrayElementAtIndex(j - r);
MyDebug.Log("成功移除丟失指令碼,gameObject name: " + go.name + " ---父類prefab name:" + parentGO.name);
r++;
}
}
serializedObject.ApplyModifiedProperties();
}
}
這裡就是一個完整的程式碼自動查詢prefab下的空元件,然後移除的程式碼。
想了解更多請新增下方公眾號,或者新增QQ群:879354767
相關文章
- chpasswd 批量修改密碼密碼
- 批量修改檔名的bash指令碼指令碼
- 批量修改azure內網地址為靜態內網
- 批量修改OC類名指令碼 -- python指令碼Python
- java批量修改檔名Java
- iOS使用shell指令碼批量修改屬性iOS指令碼
- [20220329]批量修改檔名.txt
- 批量修改行尾註釋(程式碼規範檢查中)
- iOS使用Shell指令碼批量修改類名稱iOS指令碼
- win10批量修改檔名的步驟_win10如何批量修改檔名Win10
- Python批量修改檔名和檔案型別Python型別
- Linux rename命令批量修改檔名Linux
- win10如何批量檔案字尾修改_win10怎麼批量修改字尾Win10
- 批量修改檔案中的圖片名稱
- node實現批量修改圖片尺寸
- Linux 批量修改檔案字尾名Linux
- SAP UI5 OData V4 表格控制元件的批量修改UI控制元件
- sumo筆記(八)——批量修改net中的edge筆記
- 修改Jar內容JAR
- 快速批量修改檔名[機器學習]機器學習
- Oracle-批量修改欄位裡面的值Oracle
- 網站文章內容修改 如何修改網站文章內容網站
- 網站原始碼密碼修改?怎樣修改網站模板的內容?網站原始碼密碼
- Git批量修改歷史commit中的user.name 和user.emailGitMITAI
- 利用Python快速批量修改資料集檔名Python
- 網站模板文字內容修改,如何在網站後臺或程式碼編輯器中修改模板文字內容網站
- 怎麼修改網站內容原始碼網站原始碼
- Wordpress網站修改,Wordpress網站內容和設定修改方法網站
- 修改網頁內容的方法網頁
- poi批量修改Excel文件,修改工作表中的目標單元格資料Excel
- 如何用Python批量提取PDF文字內容?Python
- Android與Python之批量修改AndroidManifest.xml檔案AndroidPythonXML
- 在Linux中使用mmv命令批量修改檔名稱Linux
- node實現檔案屬性批量修改(檔名)
- 根據查詢條件批量修改表資料
- A Better Finder Attributes 7 for Mac - 影像批量資訊修改工具Mac
- 資訊批量修改工具:A Better Finder Attributes 7 Mac版Mac
- 批量修改vsphere共享儲存多路徑選擇策略