// WL785_Tune.cs — #785 리본 룩 실시간 튜닝 (Play 중 사용 · 에셋 인스턴스 메모리 수정) // unity command run_script --file AgentScripts/WL785_Tune.cs --entry WL785_Tune.Set \ // --args '[intensity, headAlpha, midAlpha, edgeSoft, tailSoft, life, hold]' // unity command run_script --file AgentScripts/WL785_Tune.cs --entry WL785_Tune.Show // // 왜 별도 스크립트인가: WL785_Setup 은 Play 중이면 중단하도록 막아 뒀다(에셋 집행용). // 이건 "보면서 값을 고르는" 용도라 Play 중에만 의미가 있다. 고른 값은 Play 를 멈춘 뒤 // WL785_Setup.ApplySettings 의 기본값에 반영해 디스크에 굽는다(SOT 는 에셋 · C45). using System.Text; using UnityEditor; using UnityEngine; public static class WL785_Tune { const string MatPath = "Assets/WL/Combat/Materials/M_WL_BladeRibbon.mat"; public static object Set(float intensity, float headAlpha, float midAlpha, float edgeSoft, float tailSoft, float life, float hold) { var s = WL.Combat.SlashTrailSettings.Instance; if (s == null) return "SlashTrailSettings.Instance null (Play 중이어야 한다)"; s.colorIntensity = intensity; s.fadeSeconds = life; s.fadeHoldRatio = hold; var g = new Gradient(); g.SetKeys( new[] { new GradientColorKey(new Color(0.42f, 0.16f, 0.90f), 0.00f), new GradientColorKey(new Color(0.20f, 0.45f, 1.00f), 0.32f), new GradientColorKey(new Color(1.00f, 0.52f, 0.14f), 0.72f), new GradientColorKey(new Color(1.00f, 0.85f, 0.42f), 1.00f), }, new[] { new GradientAlphaKey(0.00f, 0.00f), new GradientAlphaKey(midAlpha, 0.28f), new GradientAlphaKey(headAlpha, 0.70f), new GradientAlphaKey(headAlpha, 1.00f), }); s.gradientAlongSwing = g; var mat = s.materialAdditive != null ? s.materialAdditive : AssetDatabase.LoadAssetAtPath(MatPath); if (mat != null) { mat.SetFloat("_EdgeSoftness", edgeSoft); mat.SetFloat("_TailSoftness", tailSoft); } return Show(); } /// /// 색 축 비중과 알파 곡선을 함께 조정한다. /// bladeW 가 0.5 면 잔상축(꼬리 보라)과 칼날축(안쪽 주황)을 반반 섞는데, /// 보라와 노랑을 반반 섞으면 회색이 된다(실측 — 리본이 흰색으로 보이던 원인). /// 그래서 칼날축을 주(0.75~1.0)로 두고 잔상축은 꼬리 색조만 얹는 쪽이 참고 이미지에 가깝다. /// public static object Look(float intensity, float bladeW, float aMid, float aHead, float edgeSoft, float tailSoft, float hold) { var s = WL.Combat.SlashTrailSettings.Instance; if (s == null) return "settings null"; s.colorIntensity = intensity; s.bladeGradientWeight = bladeW; s.fadeHoldRatio = hold; var g = new Gradient(); g.SetKeys( new[] { new GradientColorKey(new Color(0.42f, 0.16f, 0.90f), 0.00f), new GradientColorKey(new Color(0.20f, 0.45f, 1.00f), 0.32f), new GradientColorKey(new Color(1.00f, 0.52f, 0.14f), 0.72f), new GradientColorKey(new Color(1.00f, 0.85f, 0.42f), 1.00f), }, new[] { new GradientAlphaKey(0.00f, 0.00f), new GradientAlphaKey(aMid, 0.18f), new GradientAlphaKey(aHead, 0.55f), new GradientAlphaKey(aHead, 1.00f), }); s.gradientAlongSwing = g; var mat = s.materialAdditive; if (mat != null) { mat.SetFloat("_EdgeSoftness", edgeSoft); mat.SetFloat("_TailSoftness", tailSoft); mat.SetFloat("_Intensity", 1f); } return Show(); } /// 블렌드 모드만 바꾼다. 1/10 = 프리멀티 알파, 1/1 = 순수 가산. public static object Blend(int src, int dst) { var s = WL.Combat.SlashTrailSettings.Instance; var mat = s != null && s.materialAdditive != null ? s.materialAdditive : AssetDatabase.LoadAssetAtPath(MatPath); if (mat == null) return "material null"; mat.SetFloat("_SrcBlend", src); mat.SetFloat("_DstBlend", dst); return "blend src=" + src + " dst=" + dst; } public static object Show() { var s = WL.Combat.SlashTrailSettings.Instance; if (s == null) return "settings null"; var mat = s.materialAdditive; var sb = new StringBuilder(); sb.AppendLine("intensity=" + s.colorIntensity + " life=" + s.fadeSeconds + " hold=" + s.fadeHoldRatio + " bladeW=" + s.bladeGradientWeight + " width=" + s.widthScale + " tailW=" + s.tailWidthRatio); if (mat != null) sb.AppendLine("mat edge=" + mat.GetFloat("_EdgeSoftness") + " head=" + mat.GetFloat("_HeadSoftness") + " tail=" + mat.GetFloat("_TailSoftness") + " intens=" + mat.GetFloat("_Intensity") + " src=" + mat.GetFloat("_SrcBlend") + " dst=" + mat.GetFloat("_DstBlend")); for (float t = 0f; t <= 1.001f; t += 0.25f) sb.AppendLine(" swing t=" + t.ToString("0.00") + " -> " + s.gradientAlongSwing.Evaluate(t)); return sb.ToString(); } }