using UnityEngine; // ⭐ 이 코드가 있으면 스크립트를 붙일 때 컴포넌트 2개가 자동으로 추가됩니다! [RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))] public class PureUnityFan : MonoBehaviour { [Header("--- 참조 ---")] [SerializeField] private PlayerAttack attackScript; // PlayerAttack 스크립트 연결 [Header("--- 부채꼴 설정 ---")] [SerializeField] private float radius = 5f; // 부채꼴의 길이 (반지름) [SerializeField] private int segments = 40; // 부드러움 정도 (높을수록 세련됨) [SerializeField] private Color fanColor = new Color(1f, 0.9f, 0f, 0.4f); // 노란색 반투명 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 || !attackScript.IsCharging) { _meshRenderer.enabled = false; return; } _meshRenderer.enabled = true; // 2. 차징 진행도에 따라 각도를 좁힙니다. (시작 60도 -> 풀차징 5도) float currentAngle = Mathf.Lerp(60f, 5f, attackScript.ChargeProgress); // 3. 실시간으로 메쉬(도형)를 새로 그립니다. CreateFanMesh(currentAngle); } 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(); // 빛 반사를 위해 법선 벡터 재계산 } }