77 lines
2.7 KiB
C#
77 lines
2.7 KiB
C#
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(); // 빛 반사를 위해 법선 벡터 재계산
|
|
}
|
|
} |