TXT书本自动加载内容,翻书效果


## 第一篇博客@Jeremy


时间过的好快啊,毕业工作已经一年多了,工作中遇到的问题和技术点都是看别人的博客,那么我觉得自己也应该养成和保持一个好的学习习惯,坚持写属于自己的博客,学习新的技术,让更多的人可以看到,大家互相学习。
那我的第一篇博客就这样拉开了序幕,把它记录下来…

以翻书项目为例,市面上大同小异,网上也有很多插件,可以看自带案例来更好的理解内容和代码。

首先,拿到这款产品需求,我就从网上下载了好多关于翻书效果的插件,然后,比来比去还是觉得Book-Page Curl Pro更好用,效果更好点,里边有4个Example供大家学习。网上有好多加载图片做成电子书的博客(图片上有美术做好的文字排版),结合插件,直接加载上去即可;这篇文章就是这样子的。但我这次是方案给的word文档,所以最后我就自己写了一个自动读取文字(当然其他读取也是可以的,万变不离其宗嘛),规则添加到书本填充到每一页上边(当然少不了我明哥对我的帮助和指点)。

来到正文:
我这里利用的是文本
大概思路,我这里把TXT文本内容分为书本名称,目录,标题和正文。首先我在前面各自都添加了相对应的字符标志,然后分为左右两页(预设物),又规定填写书本里内容每一行写19个字符(每一行我只写进18个字符,如果开头第一个字符为标点符号的我就把它填充到上一行的结尾处),一页里边分为11行(每一行就是一个Text),总共多少行,就分为多少页,然后把TXT内容一一对应填充。
在这里插入图片描述
接下来上代码截图,
在这里插入图片描述
在这里插入图片描述

 /// 生成文字对应的左右书本预设体
  void CreatPagePrefabs(int pageCount, List<string> lstr)
  {
        pagePrefabList = new List<Transform>();
        for (int i = 0; i < pageCount; i++)
        {
            if (i % 2 == 0)
            {
                GameObject obj01 = Instantiate(pagePrefab01);
                obj01.SetActive(false);
                obj01.transform.parent = bookPro.transform;
                obj01.GetComponent<RectTransform>().sizeDelta = bookPro.RightPageTransform.GetComponent<RectTransform>().sizeDelta;
                obj01.GetComponent<RectTransform>().pivot = bookPro.RightPageTransform.GetComponent<RectTransform>().pivot;
                obj01.GetComponent<RectTransform>().anchoredPosition = bookPro.RightPageTransform.GetComponent<RectTransform>().anchoredPosition;
                obj01.GetComponent<RectTransform>().localScale = bookPro.RightPageTransform.GetComponent<RectTransform>().localScale;
                obj01.name = "Page" + i.ToString();
                pagePrefabList.Add(obj01.transform);
                //print("you");
            }
            else
            {
                GameObject obj02 = Instantiate(pagePrefab02);
                obj02.SetActive(false);
                obj02.transform.parent = bookPro.transform;
                obj02.GetComponent<RectTransform>().sizeDelta = bookPro.RightPageTransform.GetComponent<RectTransform>().sizeDelta;
                obj02.GetComponent<RectTransform>().pivot = bookPro.RightPageTransform.GetComponent<RectTransform>().pivot;
                obj02.GetComponent<RectTransform>().anchoredPosition = bookPro.RightPageTransform.GetComponent<RectTransform>().anchoredPosition;
                obj02.GetComponent<RectTransform>().localScale = bookPro.RightPageTransform.GetComponent<RectTransform>().localScale;
                obj02.name = "Page" + i.ToString();
                pagePrefabList.Add(obj02.transform);
                //print("zuo");
            }
        }
        for (int i = 0; i < pageCount / 2; i++)
        {
            Paper p = new Paper();
            p.Front = pagePrefabList[i * 2].gameObject; p.Back = pagePrefabList[i * 2 + 1].gameObject;
            bookPro.papers.Add(p);
        }
        //更新书本长度
        bookPro.StartFlippingPaper = Mathf.RoundToInt(0);
        bookPro.EndFlippingPaper = Mathf.RoundToInt(pageCount / 2);
        //更新名字
        //for (int i = 0; i < bookPro.papers.Count; i++)
        //{
        //    bookPro.papers[i].Front.name = "Page" + (i * 2);
        //    bookPro.papers[i].Back.name = "Page" + (i * 2 + 1);
        //}
        //填充字数
        CountWordMethod(pageCount, lstr);
    }
    /// <summary>
    /// 计算判断规则,填充到书本里去
    /// </summary>
    void CountWordMethod(int Page, List<string> lstr)
    {
        List<Text> ltext1 = new List<Text>();
        for (int i = 0; i < pagePrefabList.Count; i++)
        {
            //每一页下边的内容
            for (int j = 0; j < pagePrefabList[i].transform.GetChild(2).childCount; j++)
            {
                ltext1.Add(pagePrefabList[i].transform.GetChild(2).GetChild(j).GetComponent<Text>());
            }
        }
        for (int i = 0; i < lstr.Count; i++)
        {
            if (i >= 0 && lstr[i] != " ")
            {
                string p = " ";
                p = lstr[i].Substring(0, 1);
                if (p == "T")
                {
                    if (titleCount <= 0)
                    {
                        titleCount++;
                        string s = TitleList[0].Substring(1, TitleList[0].Length - 1);
                        ltext1[i].transform.parent.parent.GetChild(0).GetComponent<Text>().text = s;
                        string ss = TitleList[titleCount].Substring(1, TitleList[titleCount].Length - 1);
                        ltext1[i].transform.parent.parent.GetChild(0).GetChild(0).GetComponent<Text>().text = ss;
                    }
                    else
                    {
                        titleCount++;
                        string ss = TitleList[titleCount].Substring(1, TitleList[titleCount].Length - 1);
                        ltext1[i].transform.parent.parent.GetChild(0).GetChild(0).GetComponent<Text>().text = ss;
                    }
                    string str = lstr[i].Substring(1, lstr[i].Length - 1);
                    lstr[i] = str;
                }
                //中华人民共和国
                if (p == "a")
                {
                    string str = lstr[i].Substring(1, lstr[i].Length - 1);
                    print(str + "                  判断标题");
                    ltext1[i].transform.parent.parent.GetChild(0).GetComponent<Text>().text = str;
                }
                //判断书名
                string pp = lstr[i].Substring(0, 1);
                if (pp == "c" || pp == "o")
                {
                    string ppp = lstr[i].Substring(1, lstr[i].Length - 1);
                    lstr[i] = ppp;
                    ltext1[i].transform.parent.parent.GetChild(0).GetChild(0).GetComponent<Text>().text = ppp;
                }
                //判断空格
                if (p == "b")
                {
                    string str = lstr[i].Substring(1, lstr[i].Length - 1);
                    if (str.Substring(0, 2) != "\u3000\u3000")
                    {
                        str = "\u3000\u3000" + str;
                        lstr[i] = str;
                    }
                    lstr[i] = str;
                }
                //判断标点符号
                if (p == "," || p == "。" || p == "、" || p == ";")
                {
                    string a = lstr[i].Substring(1, lstr[i].Length - 1);
                    lstr[i] = a;
                    //print(lstr[i].Substring(1, lstr[i].Length-1)+" 截取");
                    string b = lstr[i - 1].Insert(lstr[i - 1].Length, p);
                    lstr[i - 1] = b;
                    ltext1[i - 1].text = lstr[i - 1];
                }
                else if (p == "“" || p == "”" || p == "!" || p == "》" || p == "?" || p == "。" || p == "、")
                {
                    string a = lstr[i].Substring(1, lstr[i].Length - 1);
                    lstr[i] = a;
                    string b = lstr[i - 1].Insert(lstr[i - 1].Length, p);
                    lstr[i - 1] = b;
                    ltext1[i - 1].text = lstr[i - 1];
                }
            }
            ltext1[i].text = lstr[i];
        }
    }

效果图1
效果图2
效果图3
当然,写的第一篇文章有点啰里啰唆,代码也不是特别严谨,有点繁琐,大家互相学习,各位平台上的大佬可以指点指点,里边的算法可以结合上边思路来理解,不清楚的可以私信给我哈。
##如果帮到你可以己得点个赞让更多伙伴可以看到。

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值