学习游戏制作记录(制作提示框以及使用键盘切换UI)8.21

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\(); }** **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++; } }** ![](https://i-blog.csdnimg.cn/direct/203284683df945f3a50e7075a2708458.png) ## 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(); }** ![](https://i-blog.csdnimg.cn/direct/28b15f72a6c24123904f56ad97a3d6c4.png) ## 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); } }**