// WL838_GreatswordSetup.cs — 대검 계열 자산 조립 (에디터 · 1회) (#838 · 2026-10-11 · PD 「대검 아이템을 추가하고, 대검 모션을 사용하는 캐릭터 공격 타입도 추가해줘 (2Handed Warrior)」) // ① 한손검 컨트롤러 복제 → pcanim_greatsword.controller (공격 3상태의 모션은 매핑 도구 WL826/WL_CombatAnimSetup 이 2Handed Warrior 팩 서브클립으로 교체) // ② PurePoly 양손검 모델 → Assets/Res_Addr/Weapon/PP_Theme_01_Sword_Two-Handed_001.prefab (Make_Weapon 이 이 경로를 Addressables 로 읽는다 · 창 WL825 와 같은 규칙) // ③ 두 자산을 Addressables 에 등록(주소 = 경로 · 한손검 컨트롤러와 같은 그룹) // 실행: unity command run_script --file AgentScripts/WL838_GreatswordSetup.cs --entry WL838_GreatswordSetup.Run --timeout 120 using System.Text; using UnityEditor; using UnityEditor.AddressableAssets; using UnityEditor.AddressableAssets.Settings; using UnityEngine; public static class WL838_GreatswordSetup { const string SrcCtrl = "Assets/Res_Addr/Animations/pcanim_onehand.controller"; public const string DstCtrl = "Assets/Res_Addr/Animations/pcanim_greatsword.controller"; const string SrcFbx = "Assets/ResWork/PurePoly/Fantasy RPG Weapons/Meshes/PP_Theme_01_Sword_Two-Handed_001.fbx"; public const string WeaponName = "PP_Theme_01_Sword_Two-Handed_001"; const string DstPrefab = "Assets/Res_Addr/Weapon/" + WeaponName + ".prefab"; public static string Run() { if (EditorApplication.isPlaying) return "skipped: playing"; var sb = new StringBuilder(); // ① 컨트롤러 if (AssetDatabase.LoadAssetAtPath(DstCtrl) == null) { if (!AssetDatabase.CopyAsset(SrcCtrl, DstCtrl)) return "컨트롤러 복제 실패 " + SrcCtrl; sb.Append("컨트롤러 복제 · "); } else sb.Append("컨트롤러 있음 · "); // ② 무기 프리팹 if (AssetDatabase.LoadAssetAtPath(DstPrefab) == null) { var fbxPath = SrcFbx; var fbx = AssetDatabase.LoadAssetAtPath(fbxPath); if (fbx == null) { foreach (var g in AssetDatabase.FindAssets(WeaponName + " t:Model", new[] { "Assets/ResWork/PurePoly" })) { fbxPath = AssetDatabase.GUIDToAssetPath(g); fbx = AssetDatabase.LoadAssetAtPath(fbxPath); if (fbx != null) break; } } if (fbx == null) return sb + "대검 모델 없음 " + SrcFbx; var inst = (GameObject)PrefabUtility.InstantiatePrefab(fbx); inst.name = WeaponName; PrefabUtility.SaveAsPrefabAsset(inst, DstPrefab); Object.DestroyImmediate(inst); sb.Append("무기 프리팹 생성(").Append(fbxPath).Append(") · "); } else sb.Append("무기 프리팹 있음 · "); // ③ Addressables var settings = AddressableAssetSettingsDefaultObject.Settings; if (settings == null) sb.Append("Addressables 설정 없음(등록 생략) · "); else { var srcEntry = settings.FindAssetEntry(AssetDatabase.AssetPathToGUID(SrcCtrl)); var group = srcEntry != null ? srcEntry.parentGroup : settings.DefaultGroup; foreach (var p in new[] { DstCtrl, DstPrefab }) { var guid = AssetDatabase.AssetPathToGUID(p); var e = settings.CreateOrMoveEntry(guid, group, false, false); e.address = p; sb.Append("주소 ").Append(p).Append(" @").Append(group.Name).Append(" · "); } settings.SetDirty(AddressableAssetSettings.ModificationEvent.EntryMoved, null, true, true); } AssetDatabase.SaveAssets(); return sb.ToString(); } }