Unity类银河战士恶魔城学习总结(P130 SkillTree UI 技能树)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili

教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/

本章节实现了技能树的UI设置

UI_SKillTreeSlot.cs

这段代码定义了一个技能树槽位的UI逻辑,提供了技能槽解锁的逻辑以及鼠标交互功能。

技能槽逻辑
  1. UnlockSkillSlot()
    • 前置解锁检查:遍历 shouldBeUnlocked,若存在未解锁的槽位,则禁止解锁并打印错误信息。
    • 锁定检查:遍历 shouldBeLocked,若存在已解锁的槽位,则禁止解锁并打印错误信息。
    • 如果检查通过,则:
      • 将当前槽位标记为已解锁(unlocked = true)。
      • 改变槽位显示颜色为白色(表示解锁成功)。
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;


//2024年11月17日
public class UI_SKillTreeSlot : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler
{
    private UI ui;
    private Image skillImage;//当前技能槽的图片组件

    [SerializeField] private string skillName;
    [TextArea]
    [SerializeField] private string skillDescription;
    [SerializeField] private Color lockedSkillColor;//技能未解锁时的颜色


    public bool unlocked;

    [SerializeField] private UI_SKillTreeSlot[] shouldBeUnlocked;//解锁前置条件
    [SerializeField] private UI_SKillTreeSlot[] shouldBeLocked;//锁定条件



    private void OnValidate()
    {
        gameObject.name = "SkillTreeSlot_UI - " + skillName;
    }

    private void Start()
    {
        skillImage = GetComponent<Image>();
        ui = GetComponentInParent<UI>();

        skillImage.color = lockedSkillColor;//设置初始颜色为锁定颜色

        GetComponent<Button>().onClick.AddListener(() => UnlockSkillSlot());//给 Button 组件绑定点击事件,用于触发技能槽解锁逻辑

    }

    public void UnlockSkillSlot()
    {
        for (int i = 0; i < shouldBeUnlocked.Length; i++)//前置解锁检查
        {
            if (shouldBeUnlocked[i].unlocked == false)
            {
                Debug.Log("不能锁定技能");
                return;
            }
        }

        for (int i = 0; i < shouldBeLocked.Length; i++)//锁定检查
        {
            if (shouldBeLocked[i].unlocked == true)
            {
                Debug.Log("不能解锁技能");
                return;
            }
        }
        unlocked = true;
        skillImage.color = Color.white;

    }

    public void OnPointerEnter(PointerEventData eventData)
    {
        ui.skillToolTip.ShowToolTip(skillDescription, skillName);

        Vector2 mousePosition = Input.mousePosition;

        float xOffset = 0;
        float yOffset = 0;


        if (mousePosition.x > 600)
            xOffset = -150;
        else
            xOffset = 150;//鼠标靠近屏幕右侧时,提示框向左偏移;否则向右偏移

        if (mousePosition.y > 320)

            yOffset = -150;
        else
            yOffset = 150;//鼠标靠近屏幕顶部时,提示框向下偏移;否则向上偏移


        ui.skillToolTip.transform.position = new Vector2(mousePosition.x + xOffset, mousePosition.y + yOffset);//更新提示框位置为鼠标位置偏移后的点
    }

    public void OnPointerExit(PointerEventData eventData)
    {
        ui.skillToolTip.HideToolTip();//鼠标离开槽位时,隐藏技能描述提示框
    }
}

UI_SkillToolTip.cs

using TMPro;
using UnityEngine;

public class UI_SkillToolTip : MonoBehaviour
{
    [SerializeField] private TextMeshProUGUI skillText;//显示技能描述的文本组件
    [SerializeField] private TextMeshProUGUI skillName;

    public void ShowToolTip(string _skillDescprtion, string _skillName)
    {
        skillName.text = _skillName;
        skillText.text = _skillDescprtion;
        gameObject.SetActive(true);
    }

    public virtual void HideToolTip() => gameObject.SetActive(false);
}
功能方法
  1. ShowToolTip(string _skillDescription, string _skillName)

    • 接收两个参数:技能名称(_skillName)和技能描述(_skillDescription)。
    • 将参数分别赋值给 skillNameskillText 的文本内容。
    • 设置提示框为可见状态(gameObject.SetActive(true))。
  2. HideToolTip()

    • 将提示框设置为不可见状态(gameObject.SetActive(false))。
    • 使用 Lambda 表达式 简化了函数写法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值