Третий час бьюсь и интернет рою, ни как не могу разобраться.
Делаю свою обертку на 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; }
_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;
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) --------------------------------------------- Отбой тревоге. Для этого нужна "специально обученная" функция: