{"id":2789,"date":"2022-05-05T14:06:00","date_gmt":"2022-05-05T06:06:00","guid":{"rendered":"http:\/\/www.u3d8.com\/?p=2789"},"modified":"2022-10-28T23:21:57","modified_gmt":"2022-10-28T15:21:57","slug":"unity%e8%87%aa%e5%8a%a8%e5%8c%96%e6%94%b6%e9%9b%86link-xml","status":"publish","type":"post","link":"http:\/\/www.u3d8.com\/?p=2789","title":{"rendered":"Unity\u81ea\u52a8\u5316\u6536\u96c6link.xml"},"content":{"rendered":"\n<p>\u4e3b\u8981\u8d1f\u8d23\u6536\u96c6Bundle\u5185\u4f7f\u7528\u7684link.xml\uff0c\u9632\u6b62\u88ab\u88c1\u526a\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class AssetBundleChecker\n{\n    &#91;MenuItem(\"Tools\/CreateLink.xml\")]\n    public static void Create()\n    {\n        var generator = new LinkXmlGenerator();\n\n        generator.SetTypeConversion(typeof(UnityEditor.Animations.AnimatorController), typeof(RuntimeAnimatorController));\n\n\n        foreach (var bundleName in AssetDatabase.GetAllAssetBundleNames())\n        {\n            var assetPaths = AssetDatabase.GetAssetPathsFromAssetBundle(bundleName);\n            generator.AddAssets(assetPaths);\n        }\n\n        generator.Save(\"Assets\/link.xml\");\n        Debug.Log(\"link \u6587\u4ef6\u6784\u5efa\u5b8c\u6bd5\");\n        AssetDatabase.Refresh();\n\n    }\n}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reflection;\nusing System.Xml;\nusing UnityEditor;\nusing UnityEngine;\n\npublic class LinkXmlGenerator\n{\n    Dictionary&lt;Type, Type&gt; m_TypeConversion = new Dictionary&lt;Type, Type&gt;();\n    HashSet&lt;Type&gt; m_Types = new HashSet&lt;Type&gt;();\n\n\n    public void AddType(Type type)\n    {\n        if (type == null)\n            return;\n        AddTypeInternal(type);\n    }\n\n\n    public void AddTypes(params Type&#91;] types)\n    {\n        if (types == null)\n            return;\n        foreach (var t in types)\n            AddTypeInternal(t);\n    }\n\n\n    public void AddTypes(IEnumerable&lt;Type&gt; types)\n    {\n        if (types == null)\n            return;\n        foreach (var t in types)\n            AddTypeInternal(t);\n    }\n\n    private void AddTypeInternal(Type t)\n    {\n        if (t == null)\n            return;\n\n        Type convertedType;\n        if (m_TypeConversion.TryGetValue(t, out convertedType))\n            m_Types.Add(convertedType);\n        else\n            m_Types.Add(t);\n    }\n\n\n    public void SetTypeConversion(Type a, Type b)\n    {\n        m_TypeConversion&#91;a] = b;\n    }\n\n\n\n    public void AddAsset(string assetpath)\n    {\n        var assets = AssetDatabase.GetDependencies(assetpath);\n\n        List&lt;Type&gt; types = new List&lt;Type&gt;();\n        foreach (var asset in assets)\n        {\n            var type = AssetDatabase.GetMainAssetTypeAtPath(asset);\n            if (type == typeof(GameObject))\n            {\n                var obj = (GameObject)AssetDatabase.LoadAssetAtPath(asset, typeof(GameObject));\n                types.AddRange(obj.GetComponentsInChildren&lt;Component&gt;(true).Select(c =&gt; c.GetType()));\n\n            }\n            else\n            {\n                types.Add(type);\n            }\n        }\n        AddTypes(types);\n    }\n\n\n    public void AddAssets(string&#91;] assetPaths)\n    {\n        foreach (var assetPath in assetPaths)\n            AddAsset(assetPath);\n    }\n\n\n    public void Save(string path)\n    {\n        var assemblyMap = new Dictionary&lt;Assembly, List&lt;Type&gt;&gt;();\n        foreach (var t in m_Types)\n        {\n            var a = t.Assembly;\n            List&lt;Type&gt; types;\n            if (!assemblyMap.TryGetValue(a, out types))\n                assemblyMap.Add(a, types = new List&lt;Type&gt;());\n            types.Add(t);\n        }\n        XmlDocument doc = new XmlDocument();\n        var linker = doc.AppendChild(doc.CreateElement(\"linker\"));\n        foreach (var k in assemblyMap)\n        {\n            if (k.Key.FullName.Contains(\"UnityEditor\"))\n                continue;\n\n            var assembly = linker.AppendChild(doc.CreateElement(\"assembly\"));\n            var attr = doc.CreateAttribute(\"fullname\");\n            attr.Value = k.Key.FullName;\n            if (assembly.Attributes != null)\n            {\n                assembly.Attributes.Append(attr);\n\n                foreach (var t in k.Value)\n                {\n                    var typeEl = assembly.AppendChild(doc.CreateElement(\"type\"));\n                    var tattr = doc.CreateAttribute(\"fullname\");\n                    tattr.Value = t.FullName;\n                    if (typeEl.Attributes != null)\n                    {\n                        typeEl.Attributes.Append(tattr);\n                        var pattr = doc.CreateAttribute(\"preserve\");\n                        pattr.Value = \"all\";\n                        typeEl.Attributes.Append(pattr);\n                    }\n                }\n            }\n        }\n        doc.Save(path);\n        \n    }\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u4e3b\u8981\u8d1f\u8d23\u6536\u96c6Bundle\u5185\u4f7f\u7528\u7684link.xml\uff0c\u9632\u6b62\u88ab\u88c1\u526a\u3002<\/p>\n","protected":false},"author":1,"featured_media":1313,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[297,23],"tags":[],"_links":{"self":[{"href":"http:\/\/www.u3d8.com\/index.php?rest_route=\/wp\/v2\/posts\/2789"}],"collection":[{"href":"http:\/\/www.u3d8.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.u3d8.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.u3d8.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.u3d8.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2789"}],"version-history":[{"count":2,"href":"http:\/\/www.u3d8.com\/index.php?rest_route=\/wp\/v2\/posts\/2789\/revisions"}],"predecessor-version":[{"id":2795,"href":"http:\/\/www.u3d8.com\/index.php?rest_route=\/wp\/v2\/posts\/2789\/revisions\/2795"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/www.u3d8.com\/index.php?rest_route=\/wp\/v2\/media\/1313"}],"wp:attachment":[{"href":"http:\/\/www.u3d8.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2789"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.u3d8.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2789"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.u3d8.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2789"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}