Вопрос про HUD

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

Вопрос про HUD

Сообщение ivieshok 28 фев 2013, 11:35

Здравствуйте есть вопрос. На сцене есть объект "guilives" у него значение идет ХХХ . Когда сцена стартуется я перевожу его в число 3 . Как реализовать чтобы вместо 3х у меня было 3 текстуры сердца.
Синтаксис:
Используется csharp
void Start () {
DontDestroyOnLoad(gameObject);
DontDestroyOnLoad(GameObject.Find("guiLives"));
guiLives = GameObject.Find("guiLives").GetComponent<GUIText>();
guiLives.text = "Lives: " + lives;

Скрипт на добавление жизни
Синтаксис:
Используется csharp
        public void LoseLife() {
lives--;
guiLives.text = "Lives: " + lives;
if ( lives > 0 )
SpawnBall();
else {
Destroy(gameObject);
Application.LoadLevel("gameOver");

Скрипт на удаление жизни
ivieshok
UNец
 
Сообщения: 7
Зарегистрирован: 02 фев 2013, 13:30

Re: Вопрос про HUD

Сообщение extravert 28 фев 2013, 13:02

У него идет значение ХХХ

Ты о чем?

Ответ первый: Ты изначально неверно подошел к задаче. Тебе не нужно конвертирование трех крестиков в компоненте в число. Визуальная часть должна просто быть связана с логикой, а логика не должна быть завязана на визуальной части.
Запомни: логика программы и графика должны быть максимально разделены. Графика берет значения логических вычислений, логика никак не трогает графику

Как я понял задачу.
Есть юнит, у него есть количество жизней. На это указывает переменная LifeCount в скрипте юнита.
Синтаксис:
Используется csharp
public class Unit : MonoBehaviour
{
    public int LifeCount = 3;
}
 


Сейчас у юнита целых 3 жизни!
Как мне сделать так, чтобы над игроком появилось три одинаковые текстуры, символизирующие жизнь, мир процветание и пончики?

Ответ второй, на правильно поставленный вопрос:
1. Ты должен создать функцию OnGUI в своем скрипте. Эта функция обрабатывает графический интерфейс. Вызывается каждый кадр, так скажем. Скрипт у тебя становится таким:
Синтаксис:
Используется csharp
public class Unit : MonoBehaviour
{
    public int LifeCount = 3;

    void OnGUI()
    {
       
    }
}


2. Создаешь переменную типа Texture2D. В инспекторе туда ты закинешь текстуру с жизнями.
Теперь скрипт вот такой:
Синтаксис:
Используется csharp
public class Unit : MonoBehaviour
{
    public Texture2D LifeTexture;
    public int LifeCount = 3;

    void OnGUI()
    {
       
    }
}


3. Создаешь цикл для перебора по жизням
Синтаксис:
Используется csharp
public class Unit : MonoBehaviour
{
    public Texture2D LifeTexture;
    public int LifeCount = 3;

    void OnGUI()
    {
        for(int i = 0; i < LifeCount; i++)
        {
           
        }
    }
}


4. В цикл записываешь действие для отображения текстуры. Пока пустое:
Синтаксис:
Используется csharp
public class Unit : MonoBehaviour
{
    public Texture2D LifeTexture;
    public int LifeCount = 3;

    void OnGUI()
    {
        for(int i = 0; i < LifeCount; i++)
        {
            GUI.DrawTexture(new Rect(), LifeTexture);
        }
    }
}


5. Теперь тебе нужно перевести точку в игровом мире в точку на экране. Точно не помню какая это процедура.
Либо ViewportToScreenPoint либо WorldToScreenPoint. Скорей всего Viewport - это мировая координата относительно твоей камеры, а вторая это "глобальная мировая". Так же нужно добавить конвертирование точки экрана в точку ГУИ
В итоге получается так:
Синтаксис:
Используется csharp
public class Unit : MonoBehaviour
{
    public Texture2D LifeTexture;
    public int LifeCount = 3;

    void OnGUI()
    {
        var point = GUIUtility.ScreenToGUIPoint(Camera.main.ViewportToScreenPoint(transform.position));
        for(int i = 0; i < LifeCount; i++)
        {
            GUI.DrawTexture(new Rect(), LifeTexture);
        }
    }
}


6. Теперь тебе нужна переменная которая будет показывать, какого размера твоя текстура на экране, а так же переменная, которая будет показывать насколько одно сердце смещается от другого. Обрати внимание, что значения в функции так же поменялись.
Синтаксис:
Используется csharp
public class Unit : MonoBehaviour
{
    public Rect LifePosAndSize;
    public Vector2 LifeOffset;
    public Texture2D LifeTexture;
    public int LifeCount = 3;

    void OnGUI()
    {
        var point = GUIUtility.ScreenToGUIPoint(Camera.main.ViewportToScreenPoint(transform.position));
        for(int i = 0; i < LifeCount; i++)
        {

            GUI.DrawTexture(new Rect(point.x - LifePosAndSize.width/2 + LifePosAndSize.x + LifeOffset.x * i,
                                     point.y - LifePosAndSize.height / 2 + LifePosAndSize.y + LifeOffset.y * i,
                                     LifePosAndSize.width,
                                     LifePosAndSize.height),
                            LifeTexture);
        }
    }
}


7. Последний скрипт - уже готовый. Для добавления жизней ты просто используешь LifeCount++, LifeCount+=<число>, для вычитания обратный знак, для сравнения LifeCount=<число>. Добавляй свои значения в этот скрипт, который будет висеть на твоем юните и ты будешь счастлив. Все же было просто до элементарного!

В инспекторе тебе надо будет выставить значения учитывая что:
LifePosAndSize.width/2 - половина твоей текстуры жизни. Нужна для того чтобы предмет отобразился по центру (сместить на половину себя)
LifePosAndSize.x - значение которое ты задашь сам, насколько смещена текстура, относительно точки персонажа.
LifeOffset.x - значение которое ты задашь сам, насколько смещено каждое сердце относительно другого сердца. Расстояние между ними, короче.
Аватара пользователя
extravert
UNIверсал
 
Сообщения: 465
Зарегистрирован: 24 дек 2012, 11:54

Re: Вопрос про HUD

Сообщение ivieshok 28 фев 2013, 14:38

спасибо довольно подробно объяснил. А ХХХ это просто был GuiText и вместо него писалась 3 жизни цифрой. Если появятся вопросы напишу (3A4OT)
ivieshok
UNец
 
Сообщения: 7
Зарегистрирован: 02 фев 2013, 13:30


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15