115 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			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;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 	}
 | |
| }
 |