Projext/Assets/5.TestScript/CrossHairUI.cs

77 lines
2.7 KiB
C#
Raw Normal View History

2026-01-29 06:58:38 +00:00
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<MeshFilter>();
_meshRenderer = GetComponent<MeshRenderer>();
_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(); // 빛 반사를 위해 법선 벡터 재계산
}
}