diff options
author | Jakob Stendahl <jakob.stendahl@outlook.com> | 2017-10-06 16:04:38 +0200 |
---|---|---|
committer | Jakob Stendahl <jakob.stendahl@outlook.com> | 2017-10-06 16:04:38 +0200 |
commit | e13fd4cf1fc0ad9eff857295fd5abc15ab01462c (patch) | |
tree | 91786e1557ef801a64e059857dc0ad71c1d281df /td/Assets/Scripts/tower.cs | |
parent | c5a786326fab8850342005a1eb4da9653c4642c8 (diff) | |
download | TD-e13fd4cf1fc0ad9eff857295fd5abc15ab01462c.tar.gz TD-e13fd4cf1fc0ad9eff857295fd5abc15ab01462c.zip |
Startet på tårn, fiksa dev-mode, laga stats UI
Diffstat (limited to 'td/Assets/Scripts/tower.cs')
-rw-r--r-- | td/Assets/Scripts/tower.cs | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/td/Assets/Scripts/tower.cs b/td/Assets/Scripts/tower.cs new file mode 100644 index 0000000..0c812b2 --- /dev/null +++ b/td/Assets/Scripts/tower.cs @@ -0,0 +1,137 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class tower : MonoBehaviour { + + [Header("Attributes")] + public int towerPrice; // The price of the tower, set this in the desiger (tower prefab) + public float fireRate; // How long the turret should use to reload, Set in designer (tower prefab) + public float turnSpeed; // How fast the turret should rotate. Set in designer (tower prefab) + [Range(0, 10)] + public float towerRange; // How large the range of the tower is. this is the diameter. Set in designer (tower prefab) + [Header("Materials")] + public Material materialDanger; // The material used when tower can't be placed, set in the designer (tower prefab) + public Material materialSuccess; // The material used when the tower can be placed, or is selected, set in the designer (tower prefab) + [Header("Scripting vars")] + public player player; // Reference to the player object, should be set when instantiating + + private GameObject placementIndicator; // The placement indicator + private Renderer placementIndicatorRenderer; // The renderer of the placement indicator + private Plane groundPlane; // Plane used for raycasting when placing tower + private float groundYpoint = 0.525f; // What Y-position the Tower should be placed on, this should be constant in every use-case. + private bool towerPlaced; // Bool used to descide what to do this frame + private bool colliding; // Set if the tower collides with any GameObject, used when placing, to see where it can be placed + + private Transform target; + private float fireCountdown; + + void Start () { + placementIndicator = transform.GetChild (0).gameObject; + placementIndicatorRenderer = placementIndicator.GetComponent<Renderer> (); + placementIndicator.transform.localScale = new Vector3 (towerRange*7, 0.00000001f, towerRange*7); + + groundPlane = new Plane (Vector3.up, new Vector3(0f, groundYpoint, 0f)); + } + + void Update () { + + #region placeTower + if (!towerPlaced) { + if (Input.touchCount == 1 || Input.GetMouseButton (0)) { + + /* Activate indicator if not already */ + if (!placementIndicator.activeSelf) { placementIndicator.SetActive (true); } + /* Change indicator-color based on placement */ + if (!colliding) { placementIndicatorRenderer.sharedMaterial = materialDanger; } + else { placementIndicatorRenderer.sharedMaterial = materialSuccess; } + /* Calculate new position */ + Ray touchRay = Camera.main.ScreenPointToRay (Input.mousePosition); + float rayDistance; + if (groundPlane.Raycast (touchRay, out rayDistance)) { + transform.position = touchRay.GetPoint (rayDistance); + } + + } else { + + /* User let go of the screen, decide if tower can be placed */ + if (!colliding) { Destroy (gameObject); } // Skal kollidere for å være på et godkjent område + else { + towerPlaced = true; + player.moneySubtract (towerPrice); + placementIndicator.SetActive (false); + placementIndicatorRenderer.sharedMaterial = materialSuccess; + InvokeRepeating ("updateTarget", 0f, 0.5f); // This starts the + gameObject.GetComponent <BoxCollider>().enabled = false; + } + + } + + return; + } + #endregion + + // Stop rest of update if no target is aquired + if (target == null) { + return; + } + // Target lockon + Vector3 direction = target.position - transform.position; + Quaternion lookRotation = Quaternion.LookRotation (direction); + Vector3 rotation = Quaternion.Lerp (transform.rotation, lookRotation, Time.deltaTime * turnSpeed).eulerAngles; + transform.rotation = Quaternion.Euler (0f, rotation.y, 0f); + + if (fireCountdown <= 0f) { + // FAIAAAAA + fireCountdown = 1f / fireRate; + } + + fireCountdown -= Time.deltaTime; + + + } + + void updateTarget() { + /* Method that updates the currentTarget. + * The target will be set to the nearest in range */ + GameObject[] enemies = GameObject.FindGameObjectsWithTag ("enemy"); + float shortestDistance = Mathf.Infinity; + GameObject nearestEnemy = null; + + foreach (var enemy in enemies) { + float distanceToEnemy = Vector3.Distance (transform.position, enemy.transform.position); + if (distanceToEnemy < shortestDistance) { + shortestDistance = distanceToEnemy; + nearestEnemy = enemy; + } + } + + if (nearestEnemy != null && shortestDistance <= towerRange) { + Debug.Log ("Target aquired"); + target = nearestEnemy.transform; + } else { + target = null; + } + } + + void OnTriggerEnter(Collider other) { + colliding = true; + } + + void OnTriggerStay(Collider other) { + colliding = true; + } + + void OnTriggerExit(Collider other) { + colliding = false; + } + + void OnDrawGizmosSelected() { + /* Show gizmos in designer */ + Gizmos.color = Color.red; + Gizmos.DrawWireSphere (transform.position, towerRange); + } + +} + + |