Page 1 of 1

Unity: Hvordan skifter jeg farve på tooltip tekst?

Posted: 03 Jul 2014, 00:29
by Møkz
Hej allesammen.

Måske er der nogen herinden der kan hjælpe mig med mit script. ;)

Jeg er ved at lave et Inventory system, og inventory scriptet er også ansvarlig for at vise tooltips for 'items', som spilleren 'hover' over med musen inde i inventoriet.

Scriptet som jeg har lavet indtil videre er dette (husk, scriptet bruger andre scripts, f.eks. et for item databasen, og så Item classen):

Code: Select all

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class Inventory : MonoBehaviour 
{
	public int slotsX, slotsY;
	public GUISkin skin;
	public List<Item> inventory = new List<Item>();
	public List<Item> slots = new List<Item>();
	public bool showInventory;
	private ItemDatabase database;
	private bool showTooltip;
	private string tooltip;

	private bool draggingItem;
	private Item draggedItem;
	private int prevIndex;


	
	void Start () 
	{
		for(int i = 0; i < (slotsX * slotsY); i++)
		{
			slots.Add(new Item());
			inventory.Add(new Item());
		}
		database = GameObject.FindGameObjectWithTag("Item Database").GetComponent<ItemDatabase>();
		AddItem(101);
		AddItem(0);
		AddItem(1);
		AddItem(201);

	}

	void Update()
	{
		if(Input.GetButtonDown ("Inventory"))
		{
			showInventory = !showInventory;
		}
	}

	void OnGUI()
	{
		tooltip = "";
		GUI.skin = skin;

		if(showInventory)
		{
			DrawInventory();

			if(showTooltip)
//				GUI.Box (new Rect(Event.current.mousePosition.x + 30f, Event.current.mousePosition.y, 200, 200), tooltip, skin.GetStyle("Tooltip"));
				DrawTooltip();
		}

		if(draggingItem)
		{
			GUI.DrawTexture(new Rect(Event.current.mousePosition.x, Event.current.mousePosition.y, 50, 50), draggedItem.itemIcon);
			Screen.showCursor = false;
		}

	}

	// This method draws the inventory
	void DrawInventory()
	{
		Event e = Event.current;
		int i = 0;
		for(int y = 0; y < slotsY; y++)
		{
			for(int x = 0; x < slotsX; x++)
			{
				Rect slotRect = new Rect(x * 50, y * 50, 50, 50);
				Item item  = slots[i];
				GUI.Box(slotRect, "", skin.GetStyle("Slot"));
				slots[i] = inventory[i];

				if(slots[i].itemName != null)
				{
					GUI.DrawTexture(slotRect, slots[i].itemIcon);
					if(slotRect.Contains(e.mousePosition))
					{
						tooltip = CreateTooltip(slots[i]);
						showTooltip = true;
						if(e.button == 0 && e.type == EventType.mouseDrag && !draggingItem)
						{
							draggingItem = true;
							prevIndex = i;
							draggedItem = slots[i];
							inventory[i] =  new Item();
						}
						if(e.type == EventType.mouseUp && draggingItem)
						{
							inventory[prevIndex] = inventory[i];
							inventory[i] = draggedItem;
							draggingItem = false;
							draggedItem = null;
							Screen.showCursor = true;
						}

						if(e.isMouse && e.type == EventType.mouseDown && e.button == 1)
						{
							if(item.itemType == Item.ItemType.Consumable)
							{
								UseConsumable(slots[i], i, true);
							}
						}
					}

				} 
				else
				{
					if(slotRect.Contains(e.mousePosition))
					{
						if(e.type == EventType.mouseUp && draggingItem)
						{
							inventory[i] = draggedItem;
							draggingItem = false;
							draggedItem = null;
							Screen.showCursor = true;
						}
					}
				}

				if(tooltip == "")
				{
					showTooltip = false;
				}
				i++;
			}
		}
	}

	private void DrawTooltip()
	{
		float dynamicSize = skin.box.CalcHeight(new GUIContent(tooltip), 200);

		GUI.Box (new Rect(Event.current.mousePosition.x + 30f, Event.current.mousePosition.y, 200, dynamicSize), tooltip, skin.GetStyle("Tooltip"));
	}

	string CreateTooltip(Item item)
	{
//		string col;
//		if(item.itemRarity == Item.Rarity.Common)
//		{
//			col = "<color=#f2f2f>";
//		}
		tooltip = "<color=#91492f>" + item.itemName + "</color>\n\n" + "<color=#401F12>" + item.itemDescription + "</color>\n\n" + "Rarity: " + item.itemRarity;
		return tooltip;
	}

	// This method is used to add items to the inventory, 
	// based on the id-number provided
	public void AddItem(int id)
	{
		for(int i = 0; i < inventory.Count; i++)
		{
			if(inventory[i].itemName == null)
			{
				for(int j = 0; j < database.items.Count; j++)
				{
					if(database.items[j].itemID == id)
					{
						inventory[i] = database.items[j];
					}
				}
				break;
			}
		}
	}


	public void AddItemName(string item)
	{
		for(int i = 0; i < inventory.Count; i++)
		{
			if(inventory[i].itemName == null)
			{
				for(int j = 0; j < database.items.Count; j++)
				{
					if(database.items[j].itemName == item)
					{
						inventory[i] = database.items[j];
					}
				}
				break;
			}
		}
	}



	// Use this method to remove the first item with the
	// specified ID number
	public void RemoveItem(int id)
	{
		for(int i = 0; i < inventory.Count; i++)
		{
			if(inventory[i].itemID == id)
			{
				inventory[i] = new Item();
				break;
			}
		}
	}

	// Use this method to remove ALL items with the
	// specified ID number
	public void RemoveAll(int id)
	{
		for(int i = 0; i < inventory.Count; i++)
		{
			if(inventory[i].itemID == id)
			{
				inventory[i] = new Item();
			}
		}
	}

	// This method checks to see whether an item with a 
	// specified id-number is in the inventory
	public bool InventoryContains(int id)
	{
		bool result = false;
		for(int i = 0; i < inventory.Count; i++)
		{
			result = inventory[i].itemID == id;
			if(result)
			{
				break;
			}
		}
		return result;
	}

	private void UseConsumable(Item item, int slot, bool deleteItem)
	{
		switch(item.itemID)
		{
			case 0:
			{
				print ("Used Consumable: "  + item.itemName);
				break;
			}
			case 1:
			{
				print ("Used Consumable: "  + item.itemName);
				break;
			}
		}

		if(deleteItem)
			inventory[slot] = new Item();
	}
}
Det jeg gerne vil have scriptet skal gøre er, hvis i set i linje 144, inde i CreateTooltip metoden, er, at den gerne skulle vise navnet på det givne item med en specifik farve, som er bestemt ud fra Item Rarity, hvilket er defineret for hvert item i Item classen, og sat når itemmet bliver sat ind i Item Databasen.

Nogen idé til hvordan jeg får dét lavet?

Ps. hvis beskrivelsen ikke giver mening, så må i lige sige til ;)

Re: Unity: Hvordan skifter jeg farve på tooltip tekst?

Posted: 03 Jul 2014, 13:01
by Kristian Hedeholm
Hej Møkz

Jeg må desværre fortælle dig, at du laver en del små begynder fejl med dit indlæg.

Først fremmest så skal man ALDRIG poste en hel class. Der er så mange linjer kode i dit indlæg, som ikke har noget somhelst med dit problem at gøre. I stedet gør du det bare mere uoverskueligt for den, som rent faktisk gerne vil hjælpe dig, med at finde ud af hvor problemet ligger.

Du bliver nød til at finde frem til, hvor præcis i din kode fejl kan være - det andet sender lidt et signal der siger "jeg har fundet en fejl i min kode, men jeg gider ikke rette den selv, kan I ikke gøre det for mig?" Så kan du selv regne ud hvor meget held man har med den slags ;)

Dernæst refererer du til linje 144, men det er lidt svært at finde linje 144 - når linjerne i din kode ikke numereret.

Får at svare på dit spørgsmål, så lyder det som om at du bør prøve at undersøge GUIStyle typen ( hvis du laver en public GUIStyle myGUIStyle variable, kan du ændre alle parameter via Inspectoren) og dernæst bør du også kigge på GUIText. Hvis du enabler Rich Text på den, kan du nemlig bruge HTML formating i tekst feltet.

Re: Unity: Hvordan skifter jeg farve på tooltip tekst?

Posted: 03 Jul 2014, 18:34
by Møkz
Hej Møkz

Jeg må desværre fortælle dig, at du laver en del små begynder fejl med dit indlæg.

Først fremmest så skal man ALDRIG poste en hel class. Der er så mange linjer kode i dit indlæg, som ikke har noget somhelst med dit problem at gøre. I stedet gør du det bare mere uoverskueligt for den, som rent faktisk gerne vil hjælpe dig, med at finde ud af hvor problemet ligger.

Du bliver nød til at finde frem til, hvor præcis i din kode fejl kan være - det andet sender lidt et signal der siger "jeg har fundet en fejl i min kode, men jeg gider ikke rette den selv, kan I ikke gøre det for mig?" Så kan du selv regne ud hvor meget held man har med den slags ;)

Dernæst då refererer du til linje 144, men det er lidt svært at finde linje 144 - når linjerne i din kode ikke numereret.

Får at svare på dit spørgsmål, så lyder det som om at du bør prøve at undersøge GUIStyle typen ( hvis du laver en public GUIStyle myGUIStyle variable, kan du ændre alle parameter via Inspectoren) og dernæst bør du også kigge på GUIText. Hvis du enabler Rich Text på den, kan du nemlig bruge HTML formating i tekst feltet.
Fair nok, det må jeg jo så huske til næste gang. ;)

Det var dog bestemt ikke meningen at jeg ville fremstå som om jeg bare ikke gider finde en løsning selv, og det er heller ikke fordi der er en error, som jeg ikke kan finde ud af. Spørgsmålet gik på, om der er en der kan se en eller anden smart løsning på mit problem. Derfor synes jeg også det er relevant nok at give hele scriptet, så man kan se, om jeg eventuelt kunne bruge nogle andre af mine methods til at løse det.

Ikke for at lyde som en nar, men at du foreslår at bruge GUIstyles indikerer at du ikke har kigget på scriptet. Jeg bruger allerede GUISkin, hvilket jo er en samling af mange GUIStyles i ét Skin. Så teknisk set bruger jeg allerede GYUStyle. GUIText kan desværre ikke bruges til formålet her. Rich Text er allerede slået til, ellers gav det j o ingen mening, at jeg skriver ""<color=#91492f>" + item.itemName + "</color>">. At scriptet ikke er linjeret er min fejl - Jeg troede det var standard, og glemte at kigge på preview. Jeg undskylder ;) Kunne have lagt det ud på pastebin eller noget - Det vil jeg gøre en anden gang.

Jeg tager fejlene til mig, og prøver at gøre fremtidige posts bedre så. ;)

Re: Unity: Hvordan skifter jeg farve på tooltip tekst?

Posted: 03 Jul 2014, 20:23
by Møkz
Jeg har selv fundet en løsning.

Jeg har lavet en Array som indeholder strings for alle de farver jeg vil have for de forskellige rarities;
f.eks. <color=#99008C> for et sjældent item.

Code: Select all

public string[] rarityColor = new string[5]; // 5 is the number of different rarities
Når scriptet viser tooltippet for det item, som man hover over, bliver navnets farve nu defineret udfra sjældenheden af itemet således:

Code: Select all

tooltip = "<color=#" + rarityColor[(int)item.itemRarity] + ">" + item.itemName + "</color>\n\n" + "<color=#401F12>" + item.itemDescription + "</color>\n\n" + "Rarity: " + item.itemRarity;
return tooltip;
Så har ikke brug for hjælp mere. :)

Re: Unity: Hvordan skifter jeg farve på tooltip tekst?

Posted: 04 Jul 2014, 10:46
by Kristian Hedeholm
Fedt du fandt en løsning selv!

En lille followup (som jeg nok glemete at skrive i min oprindelige post) er at rigtig mange nybegynder på eksempelvis stack overflow laver tricket med at poste en hel class, hvorefter de så forventer at folk løser problemet for dem. Så det var lidt den effekt der bliver triggered når jeg så at du poste en hel class.

At det så handlede om at du gerne vil finde på en smartere løsning synes jeg er ganske fint - så havde jeg nok bare valgt at præsentere koden på et lidt mere highlevel i stedet for + nævnt det i oplægget ;)

Angående mit lidt dårlige svar, så har du helt ret. Jeg kiggede ikke hele dit script igennem, fordi det vil tage alt for meget af min tid at sætte mig ind i, hvad det var du havde gang i. Omvendt synes jeg heller ikke det var helt fair bare at nævne alle dine begynderfejl uden at hjælpe dig bare en lille smule :)