您的位置:首页 > 移动开发 > Unity3D

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;

  }

 }

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


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息