Part96:Skill Tree

Part96:Skill Tree(P130)

1:效果和操作

效果:实现技能合成树效果,本节充斥大量的ui操作
操作:
Part1:技能树前置后置关系设置:
利用onClick.AddListener检测各个slot的点击事件,shouldBeUnlocked为解锁前置条件,shouldBeUnlocked为技能冲突条件(不能同时进行),只有满足前置条件全部解锁且与之相关的冲突条件为未解锁状态时,才能进行当前技能的激活
Part2:技能简介设置
利用OnPointerEnter和OnPointerExit检测鼠标的进入和离开,当进入时计算出合适的ToolTip位置之后展示其位置,当离开时执行HideToolTip方法即可

2:代码改变

//UI脚本修改	
    public Ui_SkillToolTip skillToolTip;

//新增脚本UI_SkillTreeSlot
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using UnityEngine.WSA;

		public class UI_SkillTreeSlot : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler
{
    [SerializeField] private string skillName;
    [TextArea]
    [SerializeField] private string skillDescription;
    [SerializeField] private Color lockedSkillColor;

    private UI ui;

    public bool unlocked;

    private Image skillImage;
    [SerializeField] private UI_SkillTreeSlot[] shouldBeUnlocked;
    [SerializeField] private UI_SkillTreeSlot[] shouldBeLocked;


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

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

        skillImage.color = lockedSkillColor;

        ui = GetComponentInParent<UI>();

        GetComponent<Button>().onClick.AddListener(() => UnlockSkillSlot());//检测有按动作的点击事件,不必每次都检验是否点击了,该方法可以实现
    }

    public void UnlockSkillSlot()
    //如果有一个前置技能不该解锁(有技能冲突)或者该解锁的没解锁(前置技能未解锁),则无法解锁当前技能
    {
        for (int i = 0; i < shouldBeUnlocked.Length; i++)
        {
            if (shouldBeUnlocked[i].unlocked == false)
            //表示不该解锁的解锁了
            {
                Debug.Log("Cannot unlock skill");
                return;
            }
        }

        for (int i = 0; i < shouldBeLocked.Length; i++)
        {
            if (shouldBeLocked[i].unlocked == true)
            //表示需要解锁的没解锁
            {
                Debug.Log("Cannot unlock skill");
                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;

      	//根据鼠标的位置来看之tooltip的显示位置
        if (mousePosition.x > 600)
        {
            xOffset = -150;
        }
        else
        {
            xOffset = 150;
        }
        if (mousePosition.y > 200)
        {
            yOffset = -100;
        }
        else
        {
            yOffset = 100;
        }

        ui.skillToolTip.transform.position = new Vector2(mousePosition.x + xOffset, mousePosition.y + yOffset);
    }

    	public void OnPointerExit(PointerEventData eventData)
    {
        ui.skillToolTip.HideToolTip();
    }
}
//新增脚本UI_SkillToolTip
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;

		public class Ui_SkillToolTip : MonoBehaviour
{
    [SerializeField] private TextMeshProUGUI skillDescription;
    [SerializeField] private TextMeshProUGUI skillName;

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

    public void HideToolTip() => gameObject.SetActive(false);
}

3:效果图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值