【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili
教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/
本章节实现了技能树的UI设置
UI_SKillTreeSlot.cs
这段代码定义了一个技能树槽位的UI逻辑,提供了技能槽解锁的逻辑以及鼠标交互功能。
技能槽逻辑
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);
}
功能方法
-
ShowToolTip(string _skillDescription, string _skillName)
- 接收两个参数:技能名称(
_skillName
)和技能描述(_skillDescription
)。 - 将参数分别赋值给
skillName
和skillText
的文本内容。 - 设置提示框为可见状态(
gameObject.SetActive(true)
)。
- 接收两个参数:技能名称(
-
HideToolTip()
- 将提示框设置为不可见状态(
gameObject.SetActive(false)
)。 - 使用 Lambda 表达式 简化了函数写法。
- 将提示框设置为不可见状态(