前段时间在项目工程中更新dll后,出现了预制体上脚本引用丢失的问题,今天抽空写一下解决方式。
1.查找dll的guid
用文本编辑器打开dll的meta文件,找到guid,如下
fileFormatVersion: 2
guid: 60625ad5ac989284e9b1017660b59540
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any:
second:
enabled: 1
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
userData:
assetBundleName:
assetBundleVariant:
2.找到预制体中引用的dll的guid
用文本编辑器打开prefab文件,你会看到所有挂在prefab上的脚本,找到m_Script后的guid,这个guid就是和dll对应的,如果guid错误,就会出现引用丢失的问题。fileID错误同样也会造成引用丢失,但是我没有碰到过这种问题,可以自己手动修改一下看看效果。
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 921236486320777724}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 1041978173, guid: 60625ad5ac989284e9b1017660b59540, type: 3}
m_Name:
m_EditorClassIdentifier:
button: {fileID: 3945939871454791141}
--- !u!114 &7853910725242885901
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 921236486320777724}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: -792824715, guid: 60625ad5ac989284e9b1017660b59540, type: 3}
m_Name:
m_EditorClassIdentifier:
targetRect: {fileID: 0}
isMovable: 1
horizontal: 1
vertical: 1
limitByParent: 1
padding:
Top: 0
Bottom: 0
Left: 0
Right: 0
--- !u!114 &9052176705620901265
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 921236486320777724}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 549120591, guid: 60625ad5ac989284e9b1017660b59540, type: 3}
m_Name:
m_EditorClassIdentifier:
draggable: {fileID: 7853910725242885901}
3.修改文件
前面已经说过,造成脚本丢失的原因是guid没有对应上,所以不管是修改prefab的m_Script中的guid还是dll的meta文件中的guid,都可以解决这个问题,但是如果修改prefab,可能需要修改很多文件,所有只要原来dll的guid没有被占用,修改dll的meta就好了。