继上一篇文章,背包中已经得到物品。不过缺少显示和拖拽。这篇将实现其显示功能。
新建一个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();//返回文本
}
到此应该可以实现鼠标移到物品上提示框显示。