开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

论坛活动

关注:720

当前位置:游戏蛮牛 交流专区 论坛活动

查看: 16296|回复: 67

[蛮牛协调计划] 【刀塔传奇】【第14天】【Declan】商人模块开发心得七

[复制链接]  [移动端链接]
抢楼 抢楼 本帖为抢楼帖,欢迎抢楼! 
排名
1504
昨日变化
1

12

主题

139

帖子

1597

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
2416
好友
26
蛮牛币
4001
威望
0
注册时间
2013-8-22
在线时间
383 小时
最后登录
2017-4-16

社区QQ达人

发表于 2015-2-26 00:09:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 天之道 于 2015-2-26 01:57 编辑

1.jpg

恭喜发财,新年好,everyone,我是你们的老朋友~DC老湿~

在这咩咩叫的喜庆的日子里,我压抑不住内心的激动,又开始出新片了,额,不对,是发新帖~

好的,接着上一期的话题,承诺放出整个视图界面的脚本
[C#] 纯文本查看 复制代码
using System;using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Holoville.HOTween;
using OurWorld.Dota.Models.Stores;
using UnityEngine;
using UnityEngine.UI;

public class MainStoreView : MonoBehaviour
{
    public Image Head;
    public Button backbtn;
    public Button refreshBtnShow;
    public MainStoreItem GoodsItem;
    public Transform MyGridT;

    private Transform mTrans;
    private GameObject mobj;
    private GoodsDetail goodsDetail;
    private Text refreshtime;
    private Text tipstext;
    private Image tipsimage;

    private Transform refreshT;
    private Text refreshText;
    private Button refreshBtnCancel;
    private Button refreshBtnSure;

    protected void Awake()
    {
        mTrans = this.transform;
        mobj = this.gameObject;

        //初始化时隐藏详情界面
        goodsDetail = mTrans.Find("itemInfo_popUp").GetComponent<GoodsDetail>();
        goodsDetail.Init();

        refreshtime = mTrans.Find("shop_bg/nextTimeRefresh/refresh_title/refresh_time").GetComponent<Text>();
        tipstext = mTrans.Find("shop_bg/Tips/tipsText").GetComponent<Text>();
        tipsimage = mTrans.Find("shop_bg/Tips").GetComponent<Image>();

        refreshT = mTrans.Find("crystalRefresh");
        if(refreshT.gameObject.activeInHierarchy)
            refreshT.gameObject.SetActive(false);

        refreshText = refreshT.Find("refreshbackground/Text").GetComponent<Text>();
        refreshBtnCancel = refreshT.Find("refreshbackground/ButtonCancel").GetComponent<Button>();
        refreshBtnSure = refreshT.Find("refreshbackground/ButtonSure").GetComponent<Button>();
    }

    public void Init()
    {
        GoodsCachList = new List<MainStoreItem>();

        SetNextTimeRefresh(mModel.GetMainSoreVO.nextTimeRefresh);


        goodsVOlist = mModel.GoodsItems.ToList();
        for (int i = 0; i < goodsVOlist.Count; i++)
        {
            MainStoreItem goodsItem = Instantiate(GoodsItem) as MainStoreItem;
            goodsItem.GetComponent<RectTransform>().SetParent(MyGridT);
            goodsItem.transform.localScale = Vector3.one;
            goodsItem.mVO = goodsVOlist[i];
            goodsItem.ItemUpdate();         

            GoodsCachList.Add(goodsItem);       //缓存商品列表,用于后续点击刷新更新按钮刷新商品数据来更新
        }

        backbtn.onClick.AddListener(OnBackBtnClick);

        refreshBtnShow.onClick.AddListener(OnRefreshBtnShowClick);
        refreshBtnCancel.onClick.AddListener(OnRefreshBtnCancelClick);
        refreshBtnSure.onClick.AddListener(OnRefreshBtnSureClick);

        EnterTips();
        EventTriggerListener.Get(Head.gameObject).onClick = ShowTips;
    }

    #region Tips    后续会重构本段代码

    string tip0 = "欢迎来到希娜的小店。$425";
    string tip1 = "你的手指真灵活,我很喜欢。$355";
    string tip2 = "轻一点,亲爱的。$475";
    string tip3 = "我会在每天9点,12点,18点和21点换上新的货物。$120";

    private void ShowTips(GameObject obj)
    {
        StartCoroutine(ReturnFadeTips());

        int number = UnityEngine.Random.Range(0,4);
        //Debug.Log(number);
        if(number == 0)
            TipTemplateShow(tip0);
        if(number == 1)
            TipTemplateShow(tip1);
        if(number == 2)
            TipTemplateShow(tip2);
        if(number == 3)
            TipTemplateShow(tip3);
    }

    private void EnterTips()
    {
       TipTemplateShow(tip0);
    }

    private void TipTemplateShow(string text)
    {

        string[] list = text.Split(new[] { "$" }, StringSplitOptions.None);

        tipstext.text = list[0];

        float rightsize = float.Parse(list[1]);
        RectTransform rtf = tipsimage.GetComponent<RectTransform>();

        rtf.offsetMax = new Vector2(-rightsize, rtf.offsetMax.y);

        StartCoroutine(CrossFadeTips());
    }

    private IEnumerator CrossFadeTips()
    {
        yield return new WaitForSeconds(1f);
        tipsimage.CrossFadeAlpha(0f, 1.5f, true);
        tipstext.CrossFadeAlpha(0f, 1.5f, true);
    }

    private IEnumerator ReturnFadeTips()
    {
        yield return null;
        tipsimage.CrossFadeAlpha(1f, 0.1f, true);
        tipstext.CrossFadeAlpha(1f, 0.1f, true);
    }

    #endregion

    /// <summary>
    /// 打开刷新选择界面按钮
    /// </summary>
    private void OnRefreshBtnShowClick()
    {
        SetRefreshChoiceOpen();
    }

    /// <summary>
    /// 点击好的,消耗钻石,刷新所有商品
    /// </summary>
    private void OnRefreshBtnSureClick()
    {
        temp.ApplyCallback(CallbackType.OnRewinded, MyCompleteToRefresh);
        temp.PlayBackwards();    
    }

    /// <summary>
    /// 点击取消关闭刷新选择界面
    /// </summary>
    private void OnRefreshBtnCancelClick()
    {
        SetRefreshChoiceClose();
    }

    #region Animation
    private TweenParms parms;
    private Tweener temp;
    private void SetRefreshChoiceOpen()
    {
        refreshT.gameObject.SetActive(true);

        if (parms == null)
        {
            refreshT.localScale = new Vector3(0.1f, 0.1f, 0.1f);
            parms = new TweenParms();
            parms.Prop("localScale", new Vector3(1f, 1f, 1f));
            parms.Ease(EaseType.EaseOutBack);
            parms.Delay(0.1f);
            parms.AutoKill(false);
            temp = HOTween.To(refreshT, 0.2f, parms);
        }
        temp.PlayForward();
    }
    private void SetRefreshChoiceClose()
    {
        temp.ApplyCallback(CallbackType.OnRewinded, MyComplete);
        temp.PlayBackwards();
    }
    private void MyComplete()
    {
        refreshT.gameObject.SetActive(false);
    }

    private void MyCompleteToRefresh()
    {
        refreshT.gameObject.SetActive(false);

        mModel.GetRefreshGoodsData();
        if (goodsVOlist != null)
            goodsVOlist.Clear();

        goodsVOlist = mModel.GoodsItems.ToList();
        for (int i = 0; i < goodsVOlist.Count; i++)
        {
            GoodsCachList[i].mVO = goodsVOlist[i];
            GoodsCachList[i].ItemUpdate();
        }
    }

    #endregion

    private void OnBackBtnClick()
    {
        GManger GameManger = GameObject.Find("GameManger").GetComponent<GManger>();
        GameManger.AllShow();
        HOTween.Kill();
        Destroy(mTrans.gameObject,0.1f);
    }

    public GoodsDetail MyGoodsDetail
    {
        get { return goodsDetail; }
    }

    /// <summary>
    /// 商品详情展示
    /// </summary>
    public void ShowDetail()
    {
       MyGoodsDetail.DetailShow();   
    }

    /// <summary>
    /// 更新自动刷新时间
    /// </summary>
    /// <param name="nexttime"></param>
    public void SetNextTimeRefresh(int nexttime)
    {
        refreshtime.text = string.Format("今日{0}点",nexttime);
    }

    private readonly MainStoreModel mModel = MainStoreModel.Instance;
    private List<GoodsItemVO> goodsVOlist;
    private List<MainStoreItem> GoodsCachList;
}
如果看过我上一讲的小蛮牛,并且自己动手练过的话,相信这个脚本对你来说,不过是查漏补缺,小菜一碟~

现在让我们回过头来,再看看整个商店的界面表现,如图1,由于各地网速不同,动态图加载可能会比较慢一点,请耐心等待之~
4.gif                                  
                                                      图1

我想一定会有小蛮牛好奇:老湿,这个“商品详情"的界面和功能是如何完成的?

那么,我们先来看一下其预设层次结构,
●itemInfo_popUp:商品详情父物体
        black:暗片
        shop_itemInfo_bg:商品样图
                Name:名字
                        own:当前拥有个数
                Goods:物品表示图(这个我不用说了吧,第七天的最后部分,我已经详细说明其结构了)
        shop_itemInfo_details:商品详情介绍
                ●details1功能简介
                ●details2背景故事(有的商品可能这块是空的)
        ●shop_cost购买该商品所需消耗
                ●bg背景
                        ●cost总消耗值
                        ●image消耗图标(可能是晶钻、金币、龙鳞币、兄弟币、竞技场钱币等等)
                ●count能买到个商品的个数
        ●shop_buy_button购买按钮
                ●buy_text按钮文字
        ●close_button关闭按钮

详情预设的界面,如图2
5.png
                              图2

我想,在这里一定又会有想蛮牛会问道:老湿,讲完预设后,酱紫的”详情弹出"的功能,脚本又是如何编写的呢?
我会说:嘿,你忘了DC老湿前面几讲的内容了么,
其实我在第十一天里的MainStoreItem脚本里就有涉及,红框突出部分,如图3
2.png
                                       图3
没错,点击按钮直接调,商店控制类的展示详情功能,ShowGoodsDetail()方法,控制类的脚本如下,
[C#] 纯文本查看 复制代码
using OurWorld.Dota.Models.Stores;
using UnityEngine;

public class MainStoreController
{
    private static MainStoreController _instance;

    public static MainStoreController Instance
    {
        get
        {
            if (_instance == null)
            {
                _instance = new MainStoreController();
            }
            return _instance;
        }
    }

    public void Show()
    {
        InitPrefab();
        mModel.GetMainStoreDate();
        View.Init();
    }

    /// <summary>
    /// 展示商品详情
    /// </summary>
    public void ShowGoodsDetail()
    {
        View.ShowDetail();
    }

    public MainStoreView View
    {
        get { return _mView; }
    }

    private void InitPrefab()
    {
        GameObject uiObj = GameObject.Find("Canvas");
        GameObject viewObj = MonoBehaviour.Instantiate(Resources.Load("gui/MainStore/UI_shop")) as GameObject;
        RectTransform rt = viewObj.GetComponent<RectTransform>();
        rt.SetParent(uiObj.transform);
        rt.anchoredPosition = Vector3.zero;
        rt.localScale = Vector3.one;

        _mView = viewObj.GetComponent<MainStoreView>();
    }

    private MainStoreController()
    {
       
    }

    private MainStoreView _mView;
    private readonly MainStoreModel mModel = MainStoreModel.Instance;
}
脚本写略粗糙了点,目标是先跑起来,后续会多抽时间不断优化完善~
怪我咯~
另外,细心的小蛮牛一定会发现,其实还是调用我们文章开头视图脚本MainStoreView 里的展示详情的方法,如图4
6.png
                       图4
你可以看到GoodsDetail类就是负责显示商品详情的类,其功能也无非就是根据数据动态显示商品图片,文字,然后,必要时做些弹出动画关闭动画等等,这里就不重复粘贴类似的功能代码了。感兴趣的话,可以自己动手搞搞,若还是有哪里不清楚不明白的话,可以留言提问,不过DC老湿,由于各种原因,可能会回复的慢一些,还望理解~ 7.png

哦,对了,这里还要提醒一点的是,在做弹框详情界面的时候,如图5
8.png
                                 图5
有的小盆宇一看颜色不一样,就盲目的做两个text的,DC老湿在这里要强调一下,这样做不是不可以,只是不提倡。
因为作为程序员,你完全可以用代码的方式来实现一个text里个别字颜色。方法就是:<color=#XXXXX>你想变色的字</color>,如图6
9.png
                           图6
上图的意思是当拥有个数为0的时候,“0”显示为红色,否则,其余的数字显示为深蓝色。(当然这一般都是根据策划需求来做的)
这个里给大家一个RGB颜色对照表的链接。
http://www.114la.com/other/rgb.htm


好了本讲就先到这里,一下讲将会讲解刷新按钮功能的粗暴实现~
以及……看吧,时间来的及的话,还会讲解一些优化方面的内容
敬请期待。。。




评分

参与人数 4鲜花 +12 收起 理由
qq718112196 + 5 赞一个!
mn624915633 + 2 赞一个!
LIUYING21 + 2 赞一个!
hylix008 + 3 赞一个!

查看全部评分

本帖被以下淘专辑推荐:


回复

使用道具 举报

头像被屏蔽
排名
1038
昨日变化

11

主题

454

帖子

1998

积分

UID
43291
好友
5
蛮牛币
4602
威望
0
注册时间
2014-9-2
在线时间
654 小时
最后登录
2016-7-8

活力之星

发表于 2015-2-26 09:08:57 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

回复

使用道具 举报

3偶尔光临
236/300
排名
12245
昨日变化
15

0

主题

178

帖子

236

积分

Rank: 3Rank: 3Rank: 3

UID
73447
好友
1
蛮牛币
101
威望
0
注册时间
2015-2-6
在线时间
16 小时
最后登录
2015-8-21
QQ
发表于 2015-2-26 09:16:06 | 显示全部楼层
楼主,我来赚点经验,你不介意哈.....

回复

使用道具 举报

无效楼层,该帖已经被删除
排名
25905
昨日变化
48

0

主题

72

帖子

81

积分

Rank: 2Rank: 2

UID
75698
好友
0
蛮牛币
30
威望
0
注册时间
2015-2-25
在线时间
3 小时
最后登录
2015-3-2
发表于 2015-2-26 09:36:53 | 显示全部楼层

回复

使用道具 举报

6#
无效楼层,该帖已经被删除
7#
无效楼层,该帖已经被删除
5熟悉之中
612/1000
排名
3061
昨日变化
4

0

主题

170

帖子

612

积分

Rank: 5Rank: 5

UID
73420
好友
2
蛮牛币
1172
威望
0
注册时间
2015-2-6
在线时间
102 小时
最后登录
2015-8-28
QQ
发表于 2015-2-26 10:04:27 | 显示全部楼层
谢谢分享,大赞一个

回复

使用道具 举报

9#
无效楼层,该帖已经被删除
10#
无效楼层,该帖已经被删除
3偶尔光临
152/300
排名
8851
昨日变化
16

0

主题

12

帖子

152

积分

Rank: 3Rank: 3Rank: 3

UID
64847
好友
0
蛮牛币
262
威望
0
注册时间
2014-12-31
在线时间
57 小时
最后登录
2015-9-2
发表于 2015-2-26 11:17:57 | 显示全部楼层
新年好,祝愿这个项目能在今年顺利搞定!

回复

使用道具 举报

12#
无效楼层,该帖已经被删除
13#
无效楼层,该帖已经被删除
7日久生情
1625/5000
排名
901
昨日变化
2

9

主题

275

帖子

1625

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
75415
好友
2
蛮牛币
3815
威望
0
注册时间
2015-2-22
在线时间
465 小时
最后登录
2017-6-27
发表于 2015-2-26 11:31:35 | 显示全部楼层
楼主,真的是给力啊

回复

使用道具 举报

15#
无效楼层,该帖已经被删除
您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表