хп бар над объектами 2D

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

хп бар над объектами 2D

Сообщение Torbenlino 30 июн 2018, 02:03

2D платформер, нужно сделать так чтобы полоска хп весела над каждым мобом и перемещалась вместе с ним
есть спрайт, дочерний объект моба, на нем такой скрипт
Синтаксис:
Используется csharp
    float maxHp;
    float curHp;
    public GameObject mob;
    float hpBarLen;
    float startScale;
    float curScale;

    void Start () {
        maxHp = mob.GetComponent<Characters>().health;
        startScale = transform.localScale.x;
        }
        void Update () {
            curHp = mob.GetComponent<Characters>().health;
            hpBarLen = curHp / maxHp;

            curScale = curHp * startScale / maxHp;
            transform.localScale = new Vector3(curScale, 1.5f, 1);
    }
 

получается scale уменьшается к своему центру, а как сделать чтобы полоска уменьшалась к левой стороне?

во всех гайдах которые нашел хп бар делается через гуи, а объяснения как привязать бар к персонажу сделаны на примерах 3д проектов, у меня ничего не работает с помощью таких способов
Torbenlino
UNец
 
Сообщения: 31
Зарегистрирован: 17 мар 2018, 01:47

Re: хп бар над объектами 2D

Сообщение waruiyume 30 июн 2018, 03:08

"как сделать чтобы полоска уменьшалась к левой стороне?"
Поставить пустой объект на левой стороне, приаттатчить к нему полоску, и потом масштабировать пустой объект.
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: хп бар над объектами 2D

Сообщение Torbenlino 30 июн 2018, 05:17

Спасибо!) вот только теперь если персонаж поворачивается в другую сторону лицом то и полоска уже не к левой стороне а к правой уменьшается
поворот персонажа примерно так делается
Синтаксис:
Используется csharp
 bool facingRight;
 float move;
update()
{
           move = Input.GetAxis("Horizontal");
           
            if (move > 0 && !facingRight)
                Flip();
            else if (move < 0 && facingRight)
                Flip();
}
void Flip()
    {
        facingRight = !facingRight;
        Vector3 theScale = transform.localScale;
        theScale.x *= -1;
        transform.localScale = theScale;
   }
 


я так понял мне нужно во время метода flip взять и поменять на отрицательные значения позицию моей полоски и пустого объекта к которому она привязана, только как это сделать чет не могу допереть
Torbenlino
UNец
 
Сообщения: 31
Зарегистрирован: 17 мар 2018, 01:47

Re: хп бар над объектами 2D

Сообщение 1max1 30 июн 2018, 07:16

Достаточно просто зафризить поворот у полоски
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: хп бар над объектами 2D

Сообщение Cr0c 30 июн 2018, 08:41

Я пустышку вешаю, в контроллере баров на канвасе ставлю туда бар. Проблем никаких. Плюс контроллер получает нормализованные данные, инкапсулированные в делегате и по запросу обновляет бар. Там пара десятков строк на всю систему баров.
Конструктор: трансформ пустышки, префаб бара, делегат запроса данных, отдаёт id созданного бара для ручного обновления значения бара.
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Events;

public delegate float DelegateBarValue();
public class HPbar
{
    public Transform transform;
    public Image imageHP;
    public Image imageBorder;
    public DelegateBarValue value;
    public float offsetY = 0f;
    public int id = -1;
    public HPbar(Transform _tr, Image _imageBG, Image _imageHP, DelegateBarValue _value, float _offsetY = 0f)
    {
        transform = _tr;
        imageHP = _imageHP;
        imageBorder = _imageBG;
        value = _value;
        offsetY = _offsetY;
    }
}

public class UI_controller : MonoBehaviour {

    public static UI_controller Instance { get; private set; }
    private Dictionary<Transform, List<HPbar>> listHPbars = new Dictionary<Transform, List<HPbar>>();
    new private Camera camera;
    [SerializeField]
    private Transform canvasHP;
    public GameObject prefabHPbar;
    private int barCounter = -1;

    private void Awake()
    {
        camera = Camera.main;
        Instance = this;
    }

    void Start () {
        }
       
        public void UpdateHPbars() {
        foreach(var h in listHPbars)
        {
            SetHPbarPosition(h.Key);
        }
        }

    #region БАРЫ
    /// <summary>
    /// Регистрация бара на объект
    /// </summary>
    /// <param name="_object">Холдер бара на объекте</param>
    /// <param name="_prefab">Префаб бара</param>
    /// <param name="_value">делегат, отдающий флоат для бара</param>
    public int AddHPbar(Transform _object, GameObject _prefab, DelegateBarValue _value)
    {
        GameObject barHP = Instantiate(_prefab, Vector3.zero, Quaternion.identity, canvasHP);
        Image imgBg = barHP.GetComponent<Image>();
        Image imgHP = barHP.transform.GetChild(0).GetComponent<Image>();
        if (!listHPbars.ContainsKey(_object))
        {
            var l = new List<HPbar>();
            var h = new HPbar(barHP.transform, imgBg, imgHP, _value);
            h.id = barCounter;
            l.Add(h);
            listHPbars.Add(_object, l);
            return barCounter;
        }
        else
        {
            HPbar last = listHPbars[_object][listHPbars[_object].Count - 1];
            HPbar hpBar = new HPbar(barHP.transform, imgBg, imgHP, _value,
                last.offsetY+last.imageBorder.rectTransform.rect.height);
            barCounter++;
            hpBar.id = barCounter;
            listHPbars[_object].Add(hpBar);
            return barCounter;
        }
    }

    /// <summary>
    /// Установка позиции бара
    /// </summary>
    /// <param name="_object">Носитель бара</param>
    public void SetHPbarPosition(Transform _object)
    {
        List<HPbar> hpBars = listHPbars[_object];
        if (hpBars.Count == 0) return;
        foreach (HPbar h in hpBars)
            h.transform.position = camera.WorldToScreenPoint(_object.position) + new Vector3(0f, h.offsetY, 0f);
    }

    /// <summary>
    /// Установка значения бара
    /// </summary>
    /// <param name="_object">Носитель бара</param>
    public void SetBarsValue(Transform _object)
    {
        List<HPbar> hpBars = listHPbars[_object];
        if (hpBars == null) return;
        foreach (HPbar hpBar in hpBars)
        {
            hpBar.imageHP.fillAmount = hpBar.value();
        }
    }

    // прячет бар
    public void HideHPbar(Transform _object)
    {
        if (listHPbars.ContainsKey(_object))
            foreach (HPbar hp in listHPbars[_object])
                hp.transform.gameObject.SetActive(false);
    }
    // показывает бар
    public void ShowHPbar(Transform _object)
    {
        if (listHPbars.ContainsKey(_object))
            foreach (HPbar hp in listHPbars[_object])
                hp.transform.gameObject.SetActive(true);
    }

    /// <summary>
    /// Уничтожение баров
    /// </summary>
    /// <param name="_object">Носитель бара</param>
    public void RemoveHPbar(Transform _object)
    {
        foreach (HPbar hp in listHPbars[_object])
            Destroy(hp.transform.gameObject);
        listHPbars.Remove(_object);
    }
    /// <summary>
    /// Удаление одного бара из набора
    /// </summary>
    /// <param name="_object">Холдер бара</param>
    /// <param name="_id">ID бара</param>
    public void RemoveHPbar(Transform _object, int _id)
    {
        foreach (HPbar hp in listHPbars[_object])
            if (hp.id == _id)
            {
                Destroy(hp.transform.gameObject);
                listHPbars[_object].Remove(hp);
                break;
            }
        for (int i=0; i<listHPbars[_object].Count; i++)
        {
            HPbar h = listHPbars[_object][i];
            if (i == 0)
                h.offsetY = 0f;
            else
                h.offsetY = listHPbars[_object][i - 1].offsetY + listHPbars[_object][i - 1].imageBorder.rectTransform.rect.height;
        }
    }
    #endregion
}
 
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81

Re: хп бар над объектами 2D

Сообщение Cr0c 30 июн 2018, 08:58

Синтаксис:
Используется csharp
// создание бара
resourceBarID = ui.AddHPbar(barHP, prefabIronBar, delegate { return ((float)resourceValue / (float)maxResource); });
/////////
ui.SetBarsValue(barHP); // обновление баров на этой пустышке
////////
ui.RemoveHPbar(barHP, resourceBarID); // уничтожение конкретного бара на пустышке
 
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81

Re: хп бар над объектами 2D

Сообщение Cr0c 30 июн 2018, 09:26

1max1 писал(а):Достаточно просто зафризить поворот у полоски

И что, фриз поворота повлияет на шейдер спрайта?
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81

Re: хп бар над объектами 2D

Сообщение 1max1 30 июн 2018, 09:30

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

п.с. тупанул, там у него не поворот, а отражение через скейл)

Спасибо!) вот только теперь если персонаж поворачивается в другую сторону лицом то и полоска уже не к левой стороне а к правой уменьшается
поворот персонажа примерно так делается


проще всего выкинуть этот бар из дочерних объектов у моба и отправить в свободное плавание + сверху накинуть простенький скрипт следования за мобом, таким образом когда твой моб флипнется это не повлияет на полоску и она так же будет идти за мобом
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: хп бар над объектами 2D

Сообщение Cr0c 30 июн 2018, 10:03

Я уже дал рабочий вариант, вместе со скриптом на мультибары. Там же можно накидывать сколько хочешь, они вертикально стакаются + на префабе (подложка+бар).
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81

Re: хп бар над объектами 2D

Сообщение Torbenlino 30 июн 2018, 14:21

получается так:
есть персонаж, на нем висит пустышка, на пустышке спрайт бара
в методе флип меняю позицию по иксу на отрицательную у пустышки и бара относительно персонажа(localPosition)
визуально полоска остается на месте и уменьшается к левому краю, вроде все четко работает
Torbenlino
UNец
 
Сообщения: 31
Зарегистрирован: 17 мар 2018, 01:47

Re: хп бар над объектами 2D

Сообщение Cr0c 30 июн 2018, 14:56

Лучше пустышку использовать для получения координат на канвасе, где лежит Image бара. Не надо UI переносить на сцену, UI - это канвас.
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81

Re: хп бар над объектами 2D

Сообщение seaman 30 июн 2018, 20:41

Не надо UI переносить на сцену

Почему? Причина?
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: хп бар над объектами 2D

Сообщение Cr0c 30 июн 2018, 22:56

seaman писал(а):
Не надо UI переносить на сцену

Почему? Причина?

Лишние дк. Да и вообще сущность не та. Это ж не VR, где иначе никак.
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81

Re: хп бар над объектами 2D

Сообщение seaman 06 июл 2018, 18:34

Это не причины.
Во-первых покажите что лишние ДК есть по сравнению с такой же функциональностью, сделанной без UI.
Во-вторых имя, HP и подобные вещи - это UI,а где это UI неважно.
В-третьих, хотя это и придирка с словам, но канвас все равно на сцене. Где же еще то...
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: хп бар над объектами 2D

Сообщение Cr0c 06 июл 2018, 19:50

seaman писал(а):В-третьих, хотя это и придирка с словам, но канвас все равно на сцене. Где же еще то...

Обычно, канвас в оверлее... что не совсем сцена )) да и координаты на нём не мировые/локальные, а вполне себе экранные.
По поводу дк - разве в уи все элементы не одним дк рисуются внутри каждого канваса (при стандартном шейдере на всех)?
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81

След.

Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 16