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

101 lines
3.2 KiB
C#
Raw Normal View History

2026-01-29 06:58:38 +00:00
using UnityEngine;
[RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))]
2026-02-06 09:27:08 +00:00
public class ArrowRangeUI : MonoBehaviour
2026-01-29 06:58:38 +00:00
{
2026-02-06 09:27:08 +00:00
// 🚨 수정됨: 끝부분의 \ 기호를 모두 삭제했습니다.
2026-01-29 06:58:38 +00:00
[Header("--- 참조 ---")]
2026-02-06 09:27:08 +00:00
[SerializeField] private PlayerAttack attackScript; // PlayerAttack 스크립트 연결
2026-01-29 06:58:38 +00:00
2026-02-06 09:27:08 +00:00
[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;
2026-01-29 06:58:38 +00:00
private Mesh _mesh;
private MeshFilter _meshFilter;
private MeshRenderer _meshRenderer;
private void Awake()
{
2026-02-06 09:27:08 +00:00
// 메쉬 초기화
2026-01-29 06:58:38 +00:00
_mesh = new Mesh();
_meshFilter = GetComponent<MeshFilter>();
_meshRenderer = GetComponent<MeshRenderer>();
_meshFilter.mesh = _mesh;
2026-02-06 09:27:08 +00:00
// 재질(Material)이 없다면 임시로 생성
if (_meshRenderer.material == null)
{
_meshRenderer.material = new Material(Shader.Find("Sprites/Default"));
}
_meshRenderer.material.color = uiColor;
2026-01-29 06:58:38 +00:00
}
private void Update()
{
2026-02-06 09:27:08 +00:00
// 1. 공격 스크립트가 없거나 차징 중이 아니면 끄기
if (attackScript == null || !attackScript.IsCharging)
2026-01-29 06:58:38 +00:00
{
_meshRenderer.enabled = false;
return;
}
_meshRenderer.enabled = true;
2026-02-06 09:27:08 +00:00
// 2. 차징 진행도(0.0 ~ 1.0) 가져오기
float progress = attackScript.ChargeProgress;
2026-02-06 09:27:08 +00:00
// 3. 진행도에 따라 길이 계산 (Lerp로 부드럽게 늘어남)
float currentLength = Mathf.Lerp(minLength, maxLength, progress);
2026-01-29 06:58:38 +00:00
2026-02-06 09:27:08 +00:00
// 4. 직사각형 메쉬 그리기
CreateRectangleMesh(currentLength, lineWidth);
2026-01-29 06:58:38 +00:00
}
2026-02-06 09:27:08 +00:00
// 직사각형 메쉬 생성 함수
private void CreateRectangleMesh(float length, float width)
2026-01-29 06:58:38 +00:00
{
2026-02-06 09:27:08 +00:00
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);
// 메쉬 적용
2026-01-29 06:58:38 +00:00
_mesh.Clear();
_mesh.vertices = vertices;
_mesh.triangles = triangles;
2026-02-06 09:27:08 +00:00
_mesh.uv = uvs;
_mesh.RecalculateNormals();
2026-02-06 09:27:08 +00:00
_mesh.RecalculateBounds();
2026-01-29 06:58:38 +00:00
}
}