- Home /
MOB HP - Subtract on Hit if Near
I have two scripts.. Player Attack and AttackandHP (Placed on Enemies) Now the AttackandHP shows my enemies health and also attacks the player. Ive got the Mobs to take my life away fine, how ever, i want to have it so my mobs could either be selected on click, or so you can press F and any mobs near you will lose HP. Im stuck and the Player Attack script does not effect my mobs at all because they require a target but im lost. Any help please!
AttackandHP using UnityEngine; using System.Collections;
public class AttackandHP : MonoBehaviour {
public int maxHealth = 10;
public int curHealth = 10;
public GameObject target;
public float attackTimer;
public float coolDown;
public GUIStyle HPBar; //GUISTYLE FOR BUTTONS ETC
public float healthBarLength;
// Use this for initialization
void Start () {
healthBarLength = Screen.width / 2;
attackTimer = 0;
coolDown = 2.0f;
}
// Update is called once per frame
void Update () {
//TEST
//TESTEDN
AdjustCurrentHealth(0);
if(attackTimer > 0)
attackTimer -= Time.deltaTime;
if(attackTimer < 0)
attackTimer = 0;
if(attackTimer == 0) {
Attack();
attackTimer = coolDown;
}
}
void OnGUI() {
float distance = Vector3.Distance(target.transform.position, transform.position);
Debug.Log(distance);
if(distance < 4) {
GUI.Box(new Rect(10, 40, healthBarLength, 20), curHealth + "/" + maxHealth, HPBar);
}
}
public void AdjustCurrentHealth(int odj) {
curHealth += odj;
if(curHealth < 1)
curHealth = 0;
if(curHealth > maxHealth)
curHealth = maxHealth;
if(maxHealth < 1)
maxHealth = 1;
if(curHealth == 0)
Destroy (gameObject);
healthBarLength = (Screen.width / 2 ) * (curHealth / (float)maxHealth);
}
private void Attack() {
float distance = Vector3.Distance(target.transform.position, transform.position);
Vector3 dir = (target.transform.position - transform.position).normalized;
float direction = Vector3.Dot(dir, transform.forward);
Debug.Log(direction);
if(distance < 2) {
if(direction > 0) {
PlayerHealth eh = (PlayerHealth)target.GetComponent("PlayerHealth");
eh.AdjustCurrentHealth(-8);
}
}
}
}
Player Attack using UnityEngine; using System.Collections;
public class PlayerAttack : MonoBehaviour {
public GameObject target;
public float attackTimer;
public float coolDown;
// Use this for initialization
void Start () {
attackTimer = 0;
coolDown = 2.0f;
}
// Update is called once per frame
void Update () {
if(attackTimer > 0)
attackTimer -= Time.deltaTime;
if(attackTimer < 0)
attackTimer = 0;
//attack press F key
if (Input.GetKey (KeyCode.F)) {
if(attackTimer == 0) {
animation.Play("bitchslap");
Attack();
attackTimer = coolDown;
}
}
}
// CHANGE TO HIT NEAREST ENEMY?? IDK HOW MAN!!!
private void Attack() {
AttackandHP eh = (AttackandHP)target.GetComponent("AttackandHP");
eh.AdjustCurrentHealth(-2);
}
}
Answer by Statement · Dec 22, 2013 at 01:09 PM
Check my previous answer out for a discussion how to get the k'th closest object tagged "Enemy". Useful if you want for example "to target the three closest enemies".
If you are trying to describe an area of effect attack, ensure your mobs have colliders and then just do a Physics.OverlapSphere (link contains example applying damage to everything within radius).
To allow an object to be selected on click, consider implementing the OnMouseDown event handler. Put very simply, you could use a private static variable (or Ambient Context) for storing the currently selected object.
Your answer
Follow this Question
Related Questions
Multiple Cars not working 1 Answer
Melee Attack System 1 Answer
Why does my var speed say it is wrong 2 Answers
BCE0044: expecting }, found 'private'. PLEASE HELP!!!!! 2 Answers
How can i make the ray cast don't go through the walls 1 Answer