Unity之megaFierstext翻书插件控制代码分析
2015-04-18 10:58
477 查看
需要在Unity实现达到仿真的翻书效果,我们一般可以借助megaFierstext插件来完成。
下载地址:http://pan.baidu.com/s/1kTorsm7
导入Unity后,打开默认scene,在MainCamera上可以看到FilpOver脚本。
这便是控制具体翻页的脚本。
代码结构分析(伪代码)如下:
在Awake()与Start()函数中:
初始化整本书:
根据Texture中贴图数量计算出书的页数
创建每一页
为每一页增加三个API脚本
初始化一些控制变量
private float betweenHitPointX; //用于记录鼠标当前位置
private float nextHitPointX; //与上一个鼠标位置进行比较
private int pageNumber; //书的总页数
private int newPageNumber=0; //当前操作的页
public GameObject pageMasterplate; //单页模版
public Transform bookPosition; //生成书籍的位置
private GameObject[] bookPage; //每页对应的数组
private Object[] texAll; //用于存储所有页贴图的数组
private MeshRenderer meshRendererScript; //用于获取当前页MegaPageFlip脚本
//--------------添加每一页所需要的脚本---------------------
private MegaModifyObject megaModifyObjectScript;
private MegaPageFlip megaPageFlipScript;
private MegaMeshPage MegaMeshPageScript;
private Material[] materials; //用于加载的页面的材质球
private Material[] material; //用来存放每张纸业的正反面
private float Downtime=0f; //用于存储时间变量
private float startTurn;
private bool pagefan=false; //用于标示是否翻到下一页
private bool pagezheng=false; //用于标示是否翻到上一页
在Update()函数中——
开启翻页状态(鼠标左键点击页面时):
获取当前活动页面脚本
将当前页的高度上移
记录当前的初始页面角度
进入翻页状态(给控制变量赋值)
if(Input.GetMouseButtonDown(0)&&!pagefan&&!pagezheng){
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, 100)){
if(hit.transform!=null)
{
if(hit.transform.name=="right"&&newPageNumber<pageNumber)//点击右边并且当前页小于总页数
{
megaPageFlipScript=bookPage[newPageNumber].GetComponent<MegaPageFlip>();//获取当前页脚本
MegaMeshPageScript=bookPage[newPageNumber].GetComponent<MegaMeshPage>();
bookPage[newPageNumber].transform.localPosition=new Vector3(0,0.001f,0);//页面的位置稍微上移
startTurn=megaPageFlipScript.turn;//记录初始角度
}
if(hit.transform.name=="left"&&newPageNumber>0)//点击左边边并且当前页大于0
{
megaPageFlipScript=bookPage[newPageNumber-1].GetComponent<MegaPageFlip>();
MegaMeshPageScript=bookPage[newPageNumber-1].GetComponent<MegaMeshPage>();
bookPage[newPageNumber-1].transform.localPosition=new Vector3(0,0.001f,0);
startTurn=megaPageFlipScript.turn;
}
betweenHitPointX=hit.point.x; //获取中间碰撞点的X坐标
}
}
}
翻页状态(承接上一个状态,持续按下鼠标左键时):
如果鼠标左移,翻页角度减少
如果鼠标右移,翻页角度增加
if (Input.GetMouseButton(0)&&!pagefan&&!pagezheng&&megaPageFlipScript!=null){
Ray ray1 = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit1;
if (Physics.Raycast(ray1, out hit1, 100)){
if(hit1.transform!=null)
{
nextHitPointX=hit1.point.x; //获取最后的碰撞点的X坐标
if(nextHitPointX<betweenHitPointX){//鼠标右移
megaPageFlipScript.turn+=2.5f;
}
else if(nextHitPointX>betweenHitPointX){//鼠标左移
megaPageFlipScript.turn-=2.5f;
}
betweenHitPointX=hit1.point.x; //更新中间碰撞点的X坐标
}
}
}
松开手的状态(承接上一个状态,鼠标左键弹起时):
记录当前时间,用作插值处理
如果此时页面角度大于一定值,则确定页面是否成功翻页
if(Input.GetMouseButtonUp(0)){
Downtime=Time.time;//记录时间,插值使用
if(megaPageFlipScript!=null){
if(megaPageFlipScript.turn>40){//角度大于40,判定可以翻过去,否则翻不过去
pagezheng=true;
}
else{
pagefan=true;
}
}
}
实现翻页状态(承接上一个状态,鼠标左键弹起后页面归位):
确定是翻过来了还是没有翻过来
插值得到角度改变
如果是0或100状态,说明翻页完毕
根据初始值的状态判定是否翻页完毕
//正向归位
if(pagefan){
megaPageFlipScript.turn=Mathf.SmoothStep(megaPageFlipScript.turn, 0, Time.time-Downtime);
if(megaPageFlipScript.turn==0||megaPageFlipScript.turn==100)//0或100是归位状态
{
if(startTurn!=megaPageFlipScript.turn)//状态不同说明完全翻过去了
{
newPageNumber--;
bookPage[newPageNumber].transform.localPosition=new Vector3(0,-newPageNumber*0.001f,0);//页面下移
}
pagefan=false;
megaPageFlipScript=null;
}
}
//反向归位
if(pagezheng){
megaPageFlipScript.turn=Mathf.SmoothStep(megaPageFlipScript.turn, 100, Time.time-Downtime);
if(megaPageFlipScript.turn==0||megaPageFlipScript.turn==100)
{
if(startTurn!=megaPageFlipScript.turn)
{
bookPage[newPageNumber].transform.localPosition=new Vector3(0,(newPageNumber-pageNumber)*0.001f,0);
newPageNumber++;
}
megaPageFlipScript=null;
pagezheng=false;
}
}
当我们熟悉代码结构后,便可以根据项目的情况进行灵活的调整翻页的效果。
下面是一个一键翻页的Demo(不需鼠标拖动):
OnGUI()中代码如下:
void OnGUI()
{
if(pagefan||pagezheng)//正在翻页,则操作无效
return;
if(GUI.Button(new Rect(10,10,100,20),"下一页"))
{
if(newPageNumber<pageNumber)
{
downTime=Time.time;//记录初始状态
megaPageFlipScript=bookPage[newPageNumber].GetComponent<MegaPageFlip>();
startTurn=megaPageFlipScript.turn;
MegaMeshPageScript=bookPage[newPageNumber].GetComponent<MegaMeshPage>();
bookPage[newPageNumber].transform.localPosition=new Vector3(0,0.001f,0);
pagezheng=true;//按下按钮时,将标记直接设置为true
}
}
if(GUI.Button(new Rect(10,30,100,20),"上一页"))
{
if(pagefan||pagezheng)
return;
if(newPageNumber>0)
{
downTime=Time.time;
megaPageFlipScript
a5cd
=bookPage[newPageNumber-1].GetComponent<MegaPageFlip>();
startTurn=megaPageFlipScript.turn;
MegaMeshPageScript=bookPage[newPageNumber-1].GetComponent<MegaMeshPage>();
bookPage[newPageNumber-1].transform.localPosition=new Vector3(0,0.001f,0);
pagefan=true;
}
}
}
在Update()里面:
isOver参数是表面是不是翻页完毕了。
void Update ()
{
if(pagezheng&&!isOver)//正向翻页未结束
{
megaPageFlipScript.turn=Mathf.SmoothStep(megaPageFlipScript.turn,100,Time.time-downTime);
if(megaPageFlipScript.turn==100||megaPageFlipScript.turn==0)
{
if(startTurn!=megaPageFlipScript.turn)
isOver=true;
}
}
else if(pagefan&&!isOver)//反向翻页未结束
{
megaPageFlipScript.turn=Mathf.SmoothStep(megaPageFlipScript.turn,0,Time.time-downTime);
if(megaPageFlipScript.turn==100||megaPageFlipScript.turn==0)
{
if(startTurn!=megaPageFlipScript.turn)
isOver=true;
}
}
else if(pagefan&&isOver)//正相翻页结束
{
isOver=false;
pagefan=false;
newPageNumber--;
bookPage[newPageNumber].transform.localPosition=new Vector3(0,-newPageNumber*0.001f,0);
megaPageFlipScript=null;
}
else if(pagezheng&&isOver)//反向翻页结束
{
isOver=false;
pagezheng=false;
bookPage[newPageNumber].transform.localPosition=new Vector3(0,(newPageNumber-pageNumber)*0.001f,0);
newPageNumber++;
megaPageFlipScript=null;
}
}
以上便是关于该插件的小小理解,希望对大家有所帮助。
下载地址:http://pan.baidu.com/s/1kTorsm7
导入Unity后,打开默认scene,在MainCamera上可以看到FilpOver脚本。
这便是控制具体翻页的脚本。
代码结构分析(伪代码)如下:
在Awake()与Start()函数中:
初始化整本书:
根据Texture中贴图数量计算出书的页数
创建每一页
为每一页增加三个API脚本
初始化一些控制变量
private float betweenHitPointX; //用于记录鼠标当前位置
private float nextHitPointX; //与上一个鼠标位置进行比较
private int pageNumber; //书的总页数
private int newPageNumber=0; //当前操作的页
public GameObject pageMasterplate; //单页模版
public Transform bookPosition; //生成书籍的位置
private GameObject[] bookPage; //每页对应的数组
private Object[] texAll; //用于存储所有页贴图的数组
private MeshRenderer meshRendererScript; //用于获取当前页MegaPageFlip脚本
//--------------添加每一页所需要的脚本---------------------
private MegaModifyObject megaModifyObjectScript;
private MegaPageFlip megaPageFlipScript;
private MegaMeshPage MegaMeshPageScript;
private Material[] materials; //用于加载的页面的材质球
private Material[] material; //用来存放每张纸业的正反面
private float Downtime=0f; //用于存储时间变量
private float startTurn;
private bool pagefan=false; //用于标示是否翻到下一页
private bool pagezheng=false; //用于标示是否翻到上一页
在Update()函数中——
开启翻页状态(鼠标左键点击页面时):
获取当前活动页面脚本
将当前页的高度上移
记录当前的初始页面角度
进入翻页状态(给控制变量赋值)
if(Input.GetMouseButtonDown(0)&&!pagefan&&!pagezheng){
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, 100)){
if(hit.transform!=null)
{
if(hit.transform.name=="right"&&newPageNumber<pageNumber)//点击右边并且当前页小于总页数
{
megaPageFlipScript=bookPage[newPageNumber].GetComponent<MegaPageFlip>();//获取当前页脚本
MegaMeshPageScript=bookPage[newPageNumber].GetComponent<MegaMeshPage>();
bookPage[newPageNumber].transform.localPosition=new Vector3(0,0.001f,0);//页面的位置稍微上移
startTurn=megaPageFlipScript.turn;//记录初始角度
}
if(hit.transform.name=="left"&&newPageNumber>0)//点击左边边并且当前页大于0
{
megaPageFlipScript=bookPage[newPageNumber-1].GetComponent<MegaPageFlip>();
MegaMeshPageScript=bookPage[newPageNumber-1].GetComponent<MegaMeshPage>();
bookPage[newPageNumber-1].transform.localPosition=new Vector3(0,0.001f,0);
startTurn=megaPageFlipScript.turn;
}
betweenHitPointX=hit.point.x; //获取中间碰撞点的X坐标
}
}
}
翻页状态(承接上一个状态,持续按下鼠标左键时):
如果鼠标左移,翻页角度减少
如果鼠标右移,翻页角度增加
if (Input.GetMouseButton(0)&&!pagefan&&!pagezheng&&megaPageFlipScript!=null){
Ray ray1 = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit1;
if (Physics.Raycast(ray1, out hit1, 100)){
if(hit1.transform!=null)
{
nextHitPointX=hit1.point.x; //获取最后的碰撞点的X坐标
if(nextHitPointX<betweenHitPointX){//鼠标右移
megaPageFlipScript.turn+=2.5f;
}
else if(nextHitPointX>betweenHitPointX){//鼠标左移
megaPageFlipScript.turn-=2.5f;
}
betweenHitPointX=hit1.point.x; //更新中间碰撞点的X坐标
}
}
}
松开手的状态(承接上一个状态,鼠标左键弹起时):
记录当前时间,用作插值处理
如果此时页面角度大于一定值,则确定页面是否成功翻页
if(Input.GetMouseButtonUp(0)){
Downtime=Time.time;//记录时间,插值使用
if(megaPageFlipScript!=null){
if(megaPageFlipScript.turn>40){//角度大于40,判定可以翻过去,否则翻不过去
pagezheng=true;
}
else{
pagefan=true;
}
}
}
实现翻页状态(承接上一个状态,鼠标左键弹起后页面归位):
确定是翻过来了还是没有翻过来
插值得到角度改变
如果是0或100状态,说明翻页完毕
根据初始值的状态判定是否翻页完毕
//正向归位
if(pagefan){
megaPageFlipScript.turn=Mathf.SmoothStep(megaPageFlipScript.turn, 0, Time.time-Downtime);
if(megaPageFlipScript.turn==0||megaPageFlipScript.turn==100)//0或100是归位状态
{
if(startTurn!=megaPageFlipScript.turn)//状态不同说明完全翻过去了
{
newPageNumber--;
bookPage[newPageNumber].transform.localPosition=new Vector3(0,-newPageNumber*0.001f,0);//页面下移
}
pagefan=false;
megaPageFlipScript=null;
}
}
//反向归位
if(pagezheng){
megaPageFlipScript.turn=Mathf.SmoothStep(megaPageFlipScript.turn, 100, Time.time-Downtime);
if(megaPageFlipScript.turn==0||megaPageFlipScript.turn==100)
{
if(startTurn!=megaPageFlipScript.turn)
{
bookPage[newPageNumber].transform.localPosition=new Vector3(0,(newPageNumber-pageNumber)*0.001f,0);
newPageNumber++;
}
megaPageFlipScript=null;
pagezheng=false;
}
}
当我们熟悉代码结构后,便可以根据项目的情况进行灵活的调整翻页的效果。
下面是一个一键翻页的Demo(不需鼠标拖动):
OnGUI()中代码如下:
void OnGUI()
{
if(pagefan||pagezheng)//正在翻页,则操作无效
return;
if(GUI.Button(new Rect(10,10,100,20),"下一页"))
{
if(newPageNumber<pageNumber)
{
downTime=Time.time;//记录初始状态
megaPageFlipScript=bookPage[newPageNumber].GetComponent<MegaPageFlip>();
startTurn=megaPageFlipScript.turn;
MegaMeshPageScript=bookPage[newPageNumber].GetComponent<MegaMeshPage>();
bookPage[newPageNumber].transform.localPosition=new Vector3(0,0.001f,0);
pagezheng=true;//按下按钮时,将标记直接设置为true
}
}
if(GUI.Button(new Rect(10,30,100,20),"上一页"))
{
if(pagefan||pagezheng)
return;
if(newPageNumber>0)
{
downTime=Time.time;
megaPageFlipScript
a5cd
=bookPage[newPageNumber-1].GetComponent<MegaPageFlip>();
startTurn=megaPageFlipScript.turn;
MegaMeshPageScript=bookPage[newPageNumber-1].GetComponent<MegaMeshPage>();
bookPage[newPageNumber-1].transform.localPosition=new Vector3(0,0.001f,0);
pagefan=true;
}
}
}
在Update()里面:
isOver参数是表面是不是翻页完毕了。
void Update ()
{
if(pagezheng&&!isOver)//正向翻页未结束
{
megaPageFlipScript.turn=Mathf.SmoothStep(megaPageFlipScript.turn,100,Time.time-downTime);
if(megaPageFlipScript.turn==100||megaPageFlipScript.turn==0)
{
if(startTurn!=megaPageFlipScript.turn)
isOver=true;
}
}
else if(pagefan&&!isOver)//反向翻页未结束
{
megaPageFlipScript.turn=Mathf.SmoothStep(megaPageFlipScript.turn,0,Time.time-downTime);
if(megaPageFlipScript.turn==100||megaPageFlipScript.turn==0)
{
if(startTurn!=megaPageFlipScript.turn)
isOver=true;
}
}
else if(pagefan&&isOver)//正相翻页结束
{
isOver=false;
pagefan=false;
newPageNumber--;
bookPage[newPageNumber].transform.localPosition=new Vector3(0,-newPageNumber*0.001f,0);
megaPageFlipScript=null;
}
else if(pagezheng&&isOver)//反向翻页结束
{
isOver=false;
pagezheng=false;
bookPage[newPageNumber].transform.localPosition=new Vector3(0,(newPageNumber-pageNumber)*0.001f,0);
newPageNumber++;
megaPageFlipScript=null;
}
}
以上便是关于该插件的小小理解,希望对大家有所帮助。
相关文章推荐
- Unity3d:megaFierstext(翻书效果插件)
- 【Unity&UGUI】代码控制 text文本
- 【Unity&UGUI】输入框代码控制InputField,并显示输入文本
- [Unity插件]直升机控制插件[Unity问题]Input Axis Mouse X is not setup.
- HEVC码率控制算法研究与HM相应代码分析(三)——算法及代码分析
- Unity的NGUI插件的HUD Text插件血条数值的显示
- Blender:下载并安装文本编辑器(Text Editor)代码自动补全插件
- VS2010搭建SVN,实现代码的版本控制----【VS2010插件安装】
- Unity 方向控制及鼠标滚轮代码控制
- ffplay播放控制代码分析
- VS2010搭建SVN实现代码的版本控制VS2010插件安装
- Unity代码笔记<1>人物动作按键绑定+摄像机控制
- sublimtext 代码检错插件 sublimelinter 安装
- 插件管理代码分析
- unity 圆形滑动条slider 弧形滑动条效果及代码分析
- 关于Unity中Mecanim动画的动画状态代码控制与代码生成动画控制器
- unity代码控制画面画质(QualitySettings)
- Android权限控制代码分析
- TextView代码控制点击前一张图,点击后是另一张图
- VS2010搭建SVN实现代码的版本控制VS2010插件安装