69 lines
3.8 KiB
C#
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();
|
|
}
|
|
}
|