Project_WL/AgentScripts/WL838_GreatswordSetup.cs

69 lines
3.8 KiB
C#

// 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<UnityEditor.Animations.AnimatorController>(DstCtrl) == null)
{
if (!AssetDatabase.CopyAsset(SrcCtrl, DstCtrl)) return "컨트롤러 복제 실패 " + SrcCtrl;
sb.Append("컨트롤러 복제 · ");
}
else sb.Append("컨트롤러 있음 · ");
// ② 무기 프리팹
if (AssetDatabase.LoadAssetAtPath<GameObject>(DstPrefab) == null)
{
var fbxPath = SrcFbx;
var fbx = AssetDatabase.LoadAssetAtPath<GameObject>(fbxPath);
if (fbx == null)
{
foreach (var g in AssetDatabase.FindAssets(WeaponName + " t:Model", new[] { "Assets/ResWork/PurePoly" }))
{ fbxPath = AssetDatabase.GUIDToAssetPath(g); fbx = AssetDatabase.LoadAssetAtPath<GameObject>(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();
}
}