- Home /
C# GUI draw texture sliced
I have a texture , the type is Sprite (2D and UI) , sprite mode : Single , it is a 9-sliced-Sprite , but when i draw the texture , it seem like it was acting like a normal texture , not a 9-sliced-Sprite , the size of the edges of the texture is still increasing. I am trying to make a Drag Selection Box. This is my code :
Vector3 beforeVector;
public void OnGUI()
{
if (isDragging && !Paused)
{
Texture te = (Texture)Resources.Load(Paths.UIRectPath + "/SelectedRect");
GUI.DrawTexture(new Rect(beforeVector.x, Screen.height - beforeVector.y, Input.mousePosition.x - beforeVector.x, beforeVector.y - Input.mousePosition.y) , te);
// . . .
}
}
void Update()
{
if (Input.GetMouseButtonDown(0))
{
isDragging = true;
beforeVector = Input.mousePosition;
}
else if (Input.GetMouseButtonUp(0))
{
isDragging = false;
beforeVector = new Vector3();
}
}
How can i draw a sliced sprite (or texture) without creating a UI image in the canvas ? I tried using this method . but the image position and size is weird. This is one using UI image :
Rect tt = new Rect(beforeVector.x, Screen.height - beforeVector.y, Input.mousePosition.x - beforeVector.x, beforeVector.y - Input.mousePosition.y);
SelectionRect.GetComponent<RectTransform>().sizeDelta = tt.size;
SelectionRect.GetComponent<RectTransform>().localPosition = tt.position;
Answer by Bunny83 · Aug 26, 2017 at 11:51 AM
DrawTexture can't draw a 9-sliced image. Where do you think you specified the size of the border?
You can draw a 9-sliced image by using a GUIStyle. You can create a GUIStyle either by:
creating a GUISkin. This might be the best way when you have more than one such texture
using a public variable of type GUIStyle. Best approach for a single image when you like setting things up in the inspector
initialize the style at runtime via code.
What you have to do is:
assigning your testure as background image to the "normal" state.
set your pixel border for each edge in the "border" setting of the style. So you specify here how many pixel from left, from right, top and bottom should be fixed.
Finally just use the style either to draw any of the built-in elements (GUI.Label for example), or draw the style manually by calling one of it's
Draw()
methods during the Repaint event.
To initialize at runtime you can do something like:
public Texture2D myTexture;
GUIStyle myStyle = null;
void OnGUI()
{
if (myStyle == null)
{
myStyle = new GUIStyle("label"); // copy all settings of the label style
myStyle.normal.background = myTexture;
myStyle.border = new RectOffset(20, 20, 20, 20);
}
if (Event.current.type == EventType.Repaint)
myStyle.Draw(new Rect(/*Your rect here*/), false, false, false, false);
// or something like this:
GUI.Label(new Rect(/*Your rect here*/), "", myStyle);
}
If you created a GUISkin asset you would do something like this instead:
public GUISkin mySkin;
void OnGUI()
{
GUI.skin = mySkin;
GUI.Label(new Rect(/*Your rect here*/), "", "YourStyleName");
}
ps: If you already use gui space to draw the rect, you may want to use the Event class ins$$anonymous$$d of Input. It gives you the mouseposition in gui coordinates. For further information you may want to have a look at my I$$anonymous$$GUI crash course
pps: Another way could be to use a Sprite. This requires a SpriteRenderer component. Or you use the new UI system by using an Image component and setting up the proper border in the sprite editor
Your answer
Follow this Question
Related Questions
How to swap sprites? 1 Answer
C# timers - SetSprite_INTERNAL can only be called from the main thread. 1 Answer
confusion with sprites. 0 Answers
Different Views of 2D Sprites 1 Answer
confusion with sprites 0 Answers