타워 공격 시 공격 시점 및 대상을 알 수 있는 이펙트 추가(임시)
This commit is contained in:
@@ -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,8 +145,15 @@ 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>() ??
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user