我发现很多美工兄弟都爱问程序unity3d为什么总丢材质? 我不排除U3d有BUG的情况下会丢材质?但是其实很多时候是人为操作而引起的。
1.不保存就在上传
这个操作太恐怖了,切记!!在 U3D里面你无论操作了什么,当你要上传svn的时候一定要先保存场景,Ctrl+S 切记切记!!如果不保存就上传很有可能就会丢材质。
2.我的电脑明明没事,怎么你哪里就丢材质?
我发现一个很有意思的现象,每次走到美术电脑前看它的svn工程时,我都会发现各种的“黄叹号”整个工程严重的冲突。然后程序和美术的对话就是:“这资源有用没?没用删了, 我重新更新。。。” 哈哈哈 我觉得可能只有程序员才会对冲突非常敏感吧,但我觉得这件事不能怪美术,美术是很抽象的东西,不向程序要具体到少一个分号就无法进行了。
3.管理好材质贴图
如果项目不管理好材质和贴图,后起你会发现有很多完全一样的图片只是名子不一样,但是还都在使用中。。这个很有可能是好几个美术同时在做,这样会造成资源的浪费。
4.特效丢材质
我举个实际的例子,我们项目场景和特效是两个人来做。之前总遇到场景特效莫名其妙丢材质的问题。原因就是做特效的人把特效修改了,但是做场景的又不知道,因为可能这个特效在好多场景上都在使用中。
如下图所示,在Preiject下面方的Prefab 如果拖入Hierarchy视图中,它俩是具有关联关系的,如果你直接在Project视图中修改了Prefab那么所有Hierarchy视图中关联它的Prefab都会得到修改。小改动这样是没问题的,如果发生一些比较大的改动,那么Hierarchy视图中Prefab可能就会丢失或者坏掉。但是假如你有很多场景都引用同一个Prefab,这么多场景会很难找到的。
![](http://www.unitymanual.com/data/attachment/forum/201407/28/165648ci3kkk8584656fuz.png)
![](http://www.unitymanual.com/data/attachment/forum/201407/28/165648fp466h6bpo4ddw79.png)
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
[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视图中的名子完全可以随意修改的,如果被改了的话就肯定找不到了,而且场景那么多完全有重名的情况。
![](http://www.unitymanual.com/data/attachment/forum/201407/28/165649zgvd6uzo4vu1dv74.png)