【项目总结一】:UGUI循环列表

     hello!欸润王!优化

     五个月后我回来了,我变胖了也变强了。今年下半年版号所有吃土,在作的这个SLG估计也要腰斩了,小公司经不起折腾,以为有点舍不得,虽然是公司的第一个UGUI项目,可是本身也是摸索了很长时间,获得了公司主程还有群里的小伙伴们不少的帮助,若是要说收获最大的是什么,那可能就是本身独立完成工做内容的能力吧。笑。好了记录一下项目中得失,第一篇UGUI循环列表。参考原项目在个人下载资源里面,感兴趣的能够下下来看看。this

   先来张项目中的图lua

对应的分别是1预制体体的大小   2间隔距离 3距离左上的距离   4对应的预制体  5初始的数目   6最开始要显示的第一个预制体(方便直接从之间预制体开始展现以及有规律的固定向下滑动显示) 7数据的总数目 8对应的行数  9由于咱们是tolua因此须要绑定一个和窗体同名的脚本   10滑动时的响应方法orm

其中判断时纵向仍是横向是用了一个变量直接判断 就没有在面板上画蛇添足了blog

项目中的结构接口

为何要三层结构是由于滑动的item里面有的要用到灰化 而我只找到了遮罩mask的shader方法(参考以前的文章)没有mask2d的  就致使灰化的item遮不住 没办法 之后再改进吧游戏

初始start方法里面先判断数目有没有达到开启循环列表的条件 要否则在后面pivot变成从下面开始的时候往下拖会直接跳到上面去事件

(纵向偷懒了由于项目暂时没有这个需求)资源

获得父物体的四个标准点为拖动的范围 由于要经过这个来判断超出的item是否越界而后好让它移动到相反方向以完成循环的功能get

每一个item的位置是本身设定的 方便随时本身移动位置

拖动的物体大小是直接设定成有多少个item就设定成多少 这里是能够优化 之后有时间再研究

而后就是滑动的响应事件了 是这个脚本的核心内容 好比从上到下滑动 当上方的物体超过了父物体一个item的距离的时候就让它从最下方开始 直接贴代码

    void WrapContent()
    {

        Vector3[] conner_local = new Vector3[4];

        for (int i = 0; i < 4; i++)
        {
            conner_local[i] = mRTrans.InverseTransformPoint(conners[i]);

        }

        //计算ScrollRect 的中心坐标 相对于this的坐标
        Vector2 center = (conner_local[3] + conner_local[0]) / 2f;


        if (mVertical)
        {

            float min = conner_local[3].y - cell_y;
            float max = conner_local[0].y + cell_y;

            for (int i = 0; i < mChild.Count; i++)
            {
                Transform temp = mChild[i];
                float distance = temp.localPosition.y - center.y;

                if (distance < -extents)
                {
                    Vector2 pos = temp.localPosition;
                    pos.y += extents * 2f;

                    int realIndex = getRealIndex(pos);

                    if (realIndex >= 0 && realIndex < itemCount)
                    {
                        temp.localPosition = pos;


                        LuaInitItem(temp.gameObject, realIndex);

                    }

                }

                if (distance > extents)
                {
                    Vector2 pos = temp.localPosition;
                    pos.y -= extents * 2f;
                    int realIndex = getRealIndex(pos);

                    if (realIndex >= 0 && realIndex < itemCount)
                    {

                        temp.localPosition = pos;


                        LuaInitItem(temp.gameObject, realIndex);


                    }

                }

                if (cullContent)
                {
                    Vector2 pos = temp.localPosition;
                    temp.gameObject.SetActive((pos.y > min && pos.y < max) ? true : false);
                }

            }

        }
        else
        {

            float min = conner_local[0].x - cell_x;//显示区域
            float max = conner_local[3].x + cell_x;

            for (int i = 0, imax = mChild.Count; i < imax; i++)
            {
                Transform temp = mChild[i];
                float distance = temp.localPosition.x - center.x;

                if (distance < -extents)
                {

                    Vector2 pos = temp.localPosition;
                    pos.x += extents * 2f;

                    int realIndex = getRealIndex(pos);

                    if (realIndex >= 0 && realIndex < itemCount)
                    {


                        temp.localPosition = pos;
                        //设置Item内容
                        LuaInitItem(temp.gameObject, realIndex);
                    }

                }

                if (distance > extents)
                {

                    Vector2 pos = temp.localPosition;
                    pos.x -= extents * 2f;

                    int realIndex = getRealIndex(pos);

                    if (realIndex >= 0 && realIndex < itemCount)
                    {

                        temp.localPosition = pos;
                        //设置Item内容
                        LuaInitItem(temp.gameObject, realIndex);
                    }
                }

                if (cullContent)//设置裁剪部分是否隐藏
                {
                    Vector2 pos = temp.localPosition;

                    temp.gameObject.SetActive((pos.x > min && pos.x < max) ? true : false);
                }

            }

        }

    }

 

取得滑动的真真index

 

最后是tolua的一个wrap接口方面lua直接调用滚动事件赋值

 

结尾语:这只是一个恰好完成项目需求的循环列表功能 还有不少东西能够完成 好比拖动物体的大小随实际物体的多少改变  平滑移动的速率控制  从下到上的循环列表(其实只须要有个判断条件把pivot改变了就行) 而后实现每一个item的定时展现能够用dotween 每一个item的位置其实都知道 都是本身设定的 从一个位置移动到另一个位置就能够了 这个后面实现功能的时候会再补上  

啰嗦一句 :游戏行业今年是真真到了寒冬期,可是我以为这对于真真热爱游戏行业的人应该不会是毁灭性的事件,君不见独立游戏太吾绘卷悄咪咪的登上了steam国内游戏第一么,当游戏真真以质量做为可否赚钱的标准的时候,才是这个行业的黄金时代,而对于只是想经过这个行业赚快钱的人,虽然我还只是一只叽叽叽,可是以为成为一个行业的中上层,最起码就不会考虑这种会不会被裁人能不能赚钱的问题。每一个行业都有寒冬期,每一个行业也仍是有在这个时期赚钱的人,一点感想,peace!