Unity3D通过代码动态生成Prefab与导出UnityPackage

Unity3D通过代码生成Prefab并导出UnityPackage

  • 首先要明确的问题
  • Prefab的生成
  • UnityPackage的导出

首先要明确的问题

不管是生成Prefab和导出UnityPackage都是只有在编辑器环境下才能使用(在编辑器下运行时也可以)
Prefab不能生成到StreamingAsset文件下,否则无法加载到依赖关系,即使实例化到场景里,也仅是一个有预制体名字的空物体

Prefab的生成

先贴上代码:

PrefabUtility.CreatePrefab(prefabFullPath, CREATE_OBJ));

prefabFullPath的格式为保存的路径+想要保存的名字+.prefab后缀名
例如:application.datapath+testobj+.prefab

CREATE_OBJ为你想要保存为预制体的游戏物体类

GameObject selectedGameObject = Selection.activeGameObject;

可以通过Selection方法获得Hierarchy窗口中选中的物体,
也可以通过外部传,总之这个就是你要制作成预制体的游戏物体

CreatePrefab方法返回的是一个游戏物体类

UnityPackage的导出

还是先贴代码:

  string exprotPath = EditorUtility.SaveFilePanel("导出包路径", "", "", "unitypackage");
            var AssetPathName = AssetDatabase.GetDependencies(assetPath);
            AssetDatabase.ExportPackage(AssetPathName, exprotPath + "bao.unitypackage", ExportPackageOptions.IncludeDependencies | ExportPackageOptions.Default);

exprotPath为想要导出的路径,此处用Unity的SaveFilePanel类,第一个string为窗口标题,第二个string为默认打开的目录,第三个string为默认文件名(在打开窗口中可以随意填写),第四个string为后缀名,拓展名,此处我们填写unitypackage

AssetPathName为一个string数组,值是想要打包的资源的路径(从Assets/开始算,即只记录工程目录即可)
如果你无法确定自己想要导出的资源在工程Assets目录下哪个位置,可以通过

            var AssetPathName = new string[Selection.objects.Length];
            for (int i = 0; i < AssetPathName.Length; i++)
            {
                AssetPathName[i] = AssetDatabase.GetAssetPath(Selection.objects[i]);
            }

Selection.objects就是你在Project视窗中选择的物体物体数组,然后再通过GetAssetPath方法获取到这个资源的在工程中的路径

GetAssetPath方法也可以用来获取刚刚我们创建预制体的路径

 string AssetPath =AssetDatabase.GetAssetPath( PrefabUtility.SaveAsPrefabAsset(CREATE_OBJ, prefabFullPath));

这里用了新的保存预制体的方法SaveAsPrefabAssets,CreatePrefab方法在新的版本中会被弃用,这个方法的构造参数和CreatePrefab方法相反,需要生成预制体的物体在前面,路径在后面

当我们获取到这个AssetsPath之后,还需要通过 AssetDatabase.GetDependencies(assetPath)方法来获取这个资源的引用关系,才能打包出一个完整的包,这里可以传string数组(获取多个物体的引用),也可以单独传一个string(获取一个物体的引用),返回的都是一个string数组,有了这个引用的数组,我们就可以导出包了

 AssetDatabase.ExportPackage(AssetPathName, exprotPath, ExportPackageOptions.IncludeDependencies);

第一个值就是需要被导出的资源的路径,如果没有获取到引用,你导出的也只是一个Prefab的依赖表,不包含任何模型资源,图片,材质等资源的,第二个值就是导出路径+名字,刚刚我们已经尬通过SaveFilePanel获取到了,这里直接用就行了,第三个值是导出的模式,一共有四种模式,大家可以详细自己看一下,IncludeDependencies这个模式就是包含了引用关系的(即使你没有获取引用,也会自动去查找引用再导出)

你可能感兴趣的:(Unity3D)