学习游戏制作记录(制作提示框以及使用键盘切换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脚本:

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