101 lines
3.2 KiB
C#
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();
|
|
}
|
|
} |