Word Wrapping GUIText

I hear it can’t be done: “GUIText does not have word wrap, skins, or anything else from OnGUI. GUIText and GUITextures are separate objects, from the Unity 1.x days, though they are still useful for some things since OnGUI can be problematic depending on what you’re doing.
–Eric”

However, that was a couple years ago – is it possible yet? I can’t use GUILayout because I need to be able to put the text underneath other object.

Thanks!

Answered:

I modified the code found here: http://forum.unity3d.com/threads/31351-GUIText-width-and-height

function FormatString ( text : String ) { 
	words = text.Split(" "[0]); //Split the string into seperate words 
    result = ""; 

	for( var index = 0; index < words.length; index++)
	{ 
		var word = words[index].Trim(); 
		if (index == 0) {
			result = words[0]; 
			block.text = result; 
		} 

		if (index > 0 ) { 
			result += " " + word; 
			block.text = result; 
		} 
		TextSize = block.GetScreenRect(); 
		if (TextSize.width > lineLength)
		{ 
			//remover 
			result = result.Substring(0,result.Length-(word.Length)); 
			result += "

" + word;
numberOfLines += 1;
block.text = result;
}
}
}

Not sure if anyone still needs this but I used the code from sfbaystudios, and modified it in C# so that it also takes in the line width. Heres my code:

	string wrapString(string msg, int width) {
	string[] words = msg.Split (" " [0]);
	string retVal = ""; //returning string 
	string NLstr = "";  //leftover string on new line

	for (int index = 0 ; index < words.Length ; index++ ) {
		string word = words[index].Trim();
		//if word exceeds width
		if (words[index].Length >= width+2) {
			string[] temp = new string[5];
			int i = 0;
			while (words[index].Length > width) { //word exceeds width, cut it at widrh
				temp *= words[index].Substring(0,width) +"

"; //cut the word at width*

  •   			words[index] = words[index].Substring(width); 	//keep remaining word*
    
  •   			i++;*
    
  •   			if (words[index].Length <= width) { //the balance is smaller than width*
    

_ temp = words[index];_
_ NLstr = temp*;
}
}
retVal += "
“;
for (int x = 0 ; x < i+1 ; x++) { //loops through temp array*
* retVal = retVal+temp;
}
}
else if (index == 0) {
retVal = words[0];
NLstr = retVal;
}
else if (index > 0) {
if (NLstr.Length + words[index].Length <= width ) {
retVal = retVal+” “+words[index];
NLstr = NLstr+” "+words[index]; //add the current line length*
* }
else if (NLstr.Length + words[index].Length > width) {
retVal = retVal+ "
" + words[index];
NLstr = words[index]; //reset the line length*
* print ("newline! at word "+ words[index]);
}
}
}
return retVal;
}
EDIT: Updated code, now it checks for long words that exceed width and splits them.
i.e. “BoooooooMz !!” with a width of 6 would give:
“Booooo” “ooMz !” “!” in new lines each.*_

I tried using GUIText too but it doesnt have word wrapping feature. The simplest thing to do is use GUIStyle and customize the font in the inspector. Just make sure to check Word Wrap in the inspector. This is my code:

private var descriptionText : String;
var descriptionStyle : GUIStyle;

function Start()
{
	descriptionText = "Multi-line text here";
}

function OnGUI()
{
	 GUI.Button (Rect (10,70, 100, 20), descriptionText, descriptionStyle);
}