Странный бар здоровья Instatiate - PullRequest
0 голосов
/ 20 января 2019

Я пытаюсь установить бары здоровья на своих юнитах, и проблема в том, что баров здоровья многократно создают на первой волне холстов юнитов, а на других 2 волнах появляются пустые холсты. Этот скрипт находится на сборных единицах. Я создаю единицы и бары здоровья в отдельных сценариях. Я не могу понять, что я делаю здесь неправильно.

Вот скриншот: Example screenshot

private Transform player;
private Image healthBar;
private Image barFilled;
public GameObject hpBarPrefab;

void Start()
{     
    minionExp = GetComponent<MinionExperience>();
    initialHealth = MaxHealth;
    healthBar = Instantiate(hpBarPrefab, 
    GameObject.FindObjectOfType<Canvas>().transform).GetComponent<Image>();
    barFilled = new List<Image>(healthBar.GetComponentsInChildren<Image>()).Find(img => img != healthBar);
}

public void TakePlayer(Transform pl0)
{
    player = pl0;
}

public Transform GetPlayer()
{
    return player;
}

public void MinionsTakeDmg(int dmg)
{
    MaxHealth -= dmg;
    if (MaxHealth <= 0)
    {
        Destroy(gameObject);
        MaxHealth = 0;
        if (player != null)
            player.GetComponent<Levels>().GainExp(minionExp.MaxMinionExp);
    }
    UpdateHealthBar();
}

public void UpdateHealthBar()
{
    float fa = MaxHealth / initialHealth;
    if (healthBar != null)
        healthBar.fillAmount = fa;
}

Ответы [ 2 ]

0 голосов
/ 20 января 2019

GameObject.FindObjectOfType<Canvas>() ищет всю сцену, вместо нее используйте FindComponentInChildren или transform.Find.

0 голосов
/ 20 января 2019

Fixed.Просто использовал общедоступный образ и перетянул на него изображение моего индикатора здоровья, и теперь это прекрасно работает:)

using UnityEngine.UI;
using UnityEngine;

public class RedMinionsHealth : MonoBehaviour
{
    public float RedMaxHealth = 10;
    private float RedinitialHealth;
    private MinionExperience minionExp;
    private Transform player;
    public Image RedhealthBar;

    void Start()
    {
        minionExp = GetComponent<MinionExperience>();
        RedinitialHealth = RedMaxHealth;
    }

    public void TakePlayer(Transform pl0)
    {
        player = pl0;
    }

    public void MinionsTakeDmg(int dmg)
    {
        RedinitialHealth -= dmg;
        if (RedinitialHealth <= 0)
        {
            Destroy(gameObject);
            RedMaxHealth = 0;
            GetComponent<BulletTieToPlayer>();
            if (player != null)
                player.GetComponent<Levels>().GainExp(minionExp.MaxMinionExp);
        }
        UpdateHealthBar();
    }

    public void UpdateHealthBar()
    {
        float fac = RedinitialHealth / RedMaxHealth;
        if (RedhealthBar != null)
            RedhealthBar.fillAmount = fac;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...