接下来就是暂时告一段落的最后一个功能了——当鼠标悬停于有物品的格子的时候,显示相应的物品信息
在第二篇相关文章里面有两个空的方法体,其实就是为了实现今天的功能而预留的.所以接下来的代码就是写在InventoryItemGrid这个脚本里的了.
接下来就让我们来实现这个功能
1.声明变量
依然是声明相应的变量来存储相应的数据,在u3d中的物品栏的ui下先创建一个Panel,可作为文字背景,然后在Panel下创建Text,Panel是通过在u3d里面获取的,而text我这边是通过代码获取的,这里的text就是用来写具体的物品的信息的
public Image goodsInformationContainer;//用来储存物品信息的容器,里面有text文件可以显示物品信息
public float showTime = 3;//物品信息显示的时长
private Text goodsInformation_text;//用来显示物品信息
private float time=0;//计时器,物品信息显示一段时间要消失
private bool isShowInformation = false;//标识是否开始显示物品信息
2. 创建ShowGoodsInformation();
我们再来定义一个方法ShowGoodsInformation();这里我要先提一下如何通过代码写ui的位置,因为,物品信息显示的位置肯定要在物品的旁边,当鼠标悬停于物品时,就要在它旁边显示相应的物品信息,所以当我们让panel显示出来的时候,要对确定其位置.所以这个方法需要一个参数,即格子位置的参数RectTransform
/// <summary>
/// 在字典查找该物品,然后显示物品信息
/// </summary>
/// <param name="center">显示物品信息的位置</param>
private void ShowGoodsInformation(RectTransform center)
{
//如果id不等于0,就表示格子是有物品的
if (this.id != 0)
{
goodsInformationContainer.gameObject.SetActive(true);//使panel显示
goodsInformationContainer.gameObject.GetComponent<RectTransform>().anchoredPosition = center.anchoredPosition + new Vector2(342.4f, -261.7f);//panel显示的位置
ObjectInfo info = new ObjectInfo();//用来存储物品信息
info = ObjectsInfo._instance.GetObjectInfoById(id);//在字典里查出这个物品并放到info
goodsInformation_text = goodsInformationContainer.GetComponentInChildren<Text>();//获取panel下的text
//根据物品类型将物品信息写入text
switch(id/1000)
{
///因为物品都是四位数,药品最高位是1,装备物品最高位是2,之类的,所以根据id/1000即可分辨是哪类物品,然后显示相应信息
case 1:
ObjectInfo_Drug info_Drug=(ObjectInfo_Drug)info;
goodsInformation_text.text="物品名称:"+info.name+"\n回血量:"+info_Drug.hp+"\n回蓝量:"+info_Drug.mp+"\n出售价格:"+info_Drug.price_sell;
break;
case 2:
ObjectInfo_Equip info_Equip = (ObjectInfo_Equip)info;
goodsInformation_text.text = "物品名称:" + info_Equip.name + "\n出售价格:" + info_Equip.price_sell;
break;
case 3:
ObjectInfo_Mat info_Mat = (ObjectInfo_Mat)info;
goodsInformation_text.text = "物品名称:" + info_Mat + "\n出售价格:" + info_Mat.price_sell;
break;
}
}
}
其中确定Panel显示位置的那行代码中的Vector2需要自己去尝试,找出相应的偏移量然后加进去,因为我们穿进来的参数是格子ui的位置,而显示的这个Panel是根据这个位置来偏移的.
3. ShowGoodsInformation()的使用
好,有了以上的方法,那我们什么时候去调用呢?一开始我们就定义了一个布尔isShowInformation ,当然是有用的,当它为真的时候就可以在Update()方法里调用我们写的这个方法了,而isShowInfomation要在什么时候让它为真呢?很明显,当鼠标悬停在格子上的时候
那么就需要让我们的InventoryItemGrid继承至IPointerEnterHandler和IPointerExitHandler这两个接口,然后实现他们的方法
/// <summary>
/// 实现接口方法,当鼠标位于格子上时发生
/// </summary>
/// <param name="eventData"></param>
void IPointerEnterHandler.OnPointerEnter(PointerEventData eventData)
{
isShowInformation = true;
}
/// <summary>
/// 实现接口方法,当鼠标离开格子时发生
/// </summary>
/// <param name="eventData"></param>
void IPointerExitHandler.OnPointerExit(PointerEventData eventData)
{
time+=showTime;
}
这个time+=showTime又是要干嘛呢?其实当鼠标悬停于物品时,显示物品信息的时间得是有限的,比如悬停在格子上,它显示出物品信息,总不能一直显示着,在这里,当time>3时,也就是显示三秒后,panel又隐藏起来,而当鼠标离开格子时,这就实现了提前消失,以方便用来显示接下来鼠标会悬停的格子上的物品信息.
4. Update()方法内容
直接上代码了:
void Update()
{
if (isShowInformation)
{
ShowGoodsInformation(this.GetComponent<RectTransform>());//调用方法显示panel
time += Time.deltaTime;//开始累计时间
//如果显示的时间到了,就隐藏panel,并重置时间,改变标识符
if (time > showTime)
{
isShowInformation = false;
time -= showTime;
goodsInformationContainer.gameObject.SetActive(false);
}
}
}
至此”u3d_rpg游戏开发之物品管理”暂时完结