Unity编辑器工具——同步相同预制体内GameObject的显隐状态

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("恢复成功!");
	}

}

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值