Как отрисовать ЧАСТЬ текстуры на GUI? - Форум Игроделов
Пн, 06 Май 2024, 01:21 
 
Приветствую Вас Гость Главная | Регистрация | Вход
Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум Игроделов » UNITY3D » DECAL, GUI, HUD » Как отрисовать ЧАСТЬ текстуры на GUI?
Как отрисовать ЧАСТЬ текстуры на GUI?
JohnsonДата: Сб, 08 Июн 2013, 18:54 | Сообщение # 1
 
Сообщений: 24
Награды: 0
Репутация: 0
Статус: Offline
Здравствуйте, уважаемые.

Третий час бьюсь и интернет рою, ни как не могу разобраться.

Делаю свою обертку на GUI класс, дошел до реализации прогрессбара.
Реализовываю всю обертку на текстурах.

Есть три текстуры: задний фон, заполнение и метка. Задний фон рисуется всегда, заполнение изначально имеет тот же размер, что и задний фон, но её рект отрисовки меняется в зависимости от свойства Progress.

И тут юнити порвала шаблон. Во всех нормальных средах чтобы отрисовать часть текстуры - надо просто указать размер, меньший, чем размер текстуры. А вот Юнька пошла по своей тропе - она может отмасштабировать текстуру, но не может отрезать. Есть флаг растрирования ScaleMode.ScaleAndCrop, который судя по названию должен бы отрезать. Он отрезает, не поспоришь. Только со всех сторон...

Итак, вопрос: как вывести на гуй часть текстуры без изменения её пропорций?

PS: код, может пригодится понять чего я хочу.
Код
using UnityEngine;
using System.Collections;

public class JLoadingPane : JControl {
        public float Progress { get; set; }
        public float MinValue { get; set; }
        public float MaxValue { get; set; }

        private readonly Texture2D _progressBg, _progressFill, _progressMark;

        public JLoadingPane() {
            Visible = true;

            MinValue = 0f;
            Progress = 50f;
            MaxValue = 100f;

            _progressBg = Resources.Load("_Textures/GUI/ProgressBarBg") as Texture2D;
            _progressFill = Resources.Load("_Textures/GUI/ProgressBarFill") as Texture2D;
            _progressMark = Resources.Load("_Textures/GUI/ProgressBarMark") as Texture2D;

            GuiController.I.AddControl(this);
        }

        public override void OnGui() {
            Color oldColor = GUI.color;
            Color newColor = GUI.color;
            newColor.a = 1f; //1 - GuiController.I.FadeAlpha; // Для появления обратно пропорционально FadeOut
            GUI.color = newColor;
            float width = (Progress - MinValue) / MaxValue * 623;

            Progress = GUI.HorizontalSlider(new Rect(10, 10, 400, 30), Progress, 0, 100);

            GUI.DrawTexture(new Rect(Screen.width / 2 - 370, Screen.height / 2 - 25, 623, 50), _progressBg);
          
            GUI.DrawTexture(new Rect(Screen.width / 2 - 370, Screen.height / 2 - 25, width, 50), _progressFill); // Растягивает
            //GUI.DrawTextureWithTexCoords(new Rect(Screen.width / 2 - 370, Screen.height / 2 - 25, width, 50), _progressFill, new Rect(0, 0, width, 50)); // "Умная" функция. Какого-то хрена выводит полностью синюю заливку, а не текстуру.
            //Renderer2D.I.DrawTexture(new Rect(Screen.width / 2 - 370, Screen.height / 2 - 25, width, 50), _progressFill, new Color(0f, 0f, 0f, 0.5f), new Rect(0, 0, width, 50)); // Тут работает на GL, библиотека чужая. Результат аналогичен предыдущему.
            GUI.DrawTexture(new Rect(Screen.width / 2 + 260, Screen.height / 2 - 25, 109, 50), _progressMark);

            GUI.color = oldColor;
        }

        public override bool IsLoadingPane() { return true; }
}


PS: А что не так у гуя с полупрозрачностью? Текстурки по углам бывают засвеченные (заодно показал, как "неправильно" режет текстуру):
Сверху марка - из жабы, снизу - со скриншота.


Добавлено (08 Июн 2013, 18:54)
---------------------------------------------
Отбой тревоге. Для этого нужна "специально обученная" функция:
Код
        GUI.DrawTextureWithTexCoords(new Rect(Screen.width / 2 - 370, Screen.height / 2 - 25, width * 623, 50), _progressFill, new Rect(0, 0, width, 1), true);


Ректа координат текстуры задается не в пикселях, а в соотношении к максимуму (x/width).

Вопрос про полупрозрачность в силе. Почему?


Сообщение отредактировал Johnson - Сб, 08 Июн 2013, 18:55
 
СообщениеЗдравствуйте, уважаемые.

Третий час бьюсь и интернет рою, ни как не могу разобраться.

Делаю свою обертку на GUI класс, дошел до реализации прогрессбара.
Реализовываю всю обертку на текстурах.

Есть три текстуры: задний фон, заполнение и метка. Задний фон рисуется всегда, заполнение изначально имеет тот же размер, что и задний фон, но её рект отрисовки меняется в зависимости от свойства Progress.

И тут юнити порвала шаблон. Во всех нормальных средах чтобы отрисовать часть текстуры - надо просто указать размер, меньший, чем размер текстуры. А вот Юнька пошла по своей тропе - она может отмасштабировать текстуру, но не может отрезать. Есть флаг растрирования ScaleMode.ScaleAndCrop, который судя по названию должен бы отрезать. Он отрезает, не поспоришь. Только со всех сторон...

Итак, вопрос: как вывести на гуй часть текстуры без изменения её пропорций?

PS: код, может пригодится понять чего я хочу.
Код
using UnityEngine;
using System.Collections;

public class JLoadingPane : JControl {
        public float Progress { get; set; }
        public float MinValue { get; set; }
        public float MaxValue { get; set; }

        private readonly Texture2D _progressBg, _progressFill, _progressMark;

        public JLoadingPane() {
            Visible = true;

            MinValue = 0f;
            Progress = 50f;
            MaxValue = 100f;

            _progressBg = Resources.Load("_Textures/GUI/ProgressBarBg") as Texture2D;
            _progressFill = Resources.Load("_Textures/GUI/ProgressBarFill") as Texture2D;
            _progressMark = Resources.Load("_Textures/GUI/ProgressBarMark") as Texture2D;

            GuiController.I.AddControl(this);
        }

        public override void OnGui() {
            Color oldColor = GUI.color;
            Color newColor = GUI.color;
            newColor.a = 1f; //1 - GuiController.I.FadeAlpha; // Для появления обратно пропорционально FadeOut
            GUI.color = newColor;
            float width = (Progress - MinValue) / MaxValue * 623;

            Progress = GUI.HorizontalSlider(new Rect(10, 10, 400, 30), Progress, 0, 100);

            GUI.DrawTexture(new Rect(Screen.width / 2 - 370, Screen.height / 2 - 25, 623, 50), _progressBg);
          
            GUI.DrawTexture(new Rect(Screen.width / 2 - 370, Screen.height / 2 - 25, width, 50), _progressFill); // Растягивает
            //GUI.DrawTextureWithTexCoords(new Rect(Screen.width / 2 - 370, Screen.height / 2 - 25, width, 50), _progressFill, new Rect(0, 0, width, 50)); // "Умная" функция. Какого-то хрена выводит полностью синюю заливку, а не текстуру.
            //Renderer2D.I.DrawTexture(new Rect(Screen.width / 2 - 370, Screen.height / 2 - 25, width, 50), _progressFill, new Color(0f, 0f, 0f, 0.5f), new Rect(0, 0, width, 50)); // Тут работает на GL, библиотека чужая. Результат аналогичен предыдущему.
            GUI.DrawTexture(new Rect(Screen.width / 2 + 260, Screen.height / 2 - 25, 109, 50), _progressMark);

            GUI.color = oldColor;
        }

        public override bool IsLoadingPane() { return true; }
}


PS: А что не так у гуя с полупрозрачностью? Текстурки по углам бывают засвеченные (заодно показал, как "неправильно" режет текстуру):
Сверху марка - из жабы, снизу - со скриншота.


Добавлено (08 Июн 2013, 18:54)
---------------------------------------------
Отбой тревоге. Для этого нужна "специально обученная" функция:
Код
        GUI.DrawTextureWithTexCoords(new Rect(Screen.width / 2 - 370, Screen.height / 2 - 25, width * 623, 50), _progressFill, new Rect(0, 0, width, 1), true);


Ректа координат текстуры задается не в пикселях, а в соотношении к максимуму (x/width).

Вопрос про полупрозрачность в силе. Почему?

Автор - Johnson
Дата добавления - 08 Июн 2013 в 18:54
Форум Игроделов » UNITY3D » DECAL, GUI, HUD » Как отрисовать ЧАСТЬ текстуры на GUI?
  • Страница 1 из 1
  • 1
Поиск:
Загрузка...

Game Creating CommUnity © 2009 - 2024