using UnityEngine; [RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))] public class PureUnityFan : MonoBehaviour { [Header("--- 참조 ---")] [SerializeField] private PlayerAttack attackScript; [SerializeField] private PlayerInteraction interaction; [Header("--- 부채꼴 설정 ---")] [SerializeField] private float radius = 5f; [SerializeField] private int segments = 40; [SerializeField] private Color fanColor = new Color(1f, 0.9f, 0f, 0.4f); [Tooltip("풀차징 시에도 유지할 최소 부채꼴 각도 (너무 얇으면 안 보일 수 있음)")] [SerializeField] private float minAngle = 2f; // ⭐ [추가] 최소 두께 설정 private Mesh _mesh; private MeshFilter _meshFilter; private MeshRenderer _meshRenderer; private void Awake() { _mesh = new Mesh(); _meshFilter = GetComponent(); _meshRenderer = GetComponent(); _meshFilter.mesh = _mesh; _meshRenderer.material.color = fanColor; } private void Update() { // 1. 참조 확인 및 예외 처리 if (attackScript == null || interaction == null) return; if (!attackScript.IsCharging || interaction.CurrentWeapon == null) { _meshRenderer.enabled = false; return; } _meshRenderer.enabled = true; // 2. 점진적 보간(Lerp)을 통한 부드러운 정확도 계산 float progress = attackScript.ChargeProgress; // 0.0 ~ 1.0 float smoothSpread; var config = interaction.CurrentWeapon.Config; float s1 = config.GetSpread(1); // 시작 정확도 float s2 = config.GetSpread(2); // 중간 정확도 float s3 = config.GetSpread(3); // 최종 정확도 (0) if (progress < 0.5f) { smoothSpread = Mathf.Lerp(s1, s2, progress * 2f); } else { smoothSpread = Mathf.Lerp(s2, s3, (progress - 0.5f) * 2f); } // 3. ⭐ [핵심 수정] 계산된 각도가 설정한 최소 각도보다 작아지지 않도록 제한 // (WeaponConfig에서 0을 반환하더라도, UI는 최소 minAngle만큼은 유지함) float targetAngle = Mathf.Max(smoothSpread * 2f, minAngle); CreateFanMesh(targetAngle); } private void CreateFanMesh(float angle) { // 메쉬 생성 로직 (기존과 동일) int vertexCount = segments + 2; Vector3[] vertices = new Vector3[vertexCount]; int[] triangles = new int[segments * 3]; vertices[0] = Vector3.zero; float halfAngle = angle / 2f; for (int i = 0; i <= segments; i++) { float currAngle = Mathf.Lerp(-halfAngle, halfAngle, (float)i / segments); float rad = currAngle * Mathf.Deg2Rad; vertices[i + 1] = new Vector3(Mathf.Sin(rad), 0, Mathf.Cos(rad)) * radius; if (i < segments) { triangles[i * 3] = 0; triangles[i * 3 + 1] = i + 1; triangles[i * 3 + 2] = i + 2; } } _mesh.Clear(); _mesh.vertices = vertices; _mesh.triangles = triangles; _mesh.RecalculateNormals(); } }