## 第一篇博客@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];
}
}
当然,写的第一篇文章有点啰里啰唆,代码也不是特别严谨,有点繁琐,大家互相学习,各位平台上的大佬可以指点指点,里边的算法可以结合上边思路来理解,不清楚的可以私信给我哈。
##如果帮到你可以己得点个赞让更多伙伴可以看到。