2025-09-24 11:24:38 +05:00

115 lines
2.3 KiB
C#

using Fusion;
using UnityEngine;
namespace TPSBR
{
public class Target : NetworkBehaviour, IHitTarget
{
public Color ActiveColor = Color.green;
public Color HitColor = Color.green;
public Color InactiveColor = Color.gray;
public float TimeToActive = 3;
public float Speed;
public float Range;
[SerializeField]
private Transform _hitIndicatorPivot;
[SerializeField]
private float _maxHealth = 100f;
[Networked]
public TickTimer CooldownActive { get; set; }
[Networked]
public TickTimer CooldownInnactive { get; set; }
[Networked]
public float Velocity { get; set; }
[Networked]
public float Health { get; set; }
private Renderer[] _renderers;
private Vector3 _originalPosition;
public override void Spawned()
{
_renderers = GetComponentsInChildren<Renderer>();
SetColor(ActiveColor);
Velocity = Speed;
Health = _maxHealth;
_originalPosition = transform.position;
Runner.SetIsSimulated(Object, true);
}
public override void FixedUpdateNetwork()
{
if (CooldownActive.ExpiredOrNotRunning(Runner))
{
SetColor(ActiveColor);
}
else if (CooldownInnactive.ExpiredOrNotRunning(Runner))
{
SetColor(InactiveColor);
Health = _maxHealth;
}
else
{
SetColor(HitColor);
}
if (HasStateAuthority == true)
{
var position = transform.position;
position.z += Velocity * Runner.DeltaTime;
var distance = position.z - _originalPosition.z;
if (Mathf.Abs(distance) > Range)
{
position.z = Mathf.Clamp(position.z, _originalPosition.z - Range, _originalPosition.z + Range);
Velocity = -Velocity;
}
transform.position = position;
}
}
Transform IHitTarget.HitPivot => _hitIndicatorPivot != null ? _hitIndicatorPivot : transform;
void IHitTarget.ProcessHit(ref HitData hitData)
{
if (CooldownActive.ExpiredOrNotRunning(Runner) == false)
{
hitData.Amount = 0;
return;
}
float damage = Mathf.Min(hitData.Amount, Health);
Health -= damage;
hitData.Amount = damage;
if (Health <= 0)
{
Health = 0;
hitData.IsFatal = true;
CooldownActive = TickTimer.CreateFromSeconds(Runner, 1 + TimeToActive);
CooldownInnactive = TickTimer.CreateFromSeconds(Runner, 1);
}
}
private void SetColor(Color color)
{
foreach (var r in _renderers)
{
r.material.color = color;
}
}
}
}