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);
}
}