Unity中,资源有很多类型。
1.脚本类资源
在打包后,脚本都会变成 dll 打到游戏包中。
目录为:…\assets\bin\Data\Managed
a.游戏正常逻辑代码(Assets目录下)
导出为:Assembly-CSharp
b.游戏编辑器逻辑代码
导出为:Assembly-CSharp-Editor
c.在特定目录(standard assets、Pro standard assets、plugins )中代码
导出为:Assembly-CSharp-firstpass
d.在特定目录中编辑器代码
导出为:Assembly-CSharp-Editor-firstpass
so,两个重要的dll为:Assembly-CSharp.dll
和 Assembly-CSharp-firstpass.dll
。
反编译的话只需导入这两个即可。
2.美术类资源
比如:模型、贴图、场景、预设、材质、shdaer等等。
Unity对工程内的资源,要进行 序列化 ,也就是将资源转为二进制对象。
进而为每个文件生产一份 meta文件。
下面是一个prefab的meta文件内容:
fileFormatVersion: 2
guid: 7e5610b190ec4544587561116f3e7ee9
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 100100000
userData:
assetBundleName: balloonbroken_blue
assetBundleVariant:
guid:就是文件在工程内的唯一索引id。
NativeFormatImporter:是导入文件设置,资源类为这个、如果是脚本则为 MonoImporter、贴图则为 TextureImporter。
为什么在编辑器下能进行可视化编辑?
因为序列化。
比如,给一个资源添加一个脚本,就会触发一次序列化操作,将该脚本资源的fileID和guid都序列化存储下来。
这样在运行游戏进行反序列化的时候,就会基于fileID和guid反向找到资源的依赖,从而加载进来。
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1001 &100100000 //该资源的fileID
Prefab:
m_ObjectHideFlags: 1
serializedVersion: 2
m_Modification:
m_TransformParent: {fileID: 0}
m_Modifications: []
m_RemovedComponents: []
m_ParentPrefab: {fileID: 0}
m_RootGameObject: {fileID: 1597890007182088}
m_IsPrefabParent: 1
--- !u!114 &114001178430890514
MonoBehaviour:
m_ObjectHideFlags: 1
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 100100000}
m_GameObject: {fileID: 1385286610863512}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 0ca6cd9a23ae6e24a87e69ba6427c420, type: 3}//依赖脚本呢的 fileID 和 guid
m_Name:
m_EditorClassIdentifier:
StartupPools: []
TheStartupPoolMode: 0