打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Unity之megaFierstext翻书插件控制代码分析

需要在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=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;
  }
 }


以上便是关于该插件的小小理解,希望对大家有所帮助。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
名画自动翻页
6 个实现翻书效果的 jQuery 插件
书本翻页效果 Turn.js
很好玩!翻页看世界名画
利用协程优化耗时的处理
许你,一世迷离。
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服