using System.Collections;
using UnityEngine.UI;
using System.Collections.Generic;
public class Turret : MonoBehaviour {
private Transform target;
private Enemy targetEnemy;
[Header("General")]
public float range = 15f;
[Header("Use Bullets (default)")]
public GameObject bulletPrefab;
public float fireRate = 1f;
private float fireCountdown = 0f;
[Header("Use Laser")]
public bool useLaser = false;
public int damageOverTime = 30;
public float slowAmount = .5f;
public LineRenderer lineRenderer;
public ParticleSystem impactEffect;
public Light impactLight;
[Header("Unity Setup Fields")]
public string enemyTag = "Enemy";
public Transform partToRotate;
public float turnSpeed = 10f;
public Transform firePoint;
public GameObject musuh;
public GameObject img;
public Vector3 Offset;
public bool boel;
// Use this for initialization
void Start () {
InvokeRepeating("UpdateTarget", 0f, 0.5f);
}
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;
musuh = enemy;
}
}
if (nearestEnemy != null && shortestDistance <= range)
{
target = nearestEnemy.transform;
targetEnemy = nearestEnemy.GetComponent<Enemy>();
} else
{
target = null;
boel = false;
img.SetActive (false);
}
}
// Update is called once per frame
void Update () {
if (target == null)
{
if (useLaser)
{
if (lineRenderer.enabled)
{
lineRenderer.enabled = false;
impactEffect.Stop();
impactLight.enabled = false;
}
}
return;
}
LockOnTarget();
if (useLaser)
{
Laser();
} else
{
if (fireCountdown <= 0f)
{
Shoot();
fireCountdown = 1f / fireRate;
}
fireCountdown -= Time.deltaTime;
}
}
void LockOnTarget ()
{
Vector3 dir = target.position - transform.position;
Quaternion lookRotation = Quaternion.LookRotation(dir);
Vector3 rotation = Quaternion.Lerp(partToRotate.rotation, lookRotation, Time.deltaTime * turnSpeed).eulerAngles;
partToRotate.rotation = Quaternion.Euler(0f, rotation.y, 0f);
boel = true;
img.SetActive (true);
img.transform.position = Camera.main.WorldToScreenPoint(musuh.transform.position) + Offset;
}
void Laser ()
{
targetEnemy.TakeDamage(damageOverTime * Time.deltaTime);
targetEnemy.Slow(slowAmount);
if (!lineRenderer.enabled)
{
lineRenderer.enabled = true;
impactEffect.Play();
impactLight.enabled = true;
}
lineRenderer.SetPosition(0, firePoint.position);
lineRenderer.SetPosition(1, target.position);
Vector3 dir = firePoint.position - target.position;
impactEffect.transform.position = target.position + dir.normalized;
impactEffect.transform.rotation = Quaternion.LookRotation(dir);
}
void Shoot ()
{
GameObject bulletGO = (GameObject)Instantiate(bulletPrefab, firePoint.position, firePoint.rotation);
Bullet bullet = bulletGO.GetComponent<Bullet>();
if (bullet != null)
bullet.Seek(target);
}
void OnDrawGizmosSelected ()
{
Gizmos.color = Color.red;
Gizmos.DrawWireSphere(transform.position, range);
}
}
Ketergantungan pada script berikut:
Enemy
using UnityEngine;
using UnityEngine.UI;
public class Enemy : MonoBehaviour {
public float startSpeed = 10f;
[HideInInspector]
public float speed;
public float startHealth = 100;
private float health;
public int worth = 50;
public GameObject deathEffect;
[Header("Unity Stuff")]
public Image healthBar;
private bool isDead = false;
void Start ()
{
speed = startSpeed;
health = startHealth;
}
public void TakeDamage (float amount)
{
health -= amount;
healthBar.fillAmount = health / startHealth;
if (health <= 0 && !isDead)
{
Die();
}
}
public void Slow (float pct)
{
speed = startSpeed * (1f - pct);
}
void Die ()
{
isDead = true;
PlayerStats.Money += worth;
GameObject effect = (GameObject)Instantiate(deathEffect, transform.position, Quaternion.identity);
Destroy(effect, 5f);
WaveSpawner.EnemiesAlive--;
Destroy(gameObject);
}
}
Ketergantungan pada script berikut:
Bullet
private Transform target;
public float speed = 70f;
public int damage = 50;
public float explosionRadius = 0f;
public GameObject impactEffect;
public void Seek (Transform _target)
{
target = _target;
}
// 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);
transform.LookAt(target);
}
void HitTarget ()
{
GameObject effectIns = (GameObject)Instantiate(impactEffect, transform.position, transform.rotation);
Destroy(effectIns, 5f);
if (explosionRadius > 0f)
{
Explode();
} else
{
Damage(target);
}
Destroy(gameObject);
}
void Explode ()
{
Collider[] colliders = Physics.OverlapSphere(transform.position, explosionRadius);
foreach (Collider collider in colliders)
{
if (collider.tag == "Enemy")
{
Damage(collider.transform);
}
}
}
void Damage (Transform enemy)
{
Enemy e = enemy.GetComponent<Enemy>();
if (e != null)
{
e.TakeDamage(damage);
}
}
void OnDrawGizmosSelected ()
{
Gizmos.color = Color.red;
Gizmos.DrawWireSphere(transform.position, explosionRadius);
}
0 komentar:
Posting Komentar