自学内容网 自学内容网

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())。
过程:
  1. 清空现有内容

    • sb.Length = 0;:清空 StringBuilder 的内容,确保每次调用时是从头开始。
    • descriptionLength = 0;:重置描述的属性数量。
  2. 添加属性描述

    • 通过调用 AddItemDescription 方法,将每个属性的名称和数值添加到 sb 中。每个属性只有在其值不为零时才会被添加。
    • AddItemDescription(strength, "力量"); 会根据 strength 属性的值,添加如 "+ 10 力量" 的文本。
  3. 补充空行

    • 如果描述的属性数少于 5 个,方法会通过 sb.AppendLine() 添加空行,确保最终返回的描述文本至少有 5 行内容。
  4. 返回最终描述

    • 最后,sb.ToString() 将拼接好的描述文本作为字符串返回。

AddItemDescription()

原理:
  • AddItemDescription() 方法用于向 StringBuilder 中添加一行属性描述,只有当属性值 (_value) 不为零时才会执行添加操作。
  • 每次成功添加描述后,descriptionLength 会增加,记录当前添加的属性数量。
过程:
  1. 判断值是否为零

    • 如果 _value == 0,说明该属性没有实际值,因此不进行任何处理。
  2. 避免重复换行

    • 如果 sb.Length > 0,说明已经有内容添加到 StringBuilder 中,需要换行再添加新的描述行。
  3. 添加属性描述

    • 如果属性值 _value > 0,则将属性的描述格式化并添加到 sb 中。例如,属性为 strength = 10,会添加 "+ 10 力量"
  4. 增加已添加的属性数量

    • 每成功添加一个属性,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)!