1.制作裝備提示框
創建提示框,添加文本子對象,用來描述名稱,類型以及屬性加成
掛載垂直分配組件和文本大小適配組件,這樣圖像會根據文本大小來調整自己
創建UI_ItemTip腳本并掛載在文本框上:
? ? [SerializeField] private TextMeshProUGUI itemStringName;//三個文本
[SerializeField] private TextMeshProUGUI itemTypeName;
[SerializeField] private TextMeshProUGUI itemDescription;
? ? [SerializeField] private float defaultFontSize = 60;//默認文本大小
void Start()
{
? ? }
? ? public void ShowToolTip(ItemData_Equipment item)//提示函數
{
if (item == null) return;
? ? ? ? itemStringName.text = item.ItemName;
itemTypeName.text = item.equipmentType.ToString();
itemDescription.text = item.GetDescription();//獲取相應的文本
? ? ? ? if(itemStringName.text.Length >13)//防止標題的字體大小過大
{
itemStringName.fontSize =itemStringName.fontSize*.7f ;
}
gameObject.SetActive(true);
}
? ? public void HideToolTip()//關閉函數
{
itemStringName.fontSize = defaultFontSize;
gameObject.SetActive(false);
? ? }
UI腳本:
[SerializeField]public UI_ItemTip tip;//獲取提示框
UI_ItemSlot腳本:
實現IPointerEnterHandler,IPointerExitHandler接口
分別會在鼠標懸浮在物品槽和離開物品槽時調用
? ? public UI ui;//獲取ui
? ? private void Start()
{
ui=GetComponentInParent<UI>();
}
? ? public void OnPointerEnter(PointerEventData eventData)
{
if (Item == null) return;
? ? ? ? ui.tip.ShowToolTip(Item.data as ItemData_Equipment);//顯示當前物品的數據
}
? ? public void OnPointerExit(PointerEventData eventData)
{
if(Item == null) return;
? ? ? ? ui.tip.HideToolTip();
}
ItemData腳本:
? ? public StringBuilder sb = new StringBuilder();//字符串構建,用來創建屬性的描述
? ? public virtual string GetDescription()
{
return " ";
}
ItemData_Equipmen腳本:
?public int DescriptionLength;//記錄文本的行數
? ? public override string GetDescription()
{
sb.Length = 0;
DescriptionLength = 0;
? ? ? ? AddItemDescription(strength, "力量");//添加描述
AddItemDescription(agility, "敏捷");
AddItemDescription(intelligence, "智力");
AddItemDescription(valitity, "活力");
? ? ? ? AddItemDescription(damage, "傷害");
AddItemDescription(critChance, "暴擊率");
AddItemDescription(critPower, "暴擊傷害");
? ? ? ? AddItemDescription(maxHealth, "最大生命");
AddItemDescription(armor, "護甲");
AddItemDescription(evasion, "閃避");
AddItemDescription(magicResistence, "魔法抗性");
? ? ? ? AddItemDescription(fireDamage, "火焰傷害");
AddItemDescription(iceDamage, "冰凍傷害");
AddItemDescription(lightingDamage, "雷電傷害");
? ? ? ? if(DescriptionLength<5)//不足5行則填空,更加美觀
{
for(int i = 0; i < 5-DescriptionLength; i++)?
{
sb.AppendLine();
sb.Append(" ");
}
}
? ? ? ? return sb.ToString();
}
? ? private void AddItemDescription(int value, string itemname)//添加屬性描述
{
if (value != 0)
{
if(sb.Length > 0)
{
sb.AppendLine();//換行的作用
}
? ? ? ? ? ? if(value>0)
{
sb.AppendLine("+"+value+" "+itemname);
? ? ? ? ? ? }
? ? ? ? ? ? DescriptionLength++;
}
}
2.制作屬性提示框
創建一個類似上面的提示框,但是只需要一個描述文本即可
創建UI_StatToolTip腳本并掛載在提示框上:
? ? [SerializeField] private TextMeshProUGUI statDescription;//獲取文本
? ? public void ShowStatToolTip(string _text)
{
statDescription.text = _text;//設置
gameObject.SetActive(true);//激活提示框
}
? ? public void HideStatToolTip()//關閉
{
statDescription.text = " ";
gameObject.SetActive(false);
}
UI腳本:
? ? [SerializeField] public UI_StatToolTip statTip;
UI_StatSlot腳本:
同樣實現IPointerEnterHandler,IPointerExitHandler接口
? ? [TextArea]
[SerializeField] private string statDescription;//該槽位對應的文本描述,自行設置
? ? private UI ui;
? ? public void OnPointerEnter(PointerEventData eventData)//調用即可
{
ui.statTip.ShowStatToolTip(statDescription);
}
? ? public void OnPointerExit(PointerEventData eventData)
{
ui.statTip.HideStatToolTip();
}
3.實現鍵盤切換UI:
UI腳本:
[SerializeField] private GameObject Character;//獲取四大面板
[SerializeField] private GameObject Craft;
[SerializeField] private GameObject SkillTree;
[SerializeField] private GameObject Options;
? ? void Start()//初始化默認不打開面板和提示框
{
SwithTo(null);
? ? ? ?ItemTip.gameObject.SetActive(false);
statTip.gameObject.SetActive(false);
}
? ? public void SwithWithKey(GameObject _menu)
{
if(_menu!=null&&_menu.activeSelf)//再次按下同樣的按鍵則關閉面板
{
_menu.SetActive(false);
return;
}
? ? ? ? SwithTo(_menu);
? ? }
? ? void Update()
{
if(Input.GetKeyDown(KeyCode.C))//四個面板以及對應的按鍵
{
SwithWithKey(Character);
}
if(Input .GetKeyDown(KeyCode.B))
{
SwithWithKey(Craft);
}
if(Input.GetKeyDown(KeyCode.K))
{
SwithWithKey(SkillTree);
}
if(Input.GetKeyDown(KeyCode.O))
{
SwithWithKey(Options);
}
}