Unity类银河战士恶魔城学习总结(P126 Item ToolTip物品提示)
【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili
教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/
本章节实现了把鼠标放到物品上面就会显示物品属性
UI_ItemTooltip.cs
- 功能实现:该脚本的核心功能是展示和隐藏物品的工具提示。通过将物品的名称、类型和描述文本绑定到UI元素上,玩家可以看到相关信息。工具提示的显示和隐藏通过激活和禁用
GameObject
来控制。 - 灵活性:脚本通过传入一个
ItemData_Equipment
类型的物品对象来动态显示物品的相关信息,使得这个功能可以适应不同类型的物品。
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
public class UI_ItemTooltip : MonoBehaviour
{
[SerializeField] private TextMeshProUGUI itemNameText; // 名称显示文本
[SerializeField] private TextMeshProUGUI itemTypeText; // 类型显示文本
[SerializeField] private TextMeshProUGUI itemDescription;// 描述显示文本
//[SerializeField] private int defaultFontSize=32;
public void ShowToolTIp(ItemData_Equipment item)//于显示工具提示,当玩家鼠标悬停在物品上时调用
{
if(item == null)
return;
itemNameText.text = item.itemName;
itemTypeText.text = item.equipmentType.ToString();
itemDescription.text = item.GetDescription();
//修改字体大小,防止字体过长
//if(itemDescription.text.Length > 12)
// itemNameText.fontSize = itemNameText.fontSize * .7f;
//else
// itemNameText.fontSize = defaultFontSize;
gameObject.SetActive(true);
}
public void HideToolTip()//该方法用于隐藏工具提示,当玩家离开物品时调用
{
//itemNameText.fontSize = defaultFontSize;
gameObject.SetActive(false);
}
}
UI.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class UI : MonoBehaviour
{
[SerializeField] private GameObject characterUI;
public UI_ItemTooltip itemToolTip;
void Start()
{
//itemTooltip = GetComponentInChildren<UI_ItemTooltip>();
}
void Update()
{
}
public void SwitchTo(GameObject _menu)
{
for(int i =0;i<transform.childCount;i++)
{
transform.GetChild(i).gameObject.SetActive(false);//遍历并隐藏所有子元素
}
if(_menu !=null)
{
_menu.SetActive(true);
}
}
}
ItemData.cs
构造了一个函数GetDescription(),用于取得物品描述,主要用于覆写
using System.Text;
using UnityEngine;
//2024年10月31日
//在敌人图层之上,可以看得到
public enum ItemType
{
Material,
Equipment
}
[CreateAssetMenu(fileName = "New Item Data", menuName = "Data/Item")]//在资源管理器中创建新的Item,创建的物品自带这个脚本
public class ItemData : ScriptableObject //在编辑器中创建和编辑的类
{
public ItemType itemType;//定义你的物品的类型
public string itemName;//定义你的物品的名字
public Sprite icon;//可以选择图标
[Range(0,100)]
public float dropChance;//掉落几率
protected StringBuilder sb = new StringBuilder();//创建一个字符串生成器
public virtual string GetDescription()//虚方法,返回一个字符串
{
return "";
}
}
ItemData_Equipment.cs
增加部分,两个构造函数
这段代码是用于生成一个物品描述字符串的,描述物品的各个属性(如力量、敏捷、伤害等),并通过 GetDescription()
方法将这些属性汇总为一段文本返回。
GetDescription()
原理:
GetDescription()
方法的目的是生成并返回一个物品的详细描述。描述包括多个属性,如力量、敏捷、伤害等。- 每个属性通过
AddItemDescription
方法被逐一添加到描述字符串中。 - 使用了一个
StringBuilder
(sb
) 来拼接描述文本,descriptionLength
用于记录已添加的属性数量。 - 如果描述的属性少于 5 个,方法会在末尾补充空行(通过
sb.AppendLine()
)。
过程:
-
清空现有内容:
sb.Length = 0;
:清空StringBuilder
的内容,确保每次调用时是从头开始。descriptionLength = 0;
:重置描述的属性数量。
-
添加属性描述:
- 通过调用
AddItemDescription
方法,将每个属性的名称和数值添加到sb
中。每个属性只有在其值不为零时才会被添加。 AddItemDescription(strength, "力量");
会根据strength
属性的值,添加如 "+ 10 力量" 的文本。
- 通过调用
-
补充空行:
- 如果描述的属性数少于 5 个,方法会通过
sb.AppendLine()
添加空行,确保最终返回的描述文本至少有 5 行内容。
- 如果描述的属性数少于 5 个,方法会通过
-
返回最终描述:
- 最后,
sb.ToString()
将拼接好的描述文本作为字符串返回。
- 最后,
AddItemDescription()
原理:
AddItemDescription()
方法用于向StringBuilder
中添加一行属性描述,只有当属性值 (_value
) 不为零时才会执行添加操作。- 每次成功添加描述后,
descriptionLength
会增加,记录当前添加的属性数量。
过程:
-
判断值是否为零:
- 如果
_value == 0
,说明该属性没有实际值,因此不进行任何处理。
- 如果
-
避免重复换行:
- 如果
sb.Length > 0
,说明已经有内容添加到StringBuilder
中,需要换行再添加新的描述行。
- 如果
-
添加属性描述:
- 如果属性值
_value > 0
,则将属性的描述格式化并添加到sb
中。例如,属性为strength = 10
,会添加"+ 10 力量"
。
- 如果属性值
-
增加已添加的属性数量:
- 每成功添加一个属性,
descriptionLength
会自增 1。
- 每成功添加一个属性,
public override string GetDescription()
{
sb.Length = 0;//确保每次调用时是从头开始
descriptionLength = 0;//重置描述的属性数量
AddItemDescription(strength, "力量");
AddItemDescription(agility, "敏捷");
AddItemDescription(intelligence, "智力");
AddItemDescription(vitality, "活力");
AddItemDescription(damage, "伤害");
AddItemDescription(critChance, "暴击率");
AddItemDescription(critPower, "暴击伤害");
AddItemDescription(maxHealth, "生命值");
AddItemDescription(armor, "护甲");
AddItemDescription(evasion, "闪避");
AddItemDescription(magicResistance, "魔抗");
AddItemDescription(fireDamage, "火焰伤害");
AddItemDescription(iceDamage, "冰霜伤害");
AddItemDescription(lightningDamage, "闪电伤害");
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 _name)
{
if (_value != 0)//判断该属性没有实际值
{
if(sb.Length > 0)
sb.AppendLine();//换行
if (_value > 0)
//sb.Append(_name+";"+_value);
sb.Append("+ "+_value + " "+ _name);//添加属性描述
descriptionLength++;//每成功添加一个属性
}
}
using System.Collections.Generic;
using UnityEngine;
//2024年11月1日
public enum EquipmentType
{
Weapon,
Armor,
Amulet,//护身符
Flask//药水瓶
}
[CreateAssetMenu(fileName = "New Item Data", menuName = "Data/Equipment")]//因为继承了ItemData,所以在资源管理器中创建新的Item,创建的物品自带这个脚本
public class ItemData_Equipment : ItemData
{
public EquipmentType equipmentType;
public float itemCoolDown;//物品冷却时间
public ItemEffect[] itemEffects;//可以添加物品的效果
[Header("主属性")]
public int strength;//力量,1点增加1攻击力和%1爆伤
public int agility;//敏捷,1点增加1%闪避和%1暴击率
public int intelligence;//智力,1点增加1法术强度和%1魔抗
public int vitality;//活力,1点增加3生命值
[Header("攻击属性")]
public int damage;
public int critChance;//暴击率
public int critPower;//暴击伤害,默认%150
[Header("防守属性")]
public int maxHealth;
public int armor;//护甲
public int evasion;//闪避
public int magicResistance;//魔抗
[Header("魔法属性")]
public int fireDamage;
public int iceDamage;
public int lightningDamage;
[Header("制作需求")]//Craft requirements
public List<InventoryItem> craftingMaterials;
private int descriptionLength;
public void Effect(Transform _enemyPositon)//执行物品效果
{
foreach(var item in itemEffects)
{
item.ExcuteEffect(_enemyPositon);
}
}
public void AddModifiers()
{
PlayerStats playerStats = PlayerManager.instance.player.GetComponent<PlayerStats>();
playerStats.strength.AddModifier(strength);
playerStats.agility.AddModifier(agility);
playerStats.intelligence.AddModifier(intelligence);
playerStats.vitality.AddModifier(vitality);
playerStats.damage.AddModifier(damage);
playerStats.critChance.AddModifier(critChance);
playerStats.critPower.AddModifier(critPower);
playerStats.maxHealth.AddModifier(maxHealth);
playerStats.armor.AddModifier(armor);
playerStats.evasion.AddModifier(evasion);
playerStats.magicResistance.AddModifier(magicResistance);
playerStats.fireDamage.AddModifier(fireDamage);
playerStats.iceDamage.AddModifier(iceDamage);
playerStats.lightningDamage.AddModifier(lightningDamage);
}
public void RemoveModifiers()
{
PlayerStats playerStats = PlayerManager.instance.player.GetComponent<PlayerStats>();
playerStats.strength.RemoveModifier(strength);
playerStats.agility.RemoveModifier(agility);
playerStats.intelligence.RemoveModifier(intelligence);
playerStats.vitality.RemoveModifier(vitality);
playerStats.damage.RemoveModifier(damage);
playerStats.critChance.RemoveModifier(critChance);
playerStats.critPower.RemoveModifier(critPower);
playerStats.maxHealth.RemoveModifier(maxHealth);
playerStats.armor.RemoveModifier(armor);
playerStats.evasion.RemoveModifier(evasion);
playerStats.magicResistance.RemoveModifier(magicResistance);
playerStats.fireDamage.RemoveModifier(fireDamage);
playerStats.iceDamage.RemoveModifier(iceDamage);
}
public override string GetDescription()
{
sb.Length = 0;
descriptionLength = 0;
AddItemDescription(strength, "力量");
AddItemDescription(agility, "敏捷");
AddItemDescription(intelligence, "智力");
AddItemDescription(vitality, "活力");
AddItemDescription(damage, "伤害");
AddItemDescription(critChance, "暴击率");
AddItemDescription(critPower, "暴击伤害");
AddItemDescription(maxHealth, "生命值");
AddItemDescription(armor, "护甲");
AddItemDescription(evasion, "闪避");
AddItemDescription(magicResistance, "魔抗");
AddItemDescription(fireDamage, "火焰伤害");
AddItemDescription(iceDamage, "冰霜伤害");
AddItemDescription(lightningDamage, "闪电伤害");
if (descriptionLength < 5)//
{
for (int i = 0; i < 5 - descriptionLength; i++)
{
sb.AppendLine();
sb.Append("");
}
}
return sb.ToString();
}
private void AddItemDescription(int _value, string _name)
{
if (_value != 0)
{
if(sb.Length > 0)
sb.AppendLine();
if(_value > 0)
//sb.Append(_name+";"+_value);
sb.Append("+ "+_value + " "+ _name);
descriptionLength++;
}
}
}
原文地址:https://blog.csdn.net/suzh1qian/article/details/143763621
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!