Отображение здоровья врага над врагом [работает, но не реально]?

1

Я работаю над системой баров здоровья, которая показывает бар для здоровья, который следует за врагом, куда бы они ни пошли [что отлично работает].

Но я также хочу, чтобы здоровье отображалось в номерах на панели здоровья, а также... я не могу работать. Ошибок нет, но он просто не отображается на экране.

Здесь мой класс здоровья:

//This script works great.
public Texture2D healthBar;
public Texture2D healthBarFrame;

public float maxHealth;
public float curHealth;

private int healthBarWidth = 50;
private int healthBarHeight = 5;

private float left;
private float top;

private Vector3 healthBarScreenPosition;

public PlayerCombat player;
public Enemy target;
public float healthPercent;

void Start () {

}

void Update () {
    if(player.opponent != null) {
        target = player.opponent.GetComponent<Enemy>();
        healthPercent = (float)target.curHealth / (float)target.maxHealth;

        Vector3 healthBarWorldPosition = (target.transform.position + new Vector3(0.0f, target.transform.lossyScale.y, 0.0f));
        healthBarScreenPosition = Camera.main.WorldToScreenPoint(healthBarWorldPosition);
        left = healthBarScreenPosition.x - (healthBarWidth / 2);
        top = Screen.height - (healthBarScreenPosition.y + (healthBarHeight / 2));
    } else {
        target = null;
        healthPercent = 0;
    }
}

void OnGUI() {
    if (target != null) {
        GUI.DrawTexture(new Rect(left, top, 50, 5), healthBarFrame);
        GUI.DrawTexture(new Rect(left, top, (50 * healthPercent), 5), healthBar);
    }
}

Это то, во что я возился, чтобы показать, сколько у HP врага (я разделил этот код на другой раздел, чтобы его было легче понять, обычно я просто пытаюсь добавить его в вышеупомянутый скрипт.

//This is generic code taken from another user (with the variables unchanged)
public Font font;
public int fontSize = 8;
public Vector3 Offset = Vector3.zero; // The offset from the character

public Enemy target;
public PlayerCombat player;

private float health;

private TextMesh bar;

void Start()
{
    target = player.opponent.GetComponent<Enemy>();
    // Setup the text mesh
    bar = new GameObject("HealthBar").AddComponent("TextMesh") as TextMesh;
    bar.gameObject.AddComponent("MeshRenderer");
    bar.gameObject.transform.parent = transform;
    bar.transform.position = target.transform.position;

    if(font) bar.font = font;
    else bar.font = GUI.skin.font;
    bar.renderer.material = font.material;
    bar.characterSize = 0.25f;
    bar.alignment = TextAlignment.Center;
    bar.anchor = TextAnchor.MiddleCenter;
    bar.fontSize = fontSize;
}

void Update()
{
    target = player.opponent.GetComponent<Enemy>();
    health = target.curHealth;
    if(bar.text != "HP:" + health.ToString()) bar.text = "HP: " + health.ToString();
}
Теги:
unity3d
user-interface

1 ответ

0

Вы используете разные системы для панели и текста. Возможные причины, по которым это не работает:

  • Текстовая сетка рисуется за планкой. Это связано с тем, что рендеринг графического интерфейса выполняется после рендеринга сцены.
  • Позиции для панели и текста различны. Бар находится поверх головы противника, потому что вы добавляете высоту к своей позиции. Но текст остается у ног. Возможно, текст стоит за чем-то или за пределами экрана?
  • Текстовая сетка не поворачивается к камере. С материалом шрифта по умолчанию вы можете видеть его со спины, но в зависимости от материала вы можете ничего не видеть, если смотреть со спины. Поскольку сетка не имеет глубины, вы не увидите ее независимо от материала, если смотреть сбоку.

Вероятно, лучший способ исправить это - нарисовать текст с помощью метки с прозрачным фоном в OnGUI() сразу после рисования панели. Это обеспечит соответствие позиций и что текст находится перед панелью.

Также проверьте в редакторе, если ваш текстовый файл отображается где угодно. Посмотрите, что с ним что-то не так. Возможно, неправильный материал назначен, возможно, позиция выключена.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню