Quantcast
Channel: Questions in topic: "enemy"
Viewing all articles
Browse latest Browse all 1488

My Tower is acting weird (shooting at one enemy, killing different enemy)

$
0
0
Can someone tell me what's wrong here? It looks like my tower is shooting at one enemy, but killing a random enemy on hit. I believe it has something to do with the UpdateRange function. The code about targeting is more or less copied from Brackey's tower defense tutorial. The rest of the code I'm sure is a mess as well, but everything else is working for now. Video to see what's going on: https://youtu.be/maeDYNTvamA Script: using UnityEngine; public class TowerHandler : MonoBehaviour { [Header("Attributes")] public float attackSpeed = 1f; public float range; private float fireCountdown = 0f; [Header("Unity Setup")] public Transform enemyTarget; public GameObject[] attackPrefabs; public Transform firePoint; public GameObject rangeModel; public string enemyTag = "Enemy"; private void Start() { rangeModel = GameObject.FindGameObjectWithTag("Range"); rangeModel.SetActive(false); InvokeRepeating("UpdateTarget", 0f, 0.1f); } void UpdateTarget() { GameObject[] enemies = GameObject.FindGameObjectsWithTag(enemyTag); float shortestDistance = Mathf.Infinity; GameObject nearestEnemy = null; foreach (GameObject enemy in enemies) { float distanceToEnemy = Vector3.Distance(transform.position, enemy.transform.position); if (distanceToEnemy < shortestDistance) { shortestDistance = distanceToEnemy; nearestEnemy = enemy; } } if (nearestEnemy != null && shortestDistance <= range) { enemyTarget = nearestEnemy.transform; } else { enemyTarget = null; } } void Update() { if (enemyTarget == null) { return; } if (fireCountdown <= 0f) { Shoot(); fireCountdown = 1f / attackSpeed; } fireCountdown -= Time.deltaTime; } private void Shoot() { GameObject bulletGO = (GameObject)Instantiate(attackPrefabs[0], firePoint.position, firePoint.rotation); Bullet bullet = bulletGO.GetComponent(); if (bullet != null) { bullet.SeekEnemy(enemyTarget); } } } And here's the bullet-script: public class Bullet : MonoBehaviour { private Transform target; public GameObject impactEffect; // Byt ut denna beroende på vilken bullet-type/attacktyp det är. Träff-effekt GameObject player; GameObject enemy; EnemyBehavior enemyB; TowerAttributes towerAtt; public float playerDamage; public float speed = 70f; public void SeekEnemy (Transform _target) { target = _target; } private void Start() { player = GameObject.FindGameObjectWithTag("Player"); enemy = GameObject.FindGameObjectWithTag("Enemy"); enemyB = enemy.GetComponent(); towerAtt = player.GetComponent(); playerDamage = towerAtt.damage; } // Update is called once per frame void Update () { if(target == null) { Destroy(gameObject); return; } Vector3 dir = target.position - transform.position; float distanceThisFrame = speed * Time.deltaTime; if(dir.magnitude <= distanceThisFrame) { HitTarget(); return; } transform.Translate(dir.normalized * distanceThisFrame, Space.World); } private void HitTarget() { GameObject effectInstance = (GameObject)Instantiate(impactEffect, transform.position, transform.rotation); Destroy(effectInstance, 1f); Damage(); Destroy(gameObject); } void Damage() { Debug.Log("Damage!"); enemyB.TakeDamageFromPlayer(playerDamage); } }

Viewing all articles
Browse latest Browse all 1488

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>