Skip to content
Snippets Groups Projects
Tower.cs 1.91 KiB
Newer Older
  • Learn to ignore specific revisions
  • using UnityEngine;
    
    namespace Presentation.World {
    
    [RequireComponent(typeof(LineRenderer))]
    
    public class Tower : Structure {
    
    	[SerializeField]
    	private Transform rotatingTurret;
    
    
    	private Logic.Data.World.Tower _data;
    
    
    	[SerializeField]
    	private SpriteRenderer backgroundSprite;
    
    	[SerializeField]
    	private SpriteRenderer constantSprite;
    
    	[SerializeField]
    	private SpriteRenderer coloredSprite;
    
    	[SerializeField]
    	private float turretRotationSpeed;
    
    
    	private World _world;
    
    	private void FixedUpdate() {
    
    		if (_data.Type.Range > 0) {
    			Logic.Data.World.Unit logicTarget = _data.Target ?? _data.ClosestEnemy;
    			if (logicTarget != null) RotateTurret(logicTarget);
    
    	public void SetData(Logic.Data.World.Tower data) {
    		_data = data;
    
    		var type = (TowerTypeData) data.Type;
    
    		Color color = _data.OwnerColor == Logic.Data.Color.Blue ? type.BlueColor : type.RedColor;
    		backgroundSprite.sprite = type.SpriteBackground;
    		constantSprite.sprite = type.SpriteConstant;
    		coloredSprite.sprite = type.SpriteColored;
    		coloredSprite.color = color;
    
    		_world = FindObjectOfType<World>();
    
    		var laserRenderer = GetComponent<LineRenderer>();
    		var laserGradient = new Gradient();
    
    		laserGradient.SetKeys(new[] { new GradientColorKey(color, 0), new GradientColorKey(color, 1) },
    			new[] { new GradientAlphaKey(1, 0), new GradientAlphaKey(1, 1) });
    		laserRenderer.colorGradient = laserGradient;
    
    	public void DestroyTower() {
    		Destroy(gameObject);
    	}
    
    
    	private void RotateTurret(Logic.Data.World.Unit logicTarget) {
    		Vector3 target = _world.LogicToPresentation(logicTarget).transform.position;
    		Vector3 direction = (target - rotatingTurret.position).normalized;
    		float angle = Mathf.Rad2Deg * Mathf.Atan2(direction.y, direction.x);
    		Quaternion desired = Quaternion.AngleAxis(angle - 90, Vector3.forward);
    		rotatingTurret.rotation = Quaternion.RotateTowards(rotatingTurret.rotation, desired,
    			Time.fixedDeltaTime * turretRotationSpeed);
    	}