Unity3d学习记录之背包系统(二)

继上一篇文章,背包中已经得到物品。不过缺少显示和拖拽。这篇将实现其显示功能。


新建一个image,重命名成Background,半透明后添加一个text,布局跟随父物体。复制text将其作为Background的父物体,重命名为ToolipUI,将Background布局跟随父物体。

在ToolipUI上添加Content Size Fitter(Script)用于自缩放,将其参数设置为Preferred Size。

在ToolipUI上添加一个ToolipUI脚本,用于控制物品文字显示和隐藏。将ToolipText赋值给outlineText,Text赋值给contentText。

因为限制了类型Text,所以赋值的也是两个组件上的Text组件。

public class ToolipUI : MonoBehaviour {

   public Text outlineText;
   public Text contentText;
   //更新两个Text
   public void UpdateToolipText(string text)
   {
     outlineText.text=text;
     contentText.text=text;
   }
  //显示
   public void ShowText()
  {
   gameObject.SetActive(true);
  }
  //隐藏
  public void HideText()
  {
   gameObject.SetActive(false);
  } 
  //
  public void SetLocalPosition(Vector2 position)
  {
    transform.localPosition=position; //返回自身位置
  }
}

在Grid创建一个GridUI脚本,该脚本继承MonoBehaviour, IPointerEnterHandler, IPointerExitHandler,后两个为接口,用于检测鼠标移动。将预制体中的Grid的标签设置为Grid,需要自行添加一个Tag,用于让鼠标检测到格子。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using System;
public class GridUI : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler,
{
   public static Action<Transform> OnEnter;
   public static Action OnExit;
   
   public void OnPointerEnter(PointerEventData eventData)//鼠标进入的接口函数
    {
        if (eventData.pointerEnter.tag == "Grid")
        {
            if (OnEnter != null)
                OnEnter(transform);
        }
    }
     public void OnPointerExit(PointerEventData eventData)//鼠标移开的接口函数
    {
        if (eventData.pointerEnter.tag == "Grid")
        {
            if (OnExit != null)
                OnExit();
        }
    }
}

让Grid有了接口后,在KnapscakUI脚本上注册接口并使用。

private bool isShow =false;
public ToolipUI ToolipUI;

private void Update()
{
 Vector2 postion;
 RectTransformUtility.ScreenPointToLocalPointInRectangle(GameObject.Find("Canvas").transform 
as RectTransform, Input.mousePosition, null, out postion);//得到鼠标所在画布上的位置

if(isShow)
{
 ToolipUI.ShowText();
 ToolipUI.SetLocalPosition(postion);//得到位置并显示提示框
}
}
   
private  void Awake()
 {
   /-----------------------------------------------/ //先前代码不变
    GridUI.OnEnter += GridUI_OnEnter;
    GridUI.OnExit += GridUI_OnExit;   //注册两个接口
  }


 public void GridUI_OnEnter(Transform ItemTransform)
    {
        Item item = ItemModel.GetItem(ItemTransform.name);
        if (item == null) return;
        string text = GetToolipUi(item);
        ToolipUI.UpdateToolipText(text);
        isShow = true;  
    }
public void GridUI_OnExit()
    {
        ToolipUI.HideText();
        isShow = false;
    }
private void GetToolipUi(Item item)
{
  //显示框文本编辑
}
 private string GetToolipUi(Item item)
    {
        if (item == null) return "";
        StringBuilder sb = new StringBuilder(); //使用StringBuilder,应添加using System;
        sb.AppendFormat("<color=red>{0}</color>\n\n", item.Name);
       //特有属性,利用switch case分类,可自行添加
        switch(item.ItemType)
        {
            case "Weapon":
                Weapon weapon = item as Weapon;
                sb.AppendFormat("攻击:{0}\n\n", weapon.Damage);
                break;
            default:
                break;
        }
      //共有的属性
        sb.AppendFormat(
            "<color=yellow><size=20>描述:{0}</size></color>", item.Description);
        return sb.ToString();//返回文本
    }

到此应该可以实现鼠标移到物品上提示框显示。

猜你喜欢

转载自blog.csdn.net/leanerU/article/details/82726228