Задать вопрос
BRO_TIGER
@BRO_TIGER
Indie Developer (C#, JS)

Проблема с Всплывающим окном в игре (Некий DebugHUB)?

Доброго времени суток! Большая часть Системы строительства уже сделана и я задался вопросом: Как сделать всплывающее окно которое бы говорило пользователю почему деталь не ставится? Сделал ограничения всё работает, но несколько сообщений не всплывают! Скажите, может я в чем то ошибся? Заранее Спасибо!

Вот скрипт Менеджера Строительства (Части связанные с "Debug" Менеджером)
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using UnityEngine;

public class BuildingHUB : MonoBehaviour {

    public GameObject debugHUB;

    public Text debugText;
    public Text countText;
    public Text massText;
    public Text energyText;
    public Text strenghText;

    //Для работы из вне в скрипте Строительства!
    public int maxCount = 40;
    public int count;

    public void DebugHUB()
    {
        PlayerShip PS = playerShip.GetComponent<PlayerShip>();

        int energy = PS.energy;
        int maxEnergy = PS.maxEnergy;
        energyText.text = energy.ToString() + " / " + maxEnergy.ToString();

        count = details.Length;
        countText.text = count.ToString() + " / " + maxCount.ToString() + " ШТ.";


        //Debug с количеством деталей - Работает!
        if (count == maxCount)
        {
            debugHUB.SetActive(true);
            debugText.text = "ВНИМАНИЕ! КОЛИЧЕСТВО ДЕТАЛЕЙ ОГРАНИЧЕНО, УДАЛИТЕ НЕНУЖНЫЕ ДЕТАЛИ ЧТОБЫ ПОСТАВИТЬ ДРУГИЕ!";
        }
        else
        {
            debugHUB.SetActive(false);
            debugText.text = "";
        }

        if (PS.energy + detailRefs.energy < PS.maxEnergy)
        {
            debugHUB.SetActive(true);
            debugText.text = "ВНИМАНИЕ! НЕДОСТАТОЧНО ЭНЕРГИИ! УВЕЛИЧЬТЕ МАКСИМАЛЬНЫЙ ПОКАЗАТЕЛЬ С ПОМОЩЬЮ ГЕНЕРАТОРОВ!";
        }
        else
        {
            debugHUB.SetActive(false);
            debugText.text = "";
        }
    }
}


На всякий случай скрипт Строительства (Его часть)

public void Build()
    {
        PlayerShip PShip = ship.transform.GetComponentInParent<PlayerShip>();
        PreviewObject PS = currentpreview.GetComponent<PreviewObject>();
        DetailRefs DR = currentobject.prefab.GetComponent<DetailRefs>();

        float mass = 0;

        if (PS.IsBuildable)
        {
            if (PShip.energy + DR.energy < PShip.maxEnergy)
            {
                if (buildingHUB.count < buildingHUB.maxCount)
                {
                    GameObject GO = (GameObject)Instantiate(currentobject.prefab, currentpos, Quaternion.Euler(currentrot));
                    GO.transform.SetParent(ship.transform);

                    PShip.strength += DR.strength;
                    PShip.energy += DR.energy;

                    Collider[] cols = GO.transform.GetComponentsInChildren<Collider>();
                    //Debug.Log("Количество коллайдеров в новом объекте: " + cols.Length);

                    foreach (Collider col in cols)
                    {
                        float volume = col.bounds.size.x * col.bounds.size.y * col.bounds.size.z;
                        mass += volume;
                    }
                }
            }
        }
        //Debug.Log("Прибавление массы: " + mass);
        ship.transform.GetComponentInParent<Rigidbody>().mass += mass;
    }
}
  • Вопрос задан
  • 201 просмотр
Подписаться 1 Оценить Комментировать
Решения вопроса 2
Griboks
@Griboks Куратор тега C#
Вроде оба сообщения написаны верно. Однако сообщения выводятся одновременно! Поэтому одно сообщение вполне может перекрывать другое.
Я рекомендую сделать некий менеджер отладки с очередью сообщений. Что бы, когда нажимаешь ок, выводилось следующее.
DebugHub.AddToQuee(count==maxcount,"ВНИМАНИЕ! КОЛИЧЕСТВО ДЕ");

Другой вариант - условия написаны неверно.
Ответ написан
BRO_TIGER
@BRO_TIGER Автор вопроса
Indie Developer (C#, JS)
Griboks Спасибо за ответ! Трезво взглянув на скрипт и ваш ответ я понял что не так! Я сделал проверку операторами неправильной ведь если один проверил действие и хотел вывести сообщение, то другой просто отключал и стирал текст... Но я вспомнил про переменную [else if] которая бы срабатывала когда другой оператор не срабатывал, тем самым проверял всё поочередно! И в итоге я подправил скрипт и всё выводилось нормально
if (PS.energy + detailRefs.energy > PS.maxEnergy)
        {
            debugHUB.SetActive(true);
            debugText.text = "ВНИМАНИЕ! НЕДОСТАТОЧНО ЭНЕРГИИ! УВЕЛИЧЬТЕ МАКСИМАЛЬНЫЙ ПОКАЗАТЕЛЬ С ПОМОЩЬЮ ГЕНЕРАТОРОВ!";
        }
        else if (iMass >= maxMass)
        {
            debugHUB.SetActive(true);
            debugText.text = "ВНИМАНИЕ! СЛИШКОМ БОЛЬШАЯ МАССА! СТАБИЛИЗИРУЙТЕ ЭТОТ ПОКАЗАТЕЛЬ УДАЛИВ ТЯЖЕЛЫЕ ДЕТАЛИ!";
        }
        else if (count == maxCount)
        {
            debugHUB.SetActive(true);
            debugText.text = "ВНИМАНИЕ! КОЛИЧЕСТВО ДЕТАЛЕЙ ОГРАНИЧЕНО, УДАЛИТЕ НЕНУЖНЫЕ ДЕТАЛИ ЧТОБЫ ПОСТАВИТЬ ДРУГИЕ!";
        }
        else
        {
            debugHUB.SetActive(false);
            debugText.text = "";
        }

Спасибо ещё раз!
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы