02
2017
11

Unity鎻掍欢寮鍙:PrefabUtility--Prefab瀹炰緥寮曠敤鏂紑鍜屾浛鎹

    鍦║nity浣跨敤Prefab杩囩▼涓紝鎴戜滑鏈夋椂鍊欓渶瑕佽繘琛孭refab瀹炰緥鏂紑寮曠敤鍜屾浛鎹㈠紩鐢ㄧ殑闇姹傘傚疄鐜拌繖浜涢渶姹傦紝浣跨敤鍒扮殑鏍稿績鐨勭被鏄疨refabUtility銆侾refabUtility鏄竴涓潤鎬佺被锛屼富瑕佺敤浜庤繘琛孭refab鐨勭浉鍏冲鐞嗐 杩欓噷涓昏浣跨敤浠ヤ笅鍑犵鏂规硶

  • PrefabUtility.CreateEmptyPrefab
  • PrefabUtility.ReplacePrefab
  • PrefabUtility.DisconnectPrefabInstance
  • PrefabUtility.GetPrefabParent
  • PrefabUtility.ConnectGameObjectToPrefab

鏂紑寮曠敤

    鏂紑Prefab寮曠敤鐨勪唬鐮佸涓

[MenuItem("Tools/Prefab/鍘婚櫎寮曠敤")]

public static void BreakPrefabRef()

{

    var select = Selection.activeGameObject;

    if (select.activeInHierarchy)

    {

        PrefabUtility.DisconnectPrefabInstance(select);

        Selection.activeGameObject = null;

        var prefab = PrefabUtility.CreateEmptyPrefab("Assets/empty.prefab");

        PrefabUtility.ReplacePrefab(select, prefab, ReplacePrefabOptions.ConnectToPrefab);

        PrefabUtility.DisconnectPrefabInstance(select);

        AssetDatabase.DeleteAsset("Assets/empty.prefab");

    }

}

    铏界劧PrefabUtility.DisconnectPrefabInstance鏈夋柇寮Prefab鐨勫惈涔夛紝浣嗘槸濡傛灉浠呬粎浣跨敤杩欎釜鍑芥暟浼氬嚭鐜颁笅闈㈣繖涓儏鍐碉紝鍚嶅瓧鐨勯鑹蹭粠钃濆彉鐧斤紝鐪嬭捣鏉ュ凡缁忎笉鏄竴涓猵refab锛屼絾鏄粠Inspector闈㈡澘涓繕鏄兘澶熺湅鍒癙refab鏍囪浠ュ強Prefab瀹炰緥鎵嶄細鍑虹幇鐨勯偅涓変釜Select銆丷evert銆丄pply鎸夐挳銆

2017110201

    濡傛灉灏濊瘯鍦ㄨ繖涓椂鍊欏垹闄ゆ帀Project閲岄潰鐨勬簮prefab锛屽彂鐜拌繖涓猵refab鏍囪灏辨秷澶变簡銆

    鍥犳锛岃繖閲岄噰鐢ㄤ互涓嬫柟娉曞疄鐜版暣涓柇寮寮曠敤

  • 浣跨敤Selection.activeGameObject鑾峰彇褰撳墠閫変腑鐨勭墿浣
  • 浣跨敤PrefabUtility.CreateEmptyPrefab鍏堝垱寤轰竴涓┖鐨刾refab
  • 浣跨敤PrefabUtility.ReplacePrefab灏嗗満鏅腑閫変腑鐨凱refab瀹炰緥鍒朵綔鎴愪竴涓狿refab骞惰鐩栧埌涔嬪墠鐨勭┖prefab涓
  • 浣跨敤PrefabUtility.DisconnectPrefabInstance鏂紑寮曠敤
  • 浣跨敤AssetDatabase.DeleteAsset鍒犻櫎Project涓柊寤虹殑prefab

    鑷虫灏卞畬鎴愪簡鏂紑寮曠敤鐨勫姛鑳姐傝繖閲屽湪鍑芥暟鍔犱笂[menuitem]鏍囩锛屽皢杩欎釜鍔熻兘鏀惧湪unity鑿滃崟鈥淭ools->Prefab->鍘婚櫎寮曠敤鈥濅笂銆

鏇挎崲寮曠敤

    鏇挎崲寮曠敤鐨勪唬鐮佸涓

[MenuItem("Tools/Prefab/鏇挎崲寮曠敤")]

public static void RelocalPrefabRef()

{

    var select = Selection.activeGameObject;

    if (select.activeInHierarchy)

    {

        var ab = PrefabUtility.GetPrefabParent(select);

        if (ab == null)

            return;

        var oripath = AssetDatabase.GetAssetPath(ab);

        var filters = new[] { "prefab file", "prefab" };

        var tar = EditorUtility.OpenFilePanelWithFilters("select target", Application.dataPath, filters);

        if (string.IsNullOrEmpty(tar))

            return;

        tar = FileUtil.GetProjectRelativePath(tar);

        var tarprefab = AssetDatabase.LoadAssetAtPath<GameObject>(tar);

        if (tarprefab == null)

            return;

        var gname = select.name;

        var enable = select.activeInHierarchy;

        var pos = select.transform.localPosition;

        var rot = select.transform.localRotation;

        var scale = select.transform.localScale;

        var go = PrefabUtility.ConnectGameObjectToPrefab(select, tarprefab);

        go.transform.localPosition = pos;

        go.transform.localRotation = rot;

        go.transform.localScale = scale;

        go.name = gname;

        go.SetActive(enable);

        Debug.LogFormat("Replace Prefab From:{0} to {1}", oripath, tar);

    }

}

    浠g爜涓富瑕佺殑娴佺▼涓

  • 浣跨敤Selection.activeGameObject鑾峰彇閫変腑鐨勭墿浣
  • 浣跨敤PrefabUtility.GetPrefabParent鑾峰彇杩欎釜鐗╀綋鍦╬roject涓殑婧恜refab
  • 浣跨敤AssetDatabase.GetAssetPath鑾峰彇婧恜refab鍦╬roject涓殑璺緞锛堝悗闈㈢敤浜巐og锛
  • 浣跨敤EditorUtility.OpenFilePanelWithFilters鎵撳紑涓涓枃浠堕夋嫨绐楀彛璁╃帺瀹堕夋嫨涓涓簮prefab
  • 浣跨敤FileUtil.GetProjectRelativePath鑾峰彇杩欎釜婧恜refab鐩稿浜庡伐绋嬬殑璺緞
  • 浣跨敤灏嗚繖涓簮prefab鍔犺浇鍒板唴瀛樹腑
  • 涓轰簡淇濇寔鏇挎崲鍚庣殑浣嶇疆鍏崇郴锛岃繖閲岃褰曚簡鍘熸潵鐨勪綅缃俊鎭
  • 浣跨敤PrefabUtility.ConnectGameObjectToPrefab閲嶆柊灏嗛変腑鐨勭墿浣撻摼鎺ュ埌鐜╁閫夋嫨鐨勬簮prefab涓婏紝瀹屾垚prefab寮曠敤鏇挎崲
  • 杩樺師鍘熸潵鐨勪綅缃叧绯

    鑷虫瀹屾垚浜哖refab瀹炰緥鏇挎崲寮曠敤鐨勫姛鑳姐傚湪Unity涓夋嫨鑿滃崟Tools->Prefab->鏇挎崲寮曠敤锛岄夋嫨涓涓猵refab鍗冲彲瀹炵幇鏇挎崲

杞浇淇濈暀锛http://www.cnblogs.com/CodeGize http://www.codegize.com

芦 涓婁竴绡 涓嬩竴绡 禄