68 lines
4.5 KiB
C#
68 lines
4.5 KiB
C#
|
|
// WL850_SwordArc.cs — 검 1타 궤적을 가로 베기로 덮어쓰고(보정 행) 검 직업 호 크기를 칼끝 반경에 맞춘다(직업 오버라이드) · 에디터 · 멱등
|
|||
|
|
// PD 2026-10-12 #850 「검 1타 공격의 궤적을 상단이 아니라 횡으로 · 검 이펙트 크기가 검 크기에 비해 너무 크다」
|
|||
|
|
// 값 = AgentScripts/WL850_SwordArc.json (C45)
|
|||
|
|
// unity command run_script --file AgentScripts/WL850_SwordArc.cs --entry WL850_SwordArc.Apply --timeout 120
|
|||
|
|
// 🔴 WL828_TrailBake 로 10101·10102 1타를 다시 구우면 행이 측정값으로 돌아간다 → 그 뒤 이 도구를 다시 돌린다.
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System.Text;
|
|||
|
|
using UnityEditor;
|
|||
|
|
using UnityEngine;
|
|||
|
|
using WL.Combat;
|
|||
|
|
|
|||
|
|
public static class WL850_SwordArc
|
|||
|
|
{
|
|||
|
|
const string SpecPath = "AgentScripts/WL850_SwordArc.json";
|
|||
|
|
const string SettingsPath = "Assets/WL/Settings/Resources/WL/SlashTrailSettings.asset";
|
|||
|
|
|
|||
|
|
class Spec { public List<RowSpec> rows; public List<OvSpec> classOverrides; }
|
|||
|
|
class RowSpec { public int classId; public string clipName; public float[] planeNormal, bisector, pivot; public float sweepDeg; public float tipRadius = -1f; }
|
|||
|
|
class OvSpec { public int classId; public bool arcFitBlade; public float arcSizeMul = 1f; }
|
|||
|
|
|
|||
|
|
static Vector3 V(float[] a) { return new Vector3(a[0], a[1], a[2]); }
|
|||
|
|
|
|||
|
|
public static string Apply()
|
|||
|
|
{
|
|||
|
|
var spec = Newtonsoft.Json.JsonConvert.DeserializeObject<Spec>(System.IO.File.ReadAllText(SpecPath));
|
|||
|
|
var st = AssetDatabase.LoadAssetAtPath<SlashTrailSettings>(SettingsPath);
|
|||
|
|
if (st == null) return "settings 없음";
|
|||
|
|
var sb = new StringBuilder();
|
|||
|
|
foreach (var r in spec.rows)
|
|||
|
|
{
|
|||
|
|
var cal = st.FindCalibration(r.classId, r.clipName);
|
|||
|
|
if (cal == null) { sb.Append("행 없음 ").Append(r.classId).Append(' ').Append(r.clipName).Append('\n'); continue; }
|
|||
|
|
Vector3 n = V(r.planeNormal).normalized, b = V(r.bisector);
|
|||
|
|
b -= n * Vector3.Dot(b, n); b.Normalize();
|
|||
|
|
// 시작 방향 = 이등분을 법선 축으로 −sweep/2 돌린 것(시작→이등분이 법선 기준 양의 회전 = WL828 규약)
|
|||
|
|
Vector3 start = Quaternion.AngleAxis(-r.sweepDeg * 0.5f, n) * b;
|
|||
|
|
string before = "n=" + cal.planeNormal.ToString("F2") + " bis=" + cal.bisector.ToString("F2") + " pivot=" + cal.pivot.ToString("F2") + " sweep=" + cal.sweepDeg.ToString("F0") + " tipR=" + cal.tipRadius.ToString("F2");
|
|||
|
|
cal.kind = SwingKind.Swing;
|
|||
|
|
cal.planeNormal = n; cal.bisector = b; cal.startDir = start.normalized;
|
|||
|
|
cal.pivot = V(r.pivot); cal.sweepDeg = r.sweepDeg;
|
|||
|
|
if (r.tipRadius > 0f) cal.tipRadius = r.tipRadius;
|
|||
|
|
cal.source = "manual #850 가로 베기 " + System.DateTime.Now.ToString("yyyy-MM-dd HH:mm") + " (WL850_SwordArc · 이전 " + before + ")";
|
|||
|
|
sb.Append(r.classId).Append(' ').Append(r.clipName).Append(" ← 가로 n=").Append(n.ToString("F2")).Append(" start=").Append(cal.startDir.ToString("F2")).Append(" pivot=").Append(cal.pivot.ToString("F2")).Append(" sweep=").Append(r.sweepDeg).Append(" tipR=").Append(cal.tipRadius.ToString("F2")).Append('\n');
|
|||
|
|
}
|
|||
|
|
// 직업 오버라이드(#850 새 필드 — 컴파일 전이면 건너뛴다)
|
|||
|
|
var so = new SerializedObject(st);
|
|||
|
|
var arr = so.FindProperty("classOverrides");
|
|||
|
|
foreach (var o in spec.classOverrides)
|
|||
|
|
{
|
|||
|
|
bool found = false;
|
|||
|
|
for (int i = 0; arr != null && i < arr.arraySize; i++)
|
|||
|
|
{
|
|||
|
|
var el = arr.GetArrayElementAtIndex(i);
|
|||
|
|
if (el.FindPropertyRelative("classId").intValue != o.classId) continue;
|
|||
|
|
found = true;
|
|||
|
|
var pf = el.FindPropertyRelative("arcFitBlade"); var pm = el.FindPropertyRelative("arcSizeMul");
|
|||
|
|
if (pf == null || pm == null) { sb.Append("직업 ").Append(o.classId).Append(" 오버라이드 필드 없음(컴파일 전)\n"); break; }
|
|||
|
|
pf.boolValue = o.arcFitBlade; pm.floatValue = o.arcSizeMul;
|
|||
|
|
sb.Append("직업 ").Append(o.classId).Append(" arcFitBlade=").Append(o.arcFitBlade).Append(" arcSizeMul=").Append(o.arcSizeMul).Append('\n');
|
|||
|
|
}
|
|||
|
|
if (!found) sb.Append("직업 ").Append(o.classId).Append(" 오버라이드 행 없음\n");
|
|||
|
|
}
|
|||
|
|
so.ApplyModifiedPropertiesWithoutUndo();
|
|||
|
|
EditorUtility.SetDirty(st); AssetDatabase.SaveAssets();
|
|||
|
|
return sb.ToString();
|
|||
|
|
}
|
|||
|
|
}
|