Project_WL/AgentScripts/WL785_Tune.cs

125 lines
5.5 KiB
C#

// 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<Material>(MatPath);
if (mat != null)
{
mat.SetFloat("_EdgeSoftness", edgeSoft);
mat.SetFloat("_TailSoftness", tailSoft);
}
return Show();
}
/// <summary>
/// 색 축 비중과 알파 곡선을 함께 조정한다.
/// bladeW 가 0.5 면 잔상축(꼬리 보라)과 칼날축(안쪽 주황)을 반반 섞는데,
/// 보라와 노랑을 반반 섞으면 회색이 된다(실측 — 리본이 흰색으로 보이던 원인).
/// 그래서 칼날축을 주(0.75~1.0)로 두고 잔상축은 꼬리 색조만 얹는 쪽이 참고 이미지에 가깝다.
/// </summary>
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();
}
/// <summary>블렌드 모드만 바꾼다. 1/10 = 프리멀티 알파, 1/1 = 순수 가산.</summary>
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<Material>(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();
}
}