OK了!老铁
今天来分享第二个工具,希望能帮到有需要的人哦!
作用:两个相同的预制体(内部GameObject显隐状态不同),将B作为参考预制体,把A内的GameObject的显隐状态同步为B内的GameObject的显隐状态。
这么讲一定有点懵吧,那我们直接上图!
下图是工具窗口,第一个是被同步的预制体,第二个是参考预制体,点击应用就可以同步成功,也可以恢复
举例:
第一,Prefab1和Prefab2是两个相同的预制体,但是Prefab1的GameObject4,5,6的显隐状态不同于Prefab2
第二,根据自己需求,将两个预制体拖入
第三,点击应用
第四,应用成功!这样就一键同步了
第五,当我们想恢复操作时,点击恢复,就可以恢复之前的显隐状态了
注意!!!如果应用后关闭窗口,就不能恢复了哦。
第六,由于是根据GameObject名字进行同步的,其他GameObject多与少都没关系
好了,介绍就到这里。。。
最后,附上代码!
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class PrefabReferenceTool : EditorWindow {
private GameObject prefab1; //预制体1
private GameObject prefab2; //预制体2
private Dictionary<GameObject, bool> originalStates = new Dictionary<GameObject, bool>();
[MenuItem("Tools/相同预制体显隐设置")]
public static void ShowWindow()
{
GetWindow<PrefabReferenceTool>("相同预制体显隐设置");
}
void OnGUI()
{
GUILayout.Label("需要设置的预制体:");
prefab1 = EditorGUILayout.ObjectField(prefab1, typeof(GameObject), false) as GameObject;
GUILayout.Label("参考预制体:");
prefab2 = EditorGUILayout.ObjectField(prefab2, typeof(GameObject), false) as GameObject;
if (GUILayout.Button("应用"))
{
ApplyReference();
}
if (GUILayout.Button("恢复"))
{
RestoreOriginalStates();
}
}
void ApplyReference()
{
if (prefab1 == null || prefab2 == null)
{
Debug.LogWarning("请确认两个预制体是否拖入!");
return;
}
RecordOriginalStates();
var prefab1Objects = prefab1.GetComponentsInChildren<Transform>(true);
var prefab2Objects = prefab2.GetComponentsInChildren<Transform>(true);
foreach (var obj1 in prefab1Objects)
{
foreach (var obj2 in prefab2Objects)
{
if (obj1.name == obj2.name)
{
obj1.gameObject.SetActive(obj2.gameObject.activeSelf);
break;
}
}
}
Debug.Log("应用成功!");
}
//记录显隐状态,用于恢复
void RecordOriginalStates()
{
originalStates.Clear(); // 清楚之前的显隐状态
var prefab1Objects = prefab1.GetComponentsInChildren<Transform>(true);
foreach (var obj in prefab1Objects)
{
originalStates[obj.gameObject] = obj.gameObject.activeSelf;
}
}
//恢复
void RestoreOriginalStates()
{
foreach (var pair in originalStates)
{
pair.Key.SetActive(pair.Value);
}
Debug.Log("恢复成功!");
}
}