Unity在编辑模式中使用代码更新Prefab并保持引用

用途

一键将EditMap导出为ReleaseMap. 在编辑场景构建游戏地图,地图数据中绑定了许多只有编辑场景才会用到的数据.比如用于生成NavMesh的Cube,用于场景排序的代码等等.

希望构建点击一个按钮,对应的导出一份Release版本的地图Prefab数据. 用于游戏场景中使用. 同时再次运行脚本时候,游戏场景中对于该Prefab的引用不会消失

相当于点击了 Inspector中Prefab的 Apply按钮

核心代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public void OnClickBtn()
{

var newGo = new GameObject();
newGo.name = "OutPrefab";
var sp = newGo.AddComponent<PrefabOutCode>();

var cubeAPath = "Assets/TestGround/NeedLinkPrefab/CubeA.prefab";
var cubeA = (GameObject) AssetDatabase.LoadAssetAtPath(cubeAPath, typeof(GameObject));

sp.linkPrefab = cubeA;


var outPrefabPath = "Assets/TestGround/OutPrefab/OutPrefab.prefab";
var outPreafb = (GameObject) AssetDatabase.LoadAssetAtPath(outPrefabPath, typeof(GameObject));

PrefabUtility.ReplacePrefab(newGo, outPreafb, ReplacePrefabOptions.ReplaceNameBased);


DestroyImmediate(newGo);

Debug.Log("DONE");
}

说明

目录结构:

QQ20180115-171117

AssetDatabase.LoadAssetAtPath 可以加载到目录中的Prefab

sp.linkPrefab = cubeA 将Preafb Link到GameObject中来. 比如新生成的GameObject有个public 变量
需要Link 一个AudioClip. (就是替代原来的 用鼠标将Prefab拖拽到Inspector中的操作)

PrefabUtility.ReplacePrefab(newGo, outPreafb, ReplacePrefabOptions.ReplaceNameBased)

使用ReplacePrefabOptions.ReplaceNameBased这种方式,可以在保证原有Preafb引用不丢失的情况下替换.

默认的Default模式会全部替换,但是引用丢失.

使用ConnectToPrefab会在原有的基础上增加东西,引用不会丢失

坚持原创技术分享,您的支持将鼓励我继续创作!