(Unity2D) Увеличение и уменьшение количества статов - PullRequest
0 голосов
/ 05 октября 2018

У меня есть несколько статов, прикрепленных к объектам, которые со временем укорачиваются.Если ПК сталкивается с объектом, вместо этого индикаторная строка должна неуклонно увеличиваться в длине.

Вместо этого планка удлиняется в полной мере и не начинает сокращаться до тех пор, покаПК взаимодействует с другим объектом стат-бара;в этот момент столбец возвращается к длине, которой он был ранее.

Это код последовательности баров:

void Update() { 
    if (contact) {
        Increase();
        Debug.Log("increasing");
    } else if (contact == false) {
        Decrease();
        Debug.Log("decreasing");
    } 
}

void Decrease() {
    if (filled > 0) {
        filled -= 0.006f;
        timerBar.fillAmount = filled / maxTime;
    }
}

void Increase() {
    if (filled < maxTime) {
        timerBar.fillAmount = (filled += 0.006f);
    }
}

В отдельном скрипте я сохраняюусловия для определения «контакта».

void OnCollisionEnter2D(Collision2D collision) {
    if (collision.gameObject.tag == "Player") {
        barProg.contact = true;
        Debug.Log("is touching");
    }
}

void OnCollisionExit2D(Collision2D collision) {
    if (collision.gameObject.tag == "Player") {
        barProg.contact = false;
        Debug.Log("is not touching");
    }
}

Вот изображения, относящиеся к приложениям и коллайдерам скрипта:

enter image description here

«yellowBar (progBar)» и т. д. относятся к скриптам, прикрепленным к холст-изображениям панелей статистики.Таким образом, маленькая желтая истощающая линия (строка состояния) - это «yellowBar», и она ссылается на скрипт, прикрепленный к отдельной строке статистики (progBar).

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

gameplay

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

У меня есть несколько предложений, которые помогут вам выбрать верный путь.К этому сценарию должны быть прикреплены объекты, которые заполняют строки состояния.вам нужно написать отдельный скрипт, чтобы фактически настроить строки состояния на основе fillpercentage, но я оставлю это вам.Этот скрипт отвечает только за то, насколько полно, ничего не отображая.Это хорошая практика, чтобы отделить вашу логику от вашего пользовательского интерфейса, так как вы можете изменить один, не влияя на другой.

Кроме того, вы должны избегать использования «магических чисел» в вашем коде.Вместо этого создайте переменные.см. https://en.wikipedia.org/wiki/Magic_number_(programming)

Кроме того, вы можете переключаться между увеличением и уменьшением, используя bool, а не вызовы отдельных методов.Это сохраняет логику в одном месте и облегчает ее изменение в будущем.

public class ColoredObject : Monobehaviour {

    //bool to switch increasing and decreasing
    bool increasing = false;

    //can set this value in inspector to adjust speed it fills
    //can even have different fill speeds for each color
    public float fillSpeed;

    //stores how full the bar is
    float percentageFull = 100;

    //if player contacts, start increasing
    void OnCollisionEnter2D(Collision2D collision) {
        if (collision.gameObject.tag == "Player") {
            increasing = true;
        }
    }

    //if player exits, start decreasing
    void OnCollisionExit2D(Collision2D collision) {
        if (collision.gameObject.tag == "Player") {
            increasing = false;
        }
    }

    void Update () {
        UpdateFill()
    }

    public void UpdateFill() {
        if (increasing) {
            //fill based on time passed since last frame
            percentageFull += fillSpeed * Time.deltatime;
        }
        else {
            //empty based on time passed since last frame
            percentageFull -= fillSpeed * Time.deltatime;
        }

        // keep it between 0 and 100%
        percentageFull = Mathf.Clamp(percentageFull, 0f, 100f);
    }
}

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

РЕДАКТИРОВАТЬ: если вы хотите разные скорости увеличения и уменьшения, просто добавьте еще одну переменную и замените fillSpeed ​​в уменьшающемся разделе.

0 голосов
/ 05 октября 2018

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

    bool healing=false;



    public void OnTriggerEnter2D(Collisider2D col)
   {
      if(col.tag=="Player")
      {
      healing = true;
      }
    }
    public void OnTriggerExit2D(Collisider2D col) 
    {
    if(col.tag=="Player")
      {
    healing = false;
      }
    }

    public void Update()
{
    if(healing)
  {
    if(filled<maxTime)
    {
     timerBar.fillAmount += 0.006f;
    }
  }
}

чье здоровье растет, поэтому каждому нужен сценарий.

тыПК должен быть помечен как «Игрок», чтобы поймать столкновение.

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

и как объекту, так и ПК, потребуется твердое тело.кажется, у вас уже есть большая часть этого.причина, по которой это работает, это beacuae от логического выражения.он устанавливает значение true, когда вы вводите триггер, и false, когда вы его покидаете.так что это единственный верный аргумент для этого элемента, пока вы касаетесь этого элемента, а затем обновляете его, пока оно истинно, мы увеличиваем индикатор здоровья.

Помещение этого сценария непосредственно в каждый из ваших объектов будет препятствовать их конфликту или обновлениюпервый.

удачи!

...