I followed burgergarcade’s tutorial for the VitalBar.cs, but I have a problem. When ever I target a Mob Slug, my players health turns into the mobs health so when I target a mob I get his health status… I’ve looked it over an couldn’t figure out what’s wrong.
Here is my VitalBar.cs
using UnityEngine;
using System.Collections;
public class VitalBar : MonoBehaviour {
public bool _isPlayerHealthBar; //this boolean value tells us if this is the player health bar or the mob health bar
private int _maxBarLength; //this is how large the vital bar can be if the player is at 100% health
private int _curBarLength; //this is the current length of the vital bar
private GUITexture _display;
void Awake(){
_display = gameObject.GetComponent<GUITexture>();
}
// Use this for initialization
void Start () {
// _isPlayerHealthBar = true;
_maxBarLength = (int)_display.pixelInset.width;
_curBarLength = _maxBarLength;
_display.pixelInset = CalculatePosition();
OnEnable();
}
// Update is called once per frame
void Update () {
}
//this method is called when the gameobject is enabled
public void OnEnable(){
if(_isPlayerHealthBar)
Messenger<int, int>.AddListener("player health update", OnChangeHealthBarSize);
else
ToggleDisplay(false);
Messenger<int, int>.AddListener("mob health update", OnChangeHealthBarSize);
Messenger<bool>.AddListener("show mob vitalbars", ToggleDisplay);
}
//this method is called when the gameobject is disabled
public void OnDisable(){
if(_isPlayerHealthBar)
Messenger<int, int>.RemoveListener("player health update", OnChangeHealthBarSize);
else
Messenger<int, int>.RemoveListener("mob health update", OnChangeHealthBarSize);
Messenger<bool>.RemoveListener("show mob vitalbars", ToggleDisplay);
}
//this method will calculate the total size of the health bar in relation to % of health the target has left
public void OnChangeHealthBarSize(int curHealth, int maxHealth){
// Debug.Log("We heard and event: curHealth = " + curHealth + " - maxHealth = " + maxHealth);
_curBarLength = (int)((curHealth / (float)maxHealth) * _maxBarLength); //this calculates the current bar length based on the player cur health%
_display.pixelInset = CalculatePosition();
}
//setting the healthbar to the player or mob
public void SetPlayerHealthBar(bool b){
_isPlayerHealthBar = b;
}
private Rect CalculatePosition(){
float yPos = _display.pixelInset.y / 2 - 15;
if(!_isPlayerHealthBar){
float xPos = (_maxBarLength - _curBarLength) - (_maxBarLength / 4 + 15);
return new Rect(xPos, yPos, _curBarLength, _display.pixelInset.height);
}
return new Rect(_display.pixelInset.x, yPos, _curBarLength, _display.pixelInset.height);
}
private void ToggleDisplay(bool show){
_display.enabled = show;
}
}
If this helps here is my TargetMob.cs script:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class TargetMob : MonoBehaviour {
public List<Transform> targets;
public Transform selectedTarget;
private Transform myTransform;
// Use this for initialization
void Start () {
targets = new List<Transform>();
selectedTarget = null;
myTransform = transform;
AddAllEnemies();
}
public void AddAllEnemies(){
GameObject[] go = GameObject.FindGameObjectsWithTag("Enemy");
foreach(GameObject enemy in go)
AddTarget(enemy.transform);
}
public void AddTarget(Transform enemy){
targets.Add(enemy);
}
private void SortTargetsByDistance(){//selects nearest enemy as target
targets.Sort(delegate(Transform t1, Transform t2) {
return Vector3.Distance(t1.position, myTransform.position).CompareTo(Vector3.Distance(t2.position, myTransform.position));
});
}
private void TargetEnemy(){
if(targets.Count == 0)
AddAllEnemies();
if(targets.Count > 0){
if(selectedTarget == null){
SortTargetsByDistance();
selectedTarget = targets[0];
}else{
int index = targets.IndexOf(selectedTarget); //cycles through index of enemy list
if (index < targets.Count - 1){
index++;
}else{
index = 0;
}
DeselectTarget();
selectedTarget = targets[index];
}
SelectTarget();
}
}
private void SelectTarget(){ //colors selected target
Transform name = selectedTarget.FindChild("Name");
if(name == null){
Debug.LogError("Could not find the name on " + selectedTarget.name);
return;
}
name.GetComponent<TextMesh>().text = selectedTarget.GetComponent<Mob>().Name;
name.GetComponent<MeshRenderer>().enabled = true;
selectedTarget.GetComponent<Mob>().DisplayHealth();
Messenger<bool>.Broadcast("show mob vitalbars", true);
}
private void DeselectTarget(){ // uncolors previously selected targets
selectedTarget.FindChild("Name").GetComponent<MeshRenderer>().enabled = false;
selectedTarget = null;
Messenger<bool>.Broadcast("show mob vitalbars", true);
}
// Update is called once per frame
void Update () {
if(Input.GetKeyDown(KeyCode.Tab)){
TargetEnemy();
}
}
}
Let me know if you need more information
Thanks in Advance