Unity Prefab和GameObject的正向和逆向查找引用

我发现很多美工兄弟都爱问程序Unity3d为什么总丢材质? 我不排除U3d有BUG的情况下会丢材质?但是其实很多时候是人为操作而引起的。

1.不保存就在上传

这个操作太恐怖了,切记!!在 U3D里面你无论操作了什么,当你要上传svn的时候一定要先保存场景,Ctrl+S 切记切记!!如果不保存就上传很有可能就会丢材质。

2.我的电脑明明没事,怎么你哪里就丢材质?

我发现一个很有意思的现象,每次走到美术电脑前看它的svn工程时,我都会发现各种的“黄叹号”整个工程严重的冲突。然后程序和美术的对话就是:“这资源有用没?没用删了, 我重新更新。。。” 哈哈哈 我觉得可能只有程序员才会对冲突非常敏感吧,但我觉得这件事不能怪美术,美术是很抽象的东西,不向程序要具体到少一个分号就无法进行了。

3.管理好材质贴图

如果项目不管理好材质和贴图,后起你会发现有很多完全一样的图片只是名子不一样,但是还都在使用中。。这个很有可能是好几个美术同时在做,这样会造成资源的浪费。

4.特效丢材质

我举个实际的例子,我们项目场景和特效是两个人来做。之前总遇到场景特效莫名其妙丢材质的问题。原因就是做特效的人把特效修改了,但是做场景的又不知道,因为可能这个特效在好多场景上都在使用中。

 如下图所示,在Preiject下面方的Prefab 如果拖入Hierarchy视图中,它俩是具有关联关系的,如果你直接在Project视图中修改了Prefab那么所有Hierarchy视图中关联它的Prefab都会得到修改。小改动这样是没问题的,如果发生一些比较大的改动,那么Hierarchy视图中Prefab可能就会丢失或者坏掉。但是假如你有很多场景都引用同一个Prefab,这么多场景会很难找到的。


正向在Hierarch视图中选择一个prefab,然后在右侧Inspector视图中点击Select会自动找到Project视图中的Prefab对象。那么反向如何从Project视图中找到Hierarchy视图中引用的Prefab呢?

如下图所示,Unity3d做了一个功能,在Project视图中选择一个Prefab,然后右键选择Find References In Scene ,那么此时Unity会自动帮你在当前场景中找到Hierarchy视图中引用这个Prefab的GameObject。


但是这个方法有点局限性,就是它只能找到当前场景的,假设你的这个Prefab在很多场景中都引用了,那么这样是找不到了,为了美术我决定写一个小小的工具,嘿嘿。

	[MenuItem("Assets/Check Prefab Use ?")]
	private static void OnSearchForReferences()
	{
	  //确保鼠标右键选择的是一个Prefab
		if(Selection.gameObjects.Length != 1)
		{
			return;
		}
 
		//遍历所有游戏场景
		foreach(EditorBuildSettingsScene scene in EditorBuildSettings.scenes)
		{
			if(scene.enabled)
			{
			  //打开场景
				EditorApplication.OpenScene(scene.path);
				//获取场景中的所有游戏对象
				GameObject []gos = (GameObject[])FindObjectsOfType(typeof(GameObject));
				foreach(GameObject go  in gos)
				{
				  //判断GameObject是否为一个Prefab的引用
					if(PrefabUtility.GetPrefabType(go)  == PrefabType.PrefabInstance)
					{
						UnityEngine.Object parentObject = EditorUtility.GetPrefabParent(go); 
						string path = AssetDatabase.GetAssetPath(parentObject);
						//判断GameObject的Prefab是否和右键选择的Prefab是同一路径。
						if(path == AssetDatabase.GetAssetPath(Selection.activeGameObject))
						{
							//输出场景名,以及Prefab引用的路径
							Debug.Log(scene.path  + "  " + GetGameObjectPath(go));
						}
					}
				}
			}
		}
	}
	public static string GetGameObjectPath(GameObject obj)
	{
		string path = "/" + obj.name;
		while (obj.transform.parent != null)
		{
			obj = obj.transform.parent.gameObject;
			path = "/" + obj.name + path;
		}
		return path;
	}
如下图所示,我就可以找到哪个场景引用了这个Prefab。 这里我没有用GameObject和Prefab的名子来判断,我觉得最好也不要用名字,因为Hierarchy视图中的名子完全可以随意修改的,如果被改了的话就肯定找不到了,而且场景那么多完全有重名的情况。


是不是很简单呢?嘿嘿。

或者还有个办法,就是运行时动态的载入Prefab,但是有些场景特效其实万全没有任何意义,仅仅是展示而已,程序也无需对它进行操作。

有了这个小工具,那么以后美术改完Prefab的时候,运行一下连带的看看某些场景上是否正常的显示了?嘿嘿嘿嘿。

https://assetstore.unity.com/packages/tools/find-reference-2-59092 FR2 helps instantly clean up asset references for your projects Email | Documentation | Forum Why FR2? - Optimize your projects reference to minimize build size - Split your big projects to smaller / managable modules - Safely remove all duplicated assets - Safely replace prefabs / materials / shader with another one - Remove obsolete assets that you don't need anymore How can FR2 help? Just select one or more asset in Project panel and FR2 will show you: - Exactly what's being included in each scene or in each prefab. Remember that one redundant reference may resulted in asset being duplicated in each assetbundles and increase AssetBundle build sizes (Animation / Texture / Audio duplication) or degrade performance (Material duplication - increase drawcalls) - Which assets referenced to and make selected assets included in the build. This will help you confident that intermediate project assets will not be included in final build - Duplicated assets you may accidentally copy over and over. Using FR2 you can then redidrect all those references to a single copy of your choice and safely delete other duplications (usage count of those assets should now be 0) - See all assets not being referenced by any other asset so you can delete them all without worrying about breaking any references. - GUID Tools Advanced tool where you can see GUID of each asset and redirect references from one asset to another You can use this to redirect all references to TextureA (using TextureA) to TextureB, the same applied for shader, materials, mesh... Beware that replace references is very powerful yet dangerous operation you'd better don't use it if you don't understand how GUID works in Unity Other Features - Full C# source code - Top notch support 24/7 - Blazing fast - built for HUGE PROJECTS - Support with Unity 4.3+ and Unity 5.x - Quickly disable FR2 when not in used (zeroing performance cost) - Display usage count in project panel so you know which asset being used and how many times it's being used - Find script dependencies (experimental, C# only) - Export assets with references
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值