u3d_rpg游戏开发之物品管理(三)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u3d_20171030/article/details/78620213

接下来就是暂时告一段落的最后一个功能了——当鼠标悬停于有物品的格子的时候,显示相应的物品信息
在第二篇相关文章里面有两个空的方法体,其实就是为了实现今天的功能而预留的.所以接下来的代码就是写在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游戏开发之物品管理”暂时完结

猜你喜欢

转载自blog.csdn.net/u3d_20171030/article/details/78620213