using UnityEngine; [RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))] public class ArrowRangeUI : MonoBehaviour { // 🚨 수정됨: 끝부분의 \ 기호를 모두 삭제했습니다. [Header("--- 참조 ---")] [SerializeField] private PlayerAttack attackScript; // PlayerAttack 스크립트 연결 [Header("--- UI 설정 ---")] [Tooltip("사거리 표시기의 색상")] [SerializeField] private Color uiColor = new Color(1f, 1f, 0f, 0.5f); // 노란색 반투명 [Tooltip("화살표 UI의 폭 (두께)")] [SerializeField] private float lineWidth = 1.0f; [Header("--- 길이 설정 ---")] [Tooltip("차징 0%일 때의 최소 길이 (기본 사거리)")] [SerializeField] private float minLength = 5f; [Tooltip("풀차징일 때의 최대 길이 (최대 사거리)")] [SerializeField] private float maxLength = 20f; private Mesh _mesh; private MeshFilter _meshFilter; private MeshRenderer _meshRenderer; private void Awake() { // 메쉬 초기화 _mesh = new Mesh(); _meshFilter = GetComponent(); _meshRenderer = GetComponent(); _meshFilter.mesh = _mesh; // 재질(Material)이 없다면 임시로 생성 if (_meshRenderer.material == null) { _meshRenderer.material = new Material(Shader.Find("Sprites/Default")); } _meshRenderer.material.color = uiColor; } private void Update() { // 1. 공격 스크립트가 없거나 차징 중이 아니면 끄기 if (attackScript == null || !attackScript.IsCharging) { _meshRenderer.enabled = false; return; } _meshRenderer.enabled = true; // 2. 차징 진행도(0.0 ~ 1.0) 가져오기 float progress = attackScript.ChargeProgress; // 3. 진행도에 따라 길이 계산 (Lerp로 부드럽게 늘어남) float currentLength = Mathf.Lerp(minLength, maxLength, progress); // 4. 직사각형 메쉬 그리기 CreateRectangleMesh(currentLength, lineWidth); } // 직사각형 메쉬 생성 함수 private void CreateRectangleMesh(float length, float width) { Vector3[] vertices = new Vector3[4]; int[] triangles = new int[6]; Vector2[] uvs = new Vector2[4]; float halfWidth = width / 2f; // 정점 4개 정의 (플레이어 발밑 기준 앞으로 뻗어나감) vertices[0] = new Vector3(-halfWidth, 0.1f, 0); vertices[1] = new Vector3(halfWidth, 0.1f, 0); vertices[2] = new Vector3(-halfWidth, 0.1f, length); vertices[3] = new Vector3(halfWidth, 0.1f, length); // 삼각형 연결 triangles[0] = 0; triangles[1] = 2; triangles[2] = 1; triangles[3] = 2; triangles[4] = 3; triangles[5] = 1; // UV 매핑 uvs[0] = new Vector2(0, 0); uvs[1] = new Vector2(1, 0); uvs[2] = new Vector2(0, 1); uvs[3] = new Vector2(1, 1); // 메쉬 적용 _mesh.Clear(); _mesh.vertices = vertices; _mesh.triangles = triangles; _mesh.uv = uvs; _mesh.RecalculateNormals(); _mesh.RecalculateBounds(); } }