Projext/Assets/Scripts/UI/HUD/CrossHairUI.cs

101 lines
3.2 KiB
C#

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<MeshFilter>();
_meshRenderer = GetComponent<MeshRenderer>();
_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();
}
}