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 批量修改密碼密碼
- expect批量修改密碼密碼
- 批量修改檔案的編碼
- 批量修改表名和列名
- 批量修改檔名的bash指令碼指令碼
- 批量修改檔名
- 批量修改azure內網地址為靜態內網
- java批量修改檔名Java
- cssText批量修改樣式CSS
- Python批量修改資料夾內所有json檔案中部分內容PythonJSON
- stms傳輸批量請求和修改sap標準程式程式碼
- iOS使用shell指令碼批量修改屬性iOS指令碼
- 批量修改OC類名指令碼 -- python指令碼Python
- win10批量修改檔名的步驟_win10如何批量修改檔名Win10
- 快速批量修改檔名[機器學習]機器學習
- 批量修改檔名實踐
- Linux 批量修改檔名Linux
- 批量修改檔名 與 批量檔案字元替換字元
- 雙擊直接修改內容的js程式碼JS
- 用美圖秀秀批量修改影象尺寸解析度大小、批量修改名字
- 批量修改行尾註釋(程式碼規範檢查中)
- iOS使用Shell指令碼批量修改類名稱iOS指令碼
- linux批量替換指定資料夾中所有檔案的指定內容Linux
- win10如何批量檔案字尾修改_win10怎麼批量修改字尾Win10
- 批量修改檔案中的圖片名稱
- linux下批量修改使用者密碼Linux密碼
- Python批量修改檔名和檔案型別Python型別
- node實現批量修改圖片尺寸
- Linux rename命令批量修改檔名Linux
- perl命令:批量修改替換檔案
- find命令批量修改檔案字尾
- 修改Jar內容JAR
- SAP UI5 OData V4 表格控制元件的批量修改UI控制元件
- sumo筆記(八)——批量修改net中的edge筆記
- linux下批量修改檔案中的字元Linux字元
- 網站原始碼密碼修改?怎樣修改網站模板的內容?網站原始碼密碼
- Linux 批量修改檔案字尾名Linux
- Oracle-批量修改欄位裡面的值Oracle