Unity3d 开发 代码创建预设

时间:2021-01-20 03:34:21

文章作者:松阳

本文出自 阿修罗道,禁止用于商业用途,转载请注明出处。  

原文链接:http://blog.csdn.net/fansongy/article/details/48740091


创建预设

我们在使用编辑器时会有需求使用代码创建预设。在Unity3d的编辑器接口中,有PrefabUtility类可以使用它来创建预设。

封装实现

函数使用比较简单,查询文档 即可。要注意的是,如果没有父级目录,调用这个接口时会报错。因此我封装了一个函数保证它的父级目录是存在的


using UnityEngine;
using System.Collections;
using UnityEditor;
using System.Text;
using System.IO;

public class TestFolder : MonoBehaviour {

    [MenuItem("try/makePrefab")]
    public static void make() {
        string path = "Assets/test/testDir/test.prefab";
        GameObject obj = new GameObject();
        obj.transform.position = Vector3.forward;

        makePrefab(path,obj);
    }

    public static void makePrefab(string path,GameObject obj) {
        makeParentDirExist(path);
        Object prefab = PrefabUtility.CreateEmptyPrefab(path);
        PrefabUtility.ReplacePrefab(obj,prefab,ReplacePrefabOptions.ConnectToPrefab);
    }

    public static string getParentPath(string path,char splitFlag='/') {
        string[] dirs = path.Split(splitFlag);
        StringBuilder str = new StringBuilder();
        for(int i = 0;i<dirs.Length-1;++i) {
            str.Append(dirs[i]).Append(splitFlag);
        }
        //cut down the last splitFlag
        string result = str.ToString();
        if(result.EndsWith(splitFlag.ToString())) {
            result = result.Substring(0,result.Length-1);
        }
        return result;
    }

    public static string getParentName(string path,char splitFlag='/') {
        string[] dirs = path.Split(splitFlag);
        if(dirs.Length <2) {
            return "";
        }  else {
            return dirs[dirs.Length-2];
        }
    }

    public static void makeParentDirExist(string path) {
        string pDir = getParentPath(path);

        if(!AssetDatabase.IsValidFolder(pDir)) {
            makeParentDirExist(pDir);
            AssetDatabase.CreateFolder(getParentPath(pDir),getParentName(path));
            AssetDatabase.Refresh();
        }  else {
            return;
        }
    }
}

调用

准备好预设的路径和GameObject,调用makePrefab即可在对应目录生成预设。其中路径必须是以Assets为根,并作为开头。

注意

目前有个坑,父级目录不能以'/'结尾。如果是这样,IsValidFolderCreateFolder会搜索其子级目录,导致一些不期望的结果