Created
July 2, 2020 20:20
-
-
Save niiicolai/29e62370cfbedbfa3baf9e7da5e24316 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* Weapon.cs */ | |
using System.Collections; | |
using System.Collections.Generic; | |
using UnityEngine; | |
public class Weapon : MonoBehaviour | |
{ | |
[SerializeField] | |
private new ParticleSystem particleSystem; | |
[SerializeField] | |
private float damage; | |
[SerializeField] | |
private float fireRate; | |
private List<ParticleCollisionEvent> collisionEvents; | |
private string enemyTag; | |
private bool fireCooldown; | |
void Start() | |
{ | |
collisionEvents = new List<ParticleCollisionEvent>(); | |
} | |
void OnParticleCollision(GameObject other) | |
{ | |
ParticlePhysicsExtensions.GetCollisionEvents(particleSystem, other, collisionEvents); | |
for (int i = 0; i < collisionEvents.Count; i++) | |
{ | |
var collider = collisionEvents[i].colliderComponent; | |
if (collider.CompareTag(enemyTag)) | |
{ | |
var health = collider.GetComponent<HealthController>(); | |
health.ApplyDamage(damage); | |
} | |
} | |
} | |
public void Fire() | |
{ | |
if (fireCooldown) return; | |
fireCooldown = true; | |
particleSystem.Emit(1); | |
StartCoroutine(StopCooldownAfterTime()); | |
} | |
private IEnumerator StopCooldownAfterTime() | |
{ | |
yield return new WaitForSeconds(fireRate); | |
fireCooldown = false; | |
} | |
public void SetEnemyTag(string enemyTag) | |
{ | |
this.enemyTag = enemyTag; | |
} | |
} | |
/* WeaponController.cs */ | |
using UnityEngine; | |
public class WeaponController : MonoBehaviour | |
{ | |
[SerializeField] | |
private Weapon weapon; | |
[SerializeField] | |
private string enemyTag; | |
private bool fire; | |
void Start() | |
{ | |
weapon.SetEnemyTag(enemyTag); | |
} | |
void Update() | |
{ | |
if (Input.GetMouseButtonDown(0)) | |
{ | |
fire = true; | |
} | |
if (Input.GetMouseButtonUp(0)) | |
{ | |
fire = false; | |
} | |
if (fire) | |
{ | |
weapon.Fire(); | |
} | |
} | |
} | |
/* HealthController.cs */ | |
using System.Collections; | |
using System.Collections.Generic; | |
using UnityEngine; | |
using UnityEngine.UI; | |
public class HealthController : MonoBehaviour | |
{ | |
[SerializeField] | |
private float maxHealth; | |
private float currentHealth; | |
[SerializeField] | |
private float respawnTime; | |
[SerializeField] | |
private GameObject healthPanel; | |
[SerializeField] | |
private Text healthText; | |
[SerializeField] | |
private RectTransform healthBar; | |
private float healthBarStartWidth; | |
private MeshRenderer meshRenderer; | |
private bool isDead; | |
void Start() | |
{ | |
meshRenderer = GetComponent<MeshRenderer>(); | |
currentHealth = maxHealth; | |
healthBarStartWidth = healthBar.sizeDelta.x; | |
UpdateUI(); | |
} | |
public void ApplyDamage(float damage) | |
{ | |
if (isDead) return; | |
currentHealth -= damage; | |
if (currentHealth <= 0) | |
{ | |
currentHealth = 0; | |
isDead = true; | |
meshRenderer.enabled = false; | |
healthPanel.SetActive(false); | |
StartCoroutine(RespawnAfterTime()); | |
} | |
UpdateUI(); | |
} | |
private IEnumerator RespawnAfterTime() | |
{ | |
yield return new WaitForSeconds(respawnTime); | |
ResetHealth(); | |
} | |
private void ResetHealth() | |
{ | |
currentHealth = maxHealth; | |
isDead = false; | |
meshRenderer.enabled = true; | |
healthPanel.SetActive(true); | |
UpdateUI(); | |
} | |
private void UpdateUI() | |
{ | |
float percentOutOf = (currentHealth / maxHealth) * 100; | |
float newWidth = (percentOutOf / 100) * healthBarStartWidth; | |
healthBar.sizeDelta = new Vector2(newWidth, healthBar.sizeDelta.y); | |
healthText.text = currentHealth + "/" + maxHealth; | |
} | |
} | |
/* Movement.cs */ | |
using UnityEngine; | |
public class Movement : MonoBehaviour | |
{ | |
private Rigidbody rigidbody; | |
[SerializeField] | |
private float speed; | |
[SerializeField] | |
private ForceMode forceMode; | |
// Start is called before the first frame update | |
void Start() | |
{ | |
rigidbody = GetComponent<Rigidbody>(); | |
} | |
// Update is called once per frame | |
void Update() | |
{ | |
float h = Input.GetAxis("Horizontal"); | |
float v = Input.GetAxis("Vertical"); | |
Vector3 velocity = new Vector3(0, 0, v); | |
velocity *= speed; | |
velocity -= rigidbody.velocity; | |
rigidbody.AddForce(velocity, forceMode); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment