开发的时候场景里经常需要给列表对象重命名,Unity默认的命名是括号"Prefab(1)",有时候想使用自己习惯性的命名就必须一个个改名字。
在Unity2020之后编辑器提供了几个可选的命名方式。在ProjectSetting=>Editor=>Numbering Scheme下可以选择。除了括号以外还有点"Prefab.1"和下划线"Prefab_1"。
如果版本在2020之前或者提供的方案都不是自己的习惯方案,就只能通过编辑器脚本实现了。
脚本如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEditor.Experimental.SceneManagement;
public class RenameList
{
[MenuItem("Edit/RenameList", false)]
public static void Rename()
{
List<GameObject> objs = new List<GameObject>(Selection.gameObjects);
if (objs.Count > 0)
{
objs.Sort((a, b) =>
{
return a.transform.GetSiblingIndex() - b.transform.GetSiblingIndex();
});
string targetName = objs[0].name;
targetName = targetName.Split('_')[0];
for(int i = 0; i< objs.Count; i++)
{
objs[i].name = $"{targetName}_{i+1}";
}
}
var prefabStage = PrefabStageUtility.GetCurrentPrefabStage();
if (prefabStage != null)
{
ApplySelectedPrefab();
}
}
public static void ApplySelectedPrefab()
{
var prefabStage = PrefabStageUtility.GetCurrentPrefabStage();
var prefabFind = prefabStage.prefabContentsRoot.gameObject;
PrefabUtility.SaveAsPrefabAsset(prefabFind, prefabStage.prefabAssetPath);
AssetDatabase.SaveAssets();
Debug.Log(string.Format("{0} is applyed success!", prefabStage.prefabAssetPath));
}
}
使用方法是多选想要重命名的对象,然后点击菜单Editor=>RenameList,会以层级往下自增的方式命名。
注意函数ApplySelectedPrefab。当我们重命名预制体中的内容时,其修改不会直接应用到预制体上。所以先用PrefabStageUtility.GetCurrentPrefabStage()判断是否处于编辑预制体状态,如果是编辑的预制体,需要进一步保存编辑过的内容到预制体中。