aboutsummaryrefslogtreecommitdiff
path: root/td/Assets/Scripts/tower.cs
diff options
context:
space:
mode:
authorJakob Stendahl <jakob.stendahl@outlook.com>2017-10-06 16:04:38 +0200
committerJakob Stendahl <jakob.stendahl@outlook.com>2017-10-06 16:04:38 +0200
commite13fd4cf1fc0ad9eff857295fd5abc15ab01462c (patch)
tree91786e1557ef801a64e059857dc0ad71c1d281df /td/Assets/Scripts/tower.cs
parentc5a786326fab8850342005a1eb4da9653c4642c8 (diff)
downloadTD-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.cs137
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);
+ }
+
+}
+
+