타워 공격 시 공격 시점 및 대상을 알 수 있는 이펙트 추가(임시)

This commit is contained in:
2026-02-16 09:52:49 +09:00
parent 5bb8cd533e
commit 225b076b62

View File

@@ -1,3 +1,4 @@
using System.Collections;
using Unity.Netcode;
using UnityEngine;
@@ -12,6 +13,20 @@ namespace Northbound
[Tooltip("탐지할 레이어")]
public LayerMask targetLayer = ~0;
[Header("Beam Effect")]
[Tooltip("빔 효과 LineRenderer 프리팹 (없으면 자동 생성)")]
public LineRenderer beamPrefab;
[Tooltip("빔 색상")]
public Color beamColor = Color.red;
[Tooltip("빔 시작 너비")]
public float beamStartWidth = 0.1f;
[Tooltip("빔 끝 너비")]
public float beamEndWidth = 0.05f;
[Tooltip("빔 표시 시간")]
public float beamDuration = 0.15f;
[Tooltip("빔 발사 위치 (null이면 건물 중심)")]
public Transform firePoint;
[Header("Debug")]
[Tooltip("디버그 정보 표시")]
public bool showDebugInfo = true;
@@ -19,6 +34,8 @@ namespace Northbound
private Building _building;
private ITeamMember _teamMember;
private float _lastAttackTime;
private LineRenderer _beamRenderer;
private Coroutine _beamCoroutine;
private void Awake()
{
@@ -128,9 +145,16 @@ namespace Northbound
if (damageable != null)
{
// 빔 시작점 계산
Vector3 beamStart = firePoint != null ? firePoint.position : transform.position + Vector3.up * 2f;
Vector3 beamEnd = closestEnemy.transform.position + Vector3.up * 1f; // 타겟 중앙
damageable.TakeDamage(attackDamage, NetworkObjectId);
_lastAttackTime = Time.time;
// 모든 클라이언트에 빔 효과 표시
ShowAttackBeamClientRpc(beamStart, beamEnd);
var targetTeam = closestEnemy.GetComponent<ITeamMember>() ??
closestEnemy.GetComponentInParent<ITeamMember>() ??
closestEnemy.GetComponentInChildren<ITeamMember>();
@@ -148,6 +172,69 @@ namespace Northbound
}
}
#region Beam Effect
/// <summary>
/// 빔 효과를 모든 클라이언트에 표시
/// </summary>
[ClientRpc]
private void ShowAttackBeamClientRpc(Vector3 start, Vector3 end)
{
if (_beamCoroutine != null)
{
StopCoroutine(_beamCoroutine);
}
_beamCoroutine = StartCoroutine(ShowBeamCoroutine(start, end));
}
private IEnumerator ShowBeamCoroutine(Vector3 start, Vector3 end)
{
// LineRenderer 초기화
if (_beamRenderer == null)
{
InitializeBeamRenderer();
}
if (_beamRenderer != null)
{
_beamRenderer.enabled = true;
_beamRenderer.SetPosition(0, start);
_beamRenderer.SetPosition(1, end);
yield return new WaitForSeconds(beamDuration);
_beamRenderer.enabled = false;
}
}
private void InitializeBeamRenderer()
{
if (beamPrefab != null)
{
// 프리팹 사용
GameObject beamObj = Instantiate(beamPrefab.gameObject, transform);
_beamRenderer = beamObj.GetComponent<LineRenderer>();
}
else
{
// 자동 생성
GameObject beamObj = new GameObject("AttackBeam");
beamObj.transform.SetParent(transform);
_beamRenderer = beamObj.AddComponent<LineRenderer>();
// 기본 설정
_beamRenderer.positionCount = 2;
_beamRenderer.startWidth = beamStartWidth;
_beamRenderer.endWidth = beamEndWidth;
_beamRenderer.material = new Material(Shader.Find("Sprites/Default"));
_beamRenderer.startColor = beamColor;
_beamRenderer.endColor = beamColor;
_beamRenderer.enabled = false;
}
}
#endregion
private void OnDrawGizmos()
{
if (_building == null || _building.buildingData == null) return;