{"id":165,"date":"2025-04-29T18:49:00","date_gmt":"2025-04-29T09:49:00","guid":{"rendered":"https:\/\/cg-method.com\/unity\/?p=165"},"modified":"2026-09-20T15:22:46","modified_gmt":"2026-09-20T06:22:46","slug":"prefab-structure-viewer","status":"publish","type":"post","link":"https:\/\/cg-method.com\/unity\/prefab-structure-viewer\/","title":{"rendered":"Unity\u2502Prefab\u53c2\u7167\u69cb\u9020\u30d3\u30e5\u30fc\u30a2"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Unity\u306ePrefab\u53c2\u7167\u69cb\u9020\u3092\u30ce\u30fc\u30c9\u5f62\u5f0f\u3067\u53ef\u8996\u5316\u3059\u308b\u30a2\u30bb\u30c3\u30c8\u306f\u65e2\u306b\u5b58\u5728\u3057\u307e\u3059\u304c\u3001Google\u30b9\u30d7\u30ec\u30c3\u30c9\u30b7\u30fc\u30c8\u3084Google Apps Script\uff08GAS\uff09\u4e0a\u3067\u3082\u78ba\u8a8d\u3067\u304d\u308b\u3088\u3046\u306b\u30c4\u30fc\u30eb\u3092\u4f5c\u6210\u3057\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u30b0\u30e9\u30d5\u63cf\u753b\u30e9\u30a4\u30d6\u30e9\u30ea\u306eCytoscape.js\u3092\u5229\u7528\u3057\u3066\u30ce\u30fc\u30c9\u3092\u8868\u793a\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u30d7\u30eb\u30c0\u30a6\u30f3\u304b\u3089Prefab\u540d\u3092\u9078\u629e\u3059\u308b\u3068\u3001\u95a2\u9023\u3059\u308bPrefab\u306e\u53c2\u7167\u95a2\u4fc2\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-style-border\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"511\" src=\"https:\/\/cg-method.com\/unity\/wp-content\/uploads\/2025\/06\/2025-06-29_18h37_43-1024x511.png\" alt=\"\u30d7\u30eb\u30c0\u30a6\u30f3\u3067\u9078\u629e\u3057\u305fPrefab\u306e\u95a2\u9023\u3059\u308b\u53c2\u7167\u95a2\u4fc2\u304c\u30ce\u30fc\u30c9\u3067\u8868\u793a\u3055\u308c\u3066\u3044\u308b\u753b\u9762\u306e\u69d8\u5b50\u3002\" class=\"wp-image-167\" srcset=\"https:\/\/cg-method.com\/unity\/wp-content\/uploads\/2025\/06\/2025-06-29_18h37_43-1024x511.png 1024w, https:\/\/cg-method.com\/unity\/wp-content\/uploads\/2025\/06\/2025-06-29_18h37_43-300x150.png 300w, https:\/\/cg-method.com\/unity\/wp-content\/uploads\/2025\/06\/2025-06-29_18h37_43-768x384.png 768w, https:\/\/cg-method.com\/unity\/wp-content\/uploads\/2025\/06\/2025-06-29_18h37_43-1536x767.png 1536w, https:\/\/cg-method.com\/unity\/wp-content\/uploads\/2025\/06\/2025-06-29_18h37_43.png 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"is-style-icon_pen wp-block-paragraph\">\u53c2\u7167\u5148\u30d5\u30a9\u30eb\u30c0\u3054\u3068\u306b\u30ce\u30fc\u30c9\u306e\u8272\u5206\u3051\u306b\u3082\u5bfe\u5fdc\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u30b5\u30f3\u30d7\u30eb\u30c7\u30fc\u30bf<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Unity\u306eEditor\u30b9\u30af\u30ea\u30d7\u30c8\u3092\u5b9f\u884c\u3057\u3001\u5b9f\u969b\u306ePrefab\u30c7\u30fc\u30bf\u3092CSV\u5f62\u5f0f\u3067\u66f8\u304d\u51fa\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"430\" height=\"324\" src=\"https:\/\/cg-method.com\/unity\/wp-content\/uploads\/2025\/06\/2025-06-29_18h47_11.png\" alt=\"\u66f8\u304d\u51fa\u3057\u305fPrefab\u30c7\u30fc\u30bf\u3092Google\u30b9\u30d7\u30ec\u30c3\u30c9\u30b7\u30fc\u30c8\u306b\u30a4\u30f3\u30dd\u30fc\u30c8\u3057\u305f\u30c6\u30fc\u30d6\u30eb\u60c5\u5831\u306e\u4f8b\u3002\" class=\"wp-image-170\" srcset=\"https:\/\/cg-method.com\/unity\/wp-content\/uploads\/2025\/06\/2025-06-29_18h47_11.png 430w, https:\/\/cg-method.com\/unity\/wp-content\/uploads\/2025\/06\/2025-06-29_18h47_11-300x226.png 300w\" sizes=\"auto, (max-width: 430px) 100vw, 430px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u66f8\u304d\u51fa\u3057\u305fCSV\u3092Google\u30b9\u30d7\u30ec\u30c3\u30c9\u30b7\u30fc\u30c8\u306b\u30a4\u30f3\u30dd\u30fc\u30c8\u3057\u305f\u30c6\u30fc\u30d6\u30eb\u60c5\u5831\u306e\u4f8b\u3067\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>\u89aaPrefab\u540d<\/th><th>\u30d5\u30a9\u30eb\u30c0\u540d<\/th><th>\u5b50Prefab\u540d<\/th><th>\u95a2\u4fc2\u7a2e\u5225<\/th><\/tr><\/thead><tbody><tr><td>a<\/td><td>Common<\/td><td><\/td><td>Base<\/td><\/tr><tr><td>b<\/td><td>Common<\/td><td>a<\/td><td>Nested<\/td><\/tr><tr><td>b<\/td><td>Common<\/td><td>a<\/td><td>Variant<\/td><\/tr><tr><td>c<\/td><td>Dialog<\/td><td>b<\/td><td>Nested<\/td><\/tr><tr><td>d<\/td><td>Common<\/td><td><\/td><td>Base<\/td><\/tr><tr><td>e<\/td><td>Dialog<\/td><td>d<\/td><td>Nested<\/td><\/tr><tr><td>f<\/td><td>Dialog<\/td><td>c<\/td><td>Nested<\/td><\/tr><tr><td>f<\/td><td>Dialog<\/td><td>e<\/td><td>Nested<\/td><\/tr><tr><td>g<\/td><td>Dialog<\/td><td><\/td><td>Base<\/td><\/tr><tr><td>h<\/td><td>Dialog<\/td><td>g<\/td><td>Nested<\/td><\/tr><tr><td>h<\/td><td>Dialog<\/td><td>g<\/td><td>Variant<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Prefab\u53c2\u7167\u69cb\u9020\u30d3\u30e5\u30fc\u30a2\u306e\u30b3\u30fc\u30c9<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u5b9f\u88c5\u306b\u4f7f\u7528\u3057\u305f\u5404\u30b9\u30af\u30ea\u30d7\u30c8\u306e\u30b3\u30fc\u30c9\u3067\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-style-border\"><img loading=\"lazy\" decoding=\"async\" width=\"679\" height=\"380\" src=\"https:\/\/cg-method.com\/unity\/wp-content\/uploads\/2025\/06\/2025-06-29_18h40_09.png\" alt=\"Prefab\u53c2\u7167\u69cb\u9020\u30d3\u30e5\u30fc\u30a2\u306e\u5b9f\u88c5\u306b\u4f7f\u7528\u3057\u305f\u30b9\u30af\u30ea\u30d7\u30c8\u306e\u30b3\u30fc\u30c9\u3002\" class=\"wp-image-168\" srcset=\"https:\/\/cg-method.com\/unity\/wp-content\/uploads\/2025\/06\/2025-06-29_18h40_09.png 679w, https:\/\/cg-method.com\/unity\/wp-content\/uploads\/2025\/06\/2025-06-29_18h40_09-300x168.png 300w\" sizes=\"auto, (max-width: 679px) 100vw, 679px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Unity\u306e\u307b\u304b\u306e\u8a18\u4e8b\u306f\u3001\u307e\u3068\u3081\u304b\u3089\u3054\u89a7\u3044\u305f\u3060\u3051\u307e\u3059\u3002<\/p>\n\n\n<div class=\"swell-block-postLink\">\t\t\t<div class=\"p-blogCard -internal\" data-type=\"type1\" data-onclick=\"clickLink\">\n\t\t\t\t<div class=\"p-blogCard__inner\">\n\t\t\t\t\t<span class=\"p-blogCard__caption\">\u3042\u308f\u305b\u3066\u8aad\u307f\u305f\u3044<\/span>\n\t\t\t\t\t<div class=\"p-blogCard__thumb c-postThumb\"><figure class=\"c-postThumb__figure\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/cg-method.com\/unity\/wp-content\/uploads\/2026\/09\/unity-matome-3-300x169.jpg\" alt=\"\" class=\"c-postThumb__img u-obf-cover\" width=\"320\" height=\"180\"><\/figure><\/div>\t\t\t\t\t<div class=\"p-blogCard__body\">\n\t\t\t\t\t\t<a class=\"p-blogCard__title\" href=\"https:\/\/cg-method.com\/unity\/unity-matome\/\">Unity\u306e\u4f7f\u3044\u65b9\u307e\u3068\u3081\uff5c\u74b0\u5883\u8a2d\u5b9a\u30fbuGUI\u30fb\u30a8\u30c7\u30a3\u30bf\u62e1\u5f35<\/a>\n\t\t\t\t\t\t<span class=\"p-blogCard__excerpt\">Unity\u306b\u3064\u3044\u3066\u66f8\u3044\u305f\u8a18\u4e8b\u3092\u3001\u5de5\u7a0b\u5225\u306b\u5206\u985e\u3057\u307e\u3057\u305f\u3002 \u74b0\u5883\u306e\u8a2d\u5b9a\u3067\u3064\u307e\u305a\u3044\u3066\u3044\u308b\u5834\u5408\u306f\u3001\u6700\u521d\u306e\u9805\u76ee\u304b\u3089\u3054\u89a7\u304f\u3060\u3055\u3044\u3002 \u5404\u30ab\u30c6\u30b4\u30ea\u30fc\u306f\u95b2\u89a7\u6570\u306e\u591a\u3044\u9806\u306b\u8868\u793a\u3057\u3066\u3044\u307e\u3059&#8230;<\/span>\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t<\/div>\n\t\t<\/div>\n\n\n<h3 class=\"wp-block-heading\">ExportPrefabRelationships.cs<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Project\u30a6\u30a3\u30f3\u30c9\u30a6\u3067\u5bfe\u8c61\u30d5\u30a9\u30eb\u30c0\u3092\u9078\u629e\u3057\u3001\u305d\u306e\u968e\u5c64\u4e0b\u306b\u3042\u308bPrefab\u306e\u53c2\u7167\u60c5\u5831\u3092CSV\u3068\u3057\u3066\u66f8\u304d\u51fa\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-csharp\" data-lang=\"C#\"><code>\/**\n * ExportPrefabRelationships.cs  (Assets\/Editor \u306b\u914d\u7f6e)\n *\n * \u9078\u629e\u30d5\u30a9\u30eb\u30c0\u914d\u4e0b\u306e Prefab \u4f9d\u5b58\u95a2\u4fc2\u3092\u65e5\u6642\u5165\u308a CSV \u3067\u66f8\u304d\u51fa\u3059\u3002\n * \u5217   : \u89aaPrefab\u540d, \u30d5\u30a9\u30eb\u30c0\u540d, \u5b50Prefab\u540d, \u95a2\u4fc2\u7a2e\u5225\n * \u7a2e\u5225 : Variant \u2026 Variant \u2192 Base\uff08+ \u7591\u4f3c Nested \u884c\uff09\n *        Nested  \u2026 \u89aa Prefab \u306b\u30cd\u30b9\u30c8\u3055\u308c\u3066\u3044\u308b\u5b50 Prefab\n *        Base    \u2026 \u307b\u304b\u306e Prefab \u304b\u3089\u53c2\u7167\u3055\u308c\u308b\u304c\u3001\u81ea\u8eab\u306f\u4f55\u3082\u53c2\u7167\u3057\u306a\u3044 Prefab\n *        \u5358\u72ec    \u2026 \u53c2\u7167\u95a2\u4fc2\u3092\u4e00\u5207\u6301\u305f\u306a\u3044 Prefab\n *\/\n\nusing UnityEngine;\nusing UnityEditor;\nusing System;\nusing System.IO;\nusing System.Text;\nusing System.Linq;\nusing System.Collections.Generic;\n\npublic static class ExportPrefabRelationships\n{\n    private const string MENU = &quot;Tools\/\u9078\u629e\u30d5\u30a9\u30eb\u30c0\u306ePrefab\u95a2\u4fc2\u3092CSV\u51fa\u529b&quot;;\n\n    [MenuItem(MENU)]\n    private static void Export()\n    {\n        \/* ---------- 1. \u9078\u629e\u30d5\u30a9\u30eb\u30c0\u78ba\u8a8d ---------- *\/\n        var roots = Selection.GetFiltered&lt;UnityEngine.Object&gt;(SelectionMode.Assets)\n                             .Select(AssetDatabase.GetAssetPath)\n                             .Where(AssetDatabase.IsValidFolder)\n                             .ToArray();\n\n        if (roots.Length == 0)\n        {\n            EditorUtility.DisplayDialog(&quot;\u30a8\u30e9\u30fc&quot;, &quot;Project \u30a6\u30a4\u30f3\u30c9\u30a6\u3067\u30d5\u30a9\u30eb\u30c0\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002&quot;, &quot;OK&quot;);\n            return;\n        }\n\n        \/* ---------- 2. Prefab \u4e00\u89a7 ---------- *\/\n        string[] prefabGUIDs = AssetDatabase.FindAssets(&quot;t:Prefab&quot;, roots);\n        string[] prefabPaths = prefabGUIDs.Select(AssetDatabase.GUIDToAssetPath).ToArray();\n        var pathByName       = prefabPaths.ToDictionary(p =&gt; Path.GetFileNameWithoutExtension(p), p =&gt; p);\n\n        \/* ---------- 3. \u7d50\u679c\u683c\u7d0d ---------- *\/\n        var relations = new HashSet&lt;(string parent, string folder, string child, string type)&gt;();\n\n        \/* ===== 3-A) Variant \u2192 Base ===== *\/\n        foreach (string path in prefabPaths)\n        {\n            var variantGO = AssetDatabase.LoadAssetAtPath&lt;GameObject&gt;(path);\n            if (PrefabUtility.GetPrefabAssetType(variantGO) != PrefabAssetType.Variant) continue;\n\n            var baseGO = PrefabUtility.GetCorrespondingObjectFromSource(variantGO);\n            if (baseGO == null) continue;\n\n            string folder      = GetTopFolder(path, roots);\n            string variantName = variantGO.name;\n            string baseName    = baseGO.name;\n\n            relations.Add((variantName, folder, baseName, &quot;Variant&quot;));\n            relations.Add((variantName, folder, baseName, &quot;Nested&quot;));   \/\/ \u7591\u4f3c Nested \u884c\n        }\n\n        \/* ===== 3-B) Nested\uff08\u76f4\u4e0b\u306e\u307f\uff09===== *\/\n        foreach (string parentPath in prefabPaths)\n        {\n            string parentName = Path.GetFileNameWithoutExtension(parentPath);\n            string folderName = GetTopFolder(parentPath, roots);\n\n            var seen = new HashSet&lt;string&gt;(); \/\/ \u89aa\u3054\u3068\u91cd\u8907\u6392\u9664\n\n            using var scope = new PrefabScope(parentPath);\n            foreach (Transform tr in scope.Root.transform)\n            {\n                \/\/ \u5b50Prefab\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u76f4\u4e0b\u306e\u307f\u691c\u67fb\uff08Transform\u968e\u5c641\u3064\u4e0b\uff09\n                if (!PrefabUtility.IsPartOfPrefabInstance(tr.gameObject)) continue;\n\n                GameObject instRoot = PrefabUtility.GetNearestPrefabInstanceRoot(tr.gameObject);\n                if (instRoot == null || instRoot == scope.Root) continue;\n\n                var src = PrefabUtility.GetCorrespondingObjectFromSource(instRoot);\n                if (src == null) continue;\n\n                string childName = src.name;\n                if (!seen.Add(childName)) continue;\n\n                relations.Add((parentName, folderName, childName, &quot;Nested&quot;));\n            }\n        }\n\n        \/* ===== 3-C) \u5358\u72ec\u30fbBase ===== *\/\n        var parents = relations.Select(r =&gt; r.parent).ToHashSet();\n        var childs  = relations.Select(r =&gt; r.child).Where(c =&gt; !string.IsNullOrEmpty(c)).ToHashSet();\n\n        foreach (string prefabName in pathByName.Keys)\n        {\n            bool isParent = parents.Contains(prefabName);\n            bool isChild  = childs.Contains(prefabName);\n\n            if (isParent && isChild) continue;                \/\/ \u89aa\u306b\u3082\u5b50\u306b\u3082\u51fa\u3066\u3044\u308b \u2192 \u65e2\u306b\u884c\u304c\u5b58\u5728\n            string folder = GetTopFolder(pathByName[prefabName], roots);\n\n            if (!isParent && !isChild)\n            {   \/\/ \u53c2\u7167\u3092\u5168\u304f\u6301\u305f\u306a\u3044\n                relations.Add((prefabName, folder, &quot;&quot;, &quot;\u5358\u72ec&quot;));\n            }\n            else if (!isParent && isChild)\n            {   \/\/ \u5b50\u306b\u3057\u304b\u51fa\u3066\u3053\u306a\u3044\uff08\uff1dBase\uff09\n                relations.Add((prefabName, folder, &quot;&quot;, &quot;Base&quot;));\n            }\n            \/\/ \u89aa\u306e\u307f\uff08isParent && !isChild\uff09\u306f\u65e2\u306b Variant\/Nested \u884c\u304c\u3042\u308b\u306e\u3067\u8ffd\u52a0\u4e0d\u8981\n        }\n\n        \/* ---------- 4. CSV \u51fa\u529b ---------- *\/\n        var sb = new StringBuilder();\n        sb.AppendLine(&quot;\u89aaPrefab\u540d,\u30d5\u30a9\u30eb\u30c0\u540d,\u5b50Prefab\u540d,\u95a2\u4fc2\u7a2e\u5225&quot;);\n\n        foreach (var r in relations\n                         .OrderBy(r =&gt; r.parent)\n                         .ThenBy(r =&gt; r.type)\n                         .ThenBy(r =&gt; r.child))\n        {\n            sb.AppendLine($&quot;{r.parent},{r.folder},{r.child},{r.type}&quot;);\n        }\n\n        string ts     = DateTime.Now.ToString(&quot;yyyyMMdd_HHmmss&quot;);\n        string fname  = $&quot;PrefabRelationships_{ts}.csv&quot;;\n        string saveTo = EditorUtility.SaveFilePanel(&quot;CSV \u3092\u4fdd\u5b58&quot;, Application.dataPath, fname, &quot;csv&quot;);\n        if (string.IsNullOrEmpty(saveTo)) return;\n\n        File.WriteAllText(saveTo, sb.ToString(), Encoding.UTF8);\n        EditorUtility.RevealInFinder(saveTo);\n        Debug.Log($&quot;CSV \u51fa\u529b\u5b8c\u4e86: {saveTo}&quot;);\n    }\n\n    \/* ---------- \u30eb\u30fc\u30c8\u76f4\u4e0b\u30d5\u30a9\u30eb\u30c0\u540d\u3092\u53d6\u5f97 ---------- *\/\n    private static string GetTopFolder(string prefabPath, string[] roots)\n    {\n        foreach (string root in roots)\n        {\n            if (!prefabPath.StartsWith(root)) continue;\n            string rel = prefabPath.Substring(root.Length).TrimStart(&#39;\/&#39;);\n            string first = rel.Split(&#39;\/&#39;)[0];\n            return string.IsNullOrEmpty(first) ? Path.GetFileName(root) : first;\n        }\n        return Path.GetFileName(Path.GetDirectoryName(prefabPath));\n    }\n\n    \/* ---------- PrefabContents \u30b9\u30b3\u30fc\u30d7 ---------- *\/\n    private readonly struct PrefabScope : IDisposable\n    {\n        public readonly GameObject Root;\n        public PrefabScope(string path) =&gt; Root = PrefabUtility.LoadPrefabContents(path);\n        public void Dispose()           =&gt; PrefabUtility.UnloadPrefabContents(Root);\n    }\n}\n<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u7d9a\u3044\u3066\u3001\u30b9\u30d7\u30ec\u30c3\u30c9\u30b7\u30fc\u30c8\u5074\u306b\u7d44\u307f\u8fbc\u3080GAS\u304a\u3088\u3073Web\u8868\u793a\u7528\u30d5\u30a1\u30a4\u30eb\u3067\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Code.gs<\/h3>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-js\" data-lang=\"JavaScript\"><code>\/* Code.gs  \u2500 \u30b5\u30fc\u30d0\u30fc\u5074\u30ed\u30b8\u30c3\u30af *\/\n\nfunction doGet() {\n  return HtmlService.createTemplateFromFile(&#39;index&#39;).evaluate().setTitle(&#39;Prefab Viewer&#39;);\n}\nfunction include(f) { return HtmlService.createHtmlOutputFromFile(f).getContent(); }\n\n\/* \u30b9\u30d7\u30ec\u30c3\u30c9\u30b7\u30fc\u30c8 \u2192 \u30ce\u30fc\u30c9\uff0f\u30a8\u30c3\u30b8\u69cb\u9020 *\/\nfunction getPrefabGraphData() {\n  const sh   = SpreadsheetApp.getActive().getSheetByName(&#39;\u30b7\u30fc\u30c81&#39;);\n  const rows = sh.getDataRange().getValues().slice(1);        \/\/ \u30d8\u30c3\u30c0\u30fc\u9664\u53bb\n\n  const relPrio = { Base: 3, Variant: 2, Nested: 1 };\n  const nodes   = new Map();                                   \/\/ id \u2192 { id, folder, relation }\n  const edges   = [];                                          \/\/ { source(child), target(parent) }\n\n  \/** \u30ce\u30fc\u30c9\u3092\u8ffd\u52a0\uff0f\u66f4\u65b0  \n   *  \u30fb\u30d5\u30a9\u30eb\u30c0\u306f\u201c\u6700\u521d\u306b\u4ed8\u3044\u305f\u5024\u201d\u3092\u512a\u5148\uff08Common \u304c\u3042\u3068\u3067 Dialog \u306b\u66f8\u304d\u63db\u308f\u3089\u306a\u3044\uff09  \n   *  \u30fbrelation \u306f Base &gt; Variant &gt; Nested \u512a\u5148 *\/\n  function upsert(id, folder, rel) {\n    if (!id) return;\n    const ex = nodes.get(id);\n    if (!ex) {\n      nodes.set(id, { id, folder, relation: rel });\n    } else {\n      if (ex.folder === &#39;\u305d\u306e\u4ed6&#39;) ex.folder = folder;          \/\/ \u307e\u3060\u672a\u78ba\u5b9a\u306a\u3089\u66f8\u304d\u63db\u3048\n      if (relPrio[rel] &gt; relPrio[ex.relation]) ex.relation = rel;\n    }\n  }\n\n  rows.forEach(r =&gt; {\n    const parent = String(r[0] || &#39;&#39;).trim();                  \/\/ \u89aaPrefab\u540d\n    const folder = String(r[1] || &#39;\u305d\u306e\u4ed6&#39;).trim();            \/\/ \u30d5\u30a9\u30eb\u30c0\u540d\n    const child  = String(r[2] || &#39;&#39;).trim();                  \/\/ \u5b50Prefab\u540d\n    const rel    = String(r[3] || &#39;&#39;).trim();                  \/\/ \u95a2\u4fc2\u7a2e\u5225\n\n    \/\/ \u89aa\u30ce\u30fc\u30c9\uff08\u81ea\u8eab\u304c Base \u306a\u3089 Base\u3001Variant \u884c\u306a\u3089 Variant\u3001\u901a\u5e38\u884c\u306a\u3089 Nested\uff09\n    const parentRel = rel === &#39;Base&#39; ? &#39;Base&#39; :\n                      rel === &#39;Variant&#39; ? &#39;Variant&#39; : &#39;Nested&#39;;\n    upsert(parent, folder, parentRel);\n\n    \/\/ \u5b50\u30ce\u30fc\u30c9 + \u30a8\u30c3\u30b8\uff08\u5b50 \u2192 \u89aa\uff09\u203b\u5b50\u30d5\u30a9\u30eb\u30c0\u306f\u672a\u77e5\u306a\u306e\u3067\u300c\u305d\u306e\u4ed6\u300d\u3067\u4eee\u767b\u9332\n    if (child) {\n      const childRel = (rel === &#39;Variant&#39;) ? &#39;Base&#39; : &#39;Nested&#39;;  \/\/ \u5b50\u306f Base(\u6d3e\u751f\u5143) \u304b Nested\n      upsert(child, &#39;\u305d\u306e\u4ed6&#39;, childRel);\n      edges.push({ source: child, target: parent });\n    }\n  });\n\n  return { nodes: [...nodes.values()], edges };\n}\n<\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">index.html<\/h3>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-html\" data-lang=\"HTML\"><code>&lt;!DOCTYPE html&gt;\n&lt;html&gt;\n&lt;head&gt;\n  &lt;base target=&quot;_top&quot;&gt;\n  &lt;script src=&quot;https:\/\/unpkg.com\/cytoscape@3.23.0\/dist\/cytoscape.min.js&quot;&gt;&lt;\/script&gt;\n  &lt;!-- \u5171\u901a\u30ce\u30fc\u30c9\uff0f\u30a8\u30c3\u30b8\u30b9\u30bf\u30a4\u30eb --&gt;\n  &lt;?!= include(&#39;css&#39;); ?&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n  &lt;h2 class=&quot;title-header&quot;&gt;\n    Prefab \u53c2\u7167\u69cb\u9020\u30d3\u30e5\u30fc\u30a2\n    &lt;span class=&quot;legend&quot;&gt;\n      &lt;span class=&quot;legend-item&quot;&gt;\n        &lt;span class=&quot;legend-color parent&quot;&gt;&lt;\/span&gt; \u89aaPrefab\n      &lt;\/span&gt;\n      &lt;span class=&quot;legend-item&quot;&gt;\n        &lt;span class=&quot;legend-color variant&quot;&gt;&lt;\/span&gt; Variant\n      &lt;\/span&gt;\n      &lt;span class=&quot;legend-item&quot;&gt;\n        &lt;span class=&quot;legend-color standalone&quot;&gt;&lt;\/span&gt; \u5358\u72ecPrefab\n      &lt;\/span&gt;\n    &lt;\/span&gt;\n  &lt;\/h2&gt;\n\n  &lt;!-- \u30d7\u30eb\u30c0\u30a6\u30f3\u30e1\u30cb\u30e5\u30fc --&gt;\n  &lt;label for=&quot;prefabSelect&quot;&gt;\u89aaPrefab\u3092\u9078\u629e\uff1a&lt;\/label&gt;\n  &lt;select id=&quot;prefabSelect&quot;&gt;\n    &lt;option value=&quot;&quot;&gt;\uff08\u3059\u3079\u3066\u8868\u793a\uff09&lt;\/option&gt;\n  &lt;\/select&gt;\n\n  &lt;label&gt;&lt;input type=&quot;radio&quot; name=&quot;direction&quot; value=&quot;down&quot; checked&gt; \u89aa\u2192\u5b50&lt;\/label&gt;\n  &lt;label&gt;&lt;input type=&quot;radio&quot; name=&quot;direction&quot; value=&quot;up&quot;&gt; \u5b50\u2192\u89aa&lt;\/label&gt;\n\n  &lt;div id=&quot;cy&quot; class=&quot;graph-area&quot;&gt;&lt;\/div&gt;\n\n  &lt;?!= include(&#39;js&#39;); ?&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;\n<\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">js.html<\/h3>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-js\" data-lang=\"JavaScript\"><code>&lt;script&gt;\nlet fullData = null;\nlet cy = null;\n\ngoogle.script.run.withSuccessHandler(init).getPrefabGraphData();\n\nfunction init(data) {\n  fullData = data;\n\n  \/\/ \u30d7\u30eb\u30c0\u30a6\u30f3\u751f\u6210\n  const prefabNames = [...new Set(data.nodes.map(n =&gt; n.id))].sort();\n  const select = document.getElementById(&#39;prefabSelect&#39;);\n  prefabNames.forEach(name =&gt; {\n    const opt = document.createElement(&#39;option&#39;);\n    opt.value = name;\n    opt.textContent = name;\n    select.appendChild(opt);\n  });\n\n  \/\/ \u30d7\u30eb\u30c0\u30a6\u30f3\u5909\u66f4\u6642\n  select.addEventListener(&#39;change&#39;, () =&gt; {\n    drawGraph(select.value);\n  });\n\n  \/\/ \u30e9\u30b8\u30aa\u30dc\u30bf\u30f3\u5909\u66f4\u6642\n  document.querySelectorAll(&#39;input[name=&quot;direction&quot;]&#39;).forEach(r =&gt; {\n    r.addEventListener(&#39;change&#39;, () =&gt; {\n      drawGraph(select.value);\n    });\n  });\n\n  drawGraph(); \/\/ \u521d\u671f\u8868\u793a\n}\n\nfunction drawGraph(parentFilter = &#39;&#39;) {\n  const direction = document.querySelector(&#39;input[name=&quot;direction&quot;]:checked&#39;).value;\n  const els = [];\n  const nodeMap = new Map();\n  fullData.nodes.forEach(n =&gt; nodeMap.set(n.id, n));\n\n  const targetNodeIds = new Set();\n\n  \/\/ \u89aa\u2192\u5b50\u3092\u8fbf\u308b\n  function collectDescendantsOneWay(currentId) {\n    if (targetNodeIds.has(currentId)) return;\n    targetNodeIds.add(currentId);\n\n    fullData.edges.forEach(e =&gt; {\n      if (e.source === currentId && !targetNodeIds.has(e.target)) {\n        collectDescendantsOneWay(e.target);\n      }\n    });\n  }\n\n  \/\/ \u5b50\u2192\u89aa\u3092\u8fbf\u308b\n  function collectAncestorsOneWay(currentId) {\n    if (targetNodeIds.has(currentId)) return;\n    targetNodeIds.add(currentId);\n\n    fullData.edges.forEach(e =&gt; {\n      if (e.target === currentId && !targetNodeIds.has(e.source)) {\n        collectAncestorsOneWay(e.source);\n      }\n    });\n  }\n\n  if (parentFilter) {\n    if (direction === &#39;down&#39;) {\n      collectDescendantsOneWay(parentFilter);\n    } else {\n      collectAncestorsOneWay(parentFilter);\n    }\n  } else {\n    fullData.nodes.forEach(n =&gt; targetNodeIds.add(n.id));\n  }\n\n  \/\/ \u30ce\u30fc\u30c9\u8ffd\u52a0\n  targetNodeIds.forEach(id =&gt; {\n    const n = nodeMap.get(id);\n    if (n) els.push({ data: { id: n.id, folder: n.folder, relation: n.relation } });\n  });\n\n  \/\/ \u30a8\u30c3\u30b8\u8ffd\u52a0\n  const addedEdges = new Set();\n  fullData.edges.forEach(e =&gt; {\n    const key = `${e.source}-&gt;${e.target}`;\n    if (\n      targetNodeIds.has(e.source) &&\n      targetNodeIds.has(e.target) &&\n      !addedEdges.has(key)\n    ) {\n      els.push({ data: { source: e.source, target: e.target } });\n      addedEdges.add(key);\n    }\n  });\n\n  \/\/ \u30eb\u30fc\u30c8\uff08\u5165\u529b\u306e\u306a\u3044\u30ce\u30fc\u30c9\uff09\u7279\u5b9a\n  const hasIn = {};\n  els.filter(el =&gt; el.data.target).forEach(el =&gt; hasIn[el.data.target] = true);\n  const roots = Array.from(targetNodeIds).filter(id =&gt; !hasIn[id]);\n\n  if (cy) cy.destroy();\n  cy = cytoscape({\n    container: document.getElementById(&#39;cy&#39;),\n    elements : els,\n    layout   : {\n      name: &#39;breadthfirst&#39;,\n      roots: roots,\n      spacingFactor: 1.5,\n      padding: 10\n    },\n    style: window.cyStyle\n  });\n}\n&lt;\/script&gt;<\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">css.html<\/h3>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-css\" data-lang=\"CSS\"><code>&lt;style&gt;\n\/* ===============================\n   HTML\u7528\u306eCSS\u30b9\u30bf\u30a4\u30eb\n   =============================== *\/\n.title-header {\n  display: flex;\n  align-items: center;\n  gap: 1rem;\n}\n\n.legend {\n  display: flex;\n  gap: 0.5rem;\n  font-size: 0.9em;\n}\n\n.legend-item {\n  display: flex;\n  align-items: center;\n}\n\n.legend-color {\n  width: 16px;\n  height: 16px;\n  display: inline-block;\n  margin-right: 4px;\n  border-radius: 3px;\n}\n\n.legend-color.parent {\n  background-color: #3498db;\n}\n\n.legend-color.variant {\n  background-color: #add8e6;\n}\n\n.legend-color.standalone {\n  background-color: white;\n  border: 2px solid #3498db;\n}\n\n.graph-area {\n  width: 100%;\n  height: 720px;\n  margin-top: 1rem;\n}\n&lt;\/style&gt;\n&lt;script&gt;\n\/* ------------------------------------------------------------------\n   window.cyStyle : \u30ce\u30fc\u30c9 \/ \u30a8\u30c3\u30b8\u5171\u901a\u30b9\u30bf\u30a4\u30eb\n   ------------------------------------------------------------------ *\/\nwindow.cyStyle = [\n  \/* \u30c7\u30d5\u30a9\u30eb\u30c8\uff08Nested \u7528\uff1a\u67a0\u306e\u307f\uff09 *\/\n  {\n    selector: &#39;node&#39;,\n    style: {\n      label: &#39;data(id)&#39;,\n      &#39;text-valign&#39;: &#39;center&#39;,\n      &#39;text-halign&#39;: &#39;center&#39;,\n      &#39;font-size&#39;: &#39;16px&#39;,\n      shape: &#39;roundrectangle&#39;,\n      width: 100,\n      height: 50,\n      &#39;border-width&#39;: 2,\n      &#39;border-color&#39;: &#39;#000&#39;,\n      &#39;background-opacity&#39;: 0      \/* \u2190 \u67a0\u306e\u307f *\/\n    }\n  },\n\n  \/* Base \uff1d \u4e0d\u900f\u660e\u5857\u308a\u3064\u3076\u3057 *\/\n  { selector: &#39;node[relation = &quot;Base&quot;]&#39;,\n    style: { &#39;background-opacity&#39;: 1 } },\n\n  \/* Variant \uff1d \u534a\u900f\u660e\u5857\u308a\u3064\u3076\u3057 *\/\n  { selector: &#39;node[relation = &quot;Variant&quot;]&#39;,\n    style: { &#39;background-opacity&#39;: 0.3 } },\n\n  \/* \u30d5\u30a9\u30eb\u30c0\u5225\u30ab\u30e9\u30fc\uff08\u67a0\u30fb\u5857\u308a\u5171\u901a\uff09 *\/\n  { selector: &#39;node[folder = &quot;Common&quot;]&#39;,\n    style: { &#39;border-color&#39;: &#39;#3498db&#39;, &#39;background-color&#39;: &#39;#3498db&#39; } },\n  { selector: &#39;node[folder = &quot;Dialog&quot;]&#39;,\n    style: { &#39;border-color&#39;: &#39;#2ecc71&#39;, &#39;background-color&#39;: &#39;#2ecc71&#39; } },\n  { selector: &#39;node[folder = &quot;\u305d\u306e\u4ed6&quot;]&#39;,\n    style: { &#39;border-color&#39;: &#39;#95a5a6&#39;, &#39;background-color&#39;: &#39;#95a5a6&#39; } },\n\n  \/* \u30a8\u30c3\u30b8 *\/\n  { selector: &#39;edge&#39;,\n    style: {\n      width: 2,\n      &#39;line-color&#39;: &#39;#666&#39;,\n      &#39;target-arrow-shape&#39;: &#39;triangle&#39;,\n      &#39;target-arrow-color&#39;: &#39;#666&#39;,\n      &#39;curve-style&#39;: &#39;bezier&#39;\n    }\n  }\n];\n&lt;\/script&gt;\n<\/code><\/pre><\/div>\n\n<!-- cgm-topic:start -->\n\n\n<p class=\"wp-block-paragraph\">\u30a8\u30c7\u30a3\u30bf\u62e1\u5f35\u306e\u8a18\u4e8b\u306f\u3001\u307b\u304b\u306b\u3082\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n<div class=\"swell-block-postLink\">\t\t\t<div class=\"p-blogCard -internal\" data-type=\"type1\" data-onclick=\"clickLink\">\n\t\t\t\t<div class=\"p-blogCard__inner\">\n\t\t\t\t\t<span class=\"p-blogCard__caption\">\u3042\u308f\u305b\u3066\u8aad\u307f\u305f\u3044<\/span>\n\t\t\t\t\t<div class=\"p-blogCard__thumb c-postThumb\"><figure class=\"c-postThumb__figure\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/cg-method.com\/unity\/wp-content\/uploads\/2025\/06\/unity-prefab-csv-export-tool-300x169.jpg\" alt=\"\" class=\"c-postThumb__img u-obf-cover\" width=\"320\" height=\"180\"><\/figure><\/div>\t\t\t\t\t<div class=\"p-blogCard__body\">\n\t\t\t\t\t\t<a class=\"p-blogCard__title\" href=\"https:\/\/cg-method.com\/unity\/unity-prefab-csv-export-tool\/\">Unity\u2502\u9078\u629e\u3057\u305f\u30d5\u30a9\u30eb\u30c0\u5185\u306ePrefab\u306e\u60c5\u5831\u3092\u66f8\u304d\u51fa\u3059\u30c4\u30fc\u30eb<\/a>\n\t\t\t\t\t\t<span class=\"p-blogCard__excerpt\">Unity\u306e\u30d2\u30a8\u30e9\u30eb\u30ad\u30fc\u3084\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u69cb\u6210\u306f\u6570\u304c\u5897\u3048\u308b\u3068\u78ba\u8a8d\u3057\u3065\u3089\u3044\u305f\u3081\u3001Prefab\u304b\u3089\u5fc5\u8981\u306a\u60c5\u5831\u3060\u3051\u3092\u62bd\u51fa\u3057\u3066CSV\u3078\u66f8\u304d\u51fa\u3059\u30a8\u30c7\u30a3\u30bf\u62e1\u5f35\u3092\u4f5c\u6210\u3057\u307e\u3057\u305f\u3002 \u6307\u5b9a\u3057\u305f\u30d5&#8230;<\/span>\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t<\/div>\n\t\t<\/div>\n\n<div class=\"swell-block-postLink\">\t\t\t<div class=\"p-blogCard -internal\" data-type=\"type1\" data-onclick=\"clickLink\">\n\t\t\t\t<div class=\"p-blogCard__inner\">\n\t\t\t\t\t<span class=\"p-blogCard__caption\">\u3042\u308f\u305b\u3066\u8aad\u307f\u305f\u3044<\/span>\n\t\t\t\t\t<div class=\"p-blogCard__thumb c-postThumb\"><figure class=\"c-postThumb__figure\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/cg-method.com\/unity\/wp-content\/uploads\/2025\/08\/unity-batchmode-desktop-output-300x169.jpg\" alt=\"\" class=\"c-postThumb__img u-obf-cover\" width=\"320\" height=\"180\"><\/figure><\/div>\t\t\t\t\t<div class=\"p-blogCard__body\">\n\t\t\t\t\t\t<a class=\"p-blogCard__title\" href=\"https:\/\/cg-method.com\/unity\/unity-batchmode-desktop-output\/\">Unity\u2502\u30d0\u30c3\u30c1\u30e2\u30fc\u30c9\u3067\u30a8\u30c7\u30a3\u30bf\u30b9\u30af\u30ea\u30d7\u30c8\u3092\u5b9f\u884c\u3059\u308b\u65b9\u6cd5\u2502\u30d8\u30c3\u30c9\u30ec\u30b9<\/a>\n\t\t\t\t\t\t<span class=\"p-blogCard__excerpt\">Unity\u30a8\u30c7\u30a3\u30bf\u30fc\u306eGUI\u3092\u8d77\u52d5\u305b\u305a\u3001\u30d0\u30c3\u30c1\u30e2\u30fc\u30c9\uff08\u30d8\u30c3\u30c9\u30ec\u30b9\uff09\u3067\u30a8\u30c7\u30a3\u30bf\u30b9\u30af\u30ea\u30d7\u30c8\u3092\u5b9f\u884c\u3059\u308b\u624b\u9806\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002 \u30b3\u30de\u30f3\u30c9\u30e9\u30a4\u30f3\u304b\u3089\u51e6\u7406\u3092\u547c\u3073\u51fa\u3059\u3053\u3068\u3067\u3001\u8907\u6570\u306e\u30b9\u30af&#8230;<\/span>\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t<\/div>\n\t\t<\/div>\n\n<div class=\"swell-block-postLink\">\t\t\t<div class=\"p-blogCard -internal\" data-type=\"type1\" data-onclick=\"clickLink\">\n\t\t\t\t<div class=\"p-blogCard__inner\">\n\t\t\t\t\t<span class=\"p-blogCard__caption\">\u3042\u308f\u305b\u3066\u8aad\u307f\u305f\u3044<\/span>\n\t\t\t\t\t<div class=\"p-blogCard__thumb c-postThumb\"><figure class=\"c-postThumb__figure\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/cg-method.com\/unity\/wp-content\/uploads\/2018\/08\/unity-ui-editor-extensions-300x169.jpg\" alt=\"\" class=\"c-postThumb__img u-obf-cover\" width=\"320\" height=\"180\"><\/figure><\/div>\t\t\t\t\t<div class=\"p-blogCard__body\">\n\t\t\t\t\t\t<a class=\"p-blogCard__title\" href=\"https:\/\/cg-method.com\/unity\/unity-ui-editor-extensions\/\">Unity\u2502UI\u5236\u4f5c\u306b\u4fbf\u5229\uff01\u30a8\u30c7\u30a3\u30bf\u62e1\u5f35\u307e\u3068\u3081 13\u9078\u2502uGUI<\/a>\n\t\t\t\t\t\t<span class=\"p-blogCard__excerpt\">uGUI\u3067\u306eUI\u5236\u4f5c\u306b\u5f79\u7acb\u3064\u30a8\u30c7\u30a3\u30bf\u62e1\u5f35\u3084\u30b9\u30af\u30ea\u30d7\u30c8\u3092\u307e\u3068\u3081\u307e\u3057\u305f\u3002 Photoshop\u9023\u643a\u3001\u30a2\u30a6\u30c8\u30e9\u30a4\u30f3\u63cf\u753b\u3001\u6587\u5b57\u9593\u9694\uff08\u30ab\u30fc\u30cb\u30f3\u30b0\uff09\u8abf\u6574\u3001\u30d5\u30a9\u30f3\u30c8\u4e00\u62ec\u7f6e\u63db\u306a\u3069\u3001\u5b9f\u969b\u306e\u5236\u4f5c&#8230;<\/span>\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t<\/div>\n\t\t<\/div>\n\n<div class=\"swell-block-postLink\">\t\t\t<div class=\"p-blogCard -internal\" data-type=\"type1\" data-onclick=\"clickLink\">\n\t\t\t\t<div class=\"p-blogCard__inner\">\n\t\t\t\t\t<span class=\"p-blogCard__caption\">\u3042\u308f\u305b\u3066\u8aad\u307f\u305f\u3044<\/span>\n\t\t\t\t\t<div class=\"p-blogCard__thumb c-postThumb\"><figure class=\"c-postThumb__figure\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/cg-method.com\/unity\/wp-content\/uploads\/2018\/08\/unity-editor-extensions-300x169.jpg\" alt=\"\" class=\"c-postThumb__img u-obf-cover\" width=\"320\" height=\"180\"><\/figure><\/div>\t\t\t\t\t<div class=\"p-blogCard__body\">\n\t\t\t\t\t\t<a class=\"p-blogCard__title\" href=\"https:\/\/cg-method.com\/unity\/unity-editor-extensions\/\">Unity\u2502\u77e5\u3063\u3066\u304a\u304f\u3068\u4fbf\u5229\uff01\u30a8\u30c7\u30a3\u30bf\u62e1\u5f35\u307e\u3068\u3081 9\u9078<\/a>\n\t\t\t\t\t\t<span class=\"p-blogCard__excerpt\">\u30a8\u30c7\u30a3\u30bf\u62e1\u5f35\u3092\u4f7f\u3046\u3068\u3001Unity\u306b\u6a19\u6e96\u642d\u8f09\u3055\u308c\u3066\u3044\u306a\u3044\u72ec\u81ea\u306e\u6a5f\u80fd\u3092\u8ffd\u52a0\u3067\u304d\u307e\u3059\u3002 \u958b\u767a\u4f5c\u696d\u306e\u52b9\u7387\u5316\u306b\u5f79\u7acb\u3064\u304a\u3059\u3059\u3081\u306e\u30a8\u30c7\u30a3\u30bf\u62e1\u5f35\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002 \u5148\u982d\u3084\u6700\u5f8c\u5c3e\u306b\u6587\u5b57\u3092&#8230;<\/span>\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t<\/div>\n\t\t<\/div>\n\n<!-- cgm-topic:end -->\n\n\n\n","protected":false},"excerpt":{"rendered":"<p>Unity\u306ePrefab\u53c2\u7167\u69cb\u9020\u3092\u30ce\u30fc\u30c9\u5f62\u5f0f\u3067\u53ef\u8996\u5316\u3059\u308b\u30a2\u30bb\u30c3\u30c8\u306f\u65e2\u306b\u5b58\u5728\u3057\u307e\u3059\u304c\u3001Google\u30b9\u30d7\u30ec\u30c3\u30c9\u30b7\u30fc\u30c8\u3084Google Apps Script\uff08GAS\uff09\u4e0a\u3067\u3082\u78ba\u8a8d\u3067\u304d\u308b\u3088\u3046\u306b\u30c4\u30fc\u30eb\u3092\u4f5c\u6210\u3057\u307e\u3057\u305f\u3002 \u30b0\u30e9\u30d5\u63cf\u753b\u30e9\u30a4 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":169,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"pochipp_cv_data":"","swell_btn_cv_data":"","book_review_data":"","footnotes":"","ssp_meta_title":"Unity Prefab\u53c2\u7167\u69cb\u9020\u3092\u53ef\u8996\u5316\u3059\u308b\u30c4\u30fc\u30eb","ssp_meta_description":"Unity\u306ePrefab\u53c2\u7167\u69cb\u9020\u3092\u30ce\u30fc\u30c9\u5f62\u5f0f\u3067\u53ef\u8996\u5316\u3059\u308b\u30c4\u30fc\u30eb\u306e\u5b9f\u88c5\u3092\u7d39\u4ecb\u3002Editor\u30b9\u30af\u30ea\u30d7\u30c8\u3067Prefab\u306e\u4f9d\u5b58\u95a2\u4fc2\u3092CSV\u51fa\u529b\u3057\u3001Cytoscape.js\u3068GAS\u3001Google\u30b9\u30d7\u30ec\u30c3\u30c9\u30b7\u30fc\u30c8\u4e0a\u3067\u78ba\u8a8d\u3067\u304d\u308b\u3088\u3046\u306b\u3059\u308b\u5404\u30b3\u30fc\u30c9\u3092\u63b2\u8f09\u3002"},"categories":[24],"tags":[],"class_list":["post-165","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-editor"],"_links":{"self":[{"href":"https:\/\/cg-method.com\/unity\/wp-json\/wp\/v2\/posts\/165","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cg-method.com\/unity\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cg-method.com\/unity\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cg-method.com\/unity\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cg-method.com\/unity\/wp-json\/wp\/v2\/comments?post=165"}],"version-history":[{"count":8,"href":"https:\/\/cg-method.com\/unity\/wp-json\/wp\/v2\/posts\/165\/revisions"}],"predecessor-version":[{"id":22108,"href":"https:\/\/cg-method.com\/unity\/wp-json\/wp\/v2\/posts\/165\/revisions\/22108"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cg-method.com\/unity\/wp-json\/wp\/v2\/media\/169"}],"wp:attachment":[{"href":"https:\/\/cg-method.com\/unity\/wp-json\/wp\/v2\/media?parent=165"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cg-method.com\/unity\/wp-json\/wp\/v2\/categories?post=165"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cg-method.com\/unity\/wp-json\/wp\/v2\/tags?post=165"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}