unity 制作書籍翻頁效果
unity C# 翻書效果 2D 真實翻頁 不使用插件 自制
實現思路:
將書本分為兩邊,一邊一個翻頁實現;
下圖為書本的右面,以OA為分界線,△OAB是下一面的如上圖的左下角,△OAC是下一面的如上圖的右下角;
利用unity的mask可以實現,也就是,假設這一頁是1(左邊那一頁是0),需要有一個對象作為底面顯示3,一個對象被mask遮住顯示2的左下角在△OAB上,一個對象被mask遮住顯示1的左上部分在◇OADE上;
OAB部分的mask可以如下圖理解:◇OAFG是mask,◇OBCD是2,翻頁時,◇OAFG逆時針轉動,◇OBCD作為◇OAFG的子對象,相同的方向旋轉相同角度;
其他部分以及左邊頁面實現的原理都同上,還有就是翻書的中心點是以兩頁中間底部為旋轉原點;
實現步驟:
1.新建一個2D項目並在hierarchy面板新建一個Canvas,並在其下建立如下對象,從上到下含義可以理解為左邊底頁面、左邊逐漸消失頁面(父對象為mask子對象為圖片)、左邊逐漸出現頁面、右邊底頁面、右邊逐漸消失頁面(父對象為mask子對象為圖片)、右邊逐漸出現頁面,其中的LeftPageShadow和RightPageShadow是翻書的陰影,如下圖2的灰色線,會跟着◇OBCD一起旋轉,但是是反方向才能和書折痕的邊緣契合,折痕圖片使用下圖3有漸變的即可;
2.此處將單講右邊部分,左邊部分同理。RightBottomPage_Appear不需要怎么修改,只需把坐標設置好,作為底面即可。把Width和Height設置成想要的尺寸,PosY為-Height*0.5f,調至頁面的右側,還需要把Pivot設置為0,0,把旋轉中心點設置為書本中軸線的底部;
3.RightTopCover_DisAppear設置如下,為了顧及旋轉時RightTopPage_DisAppear會出頭,此處簡單粗暴的把Width設置為2倍,同理也要把旋轉中心點設置在中軸線底部,Pivot設置為0,0;
4.RightTopPage_DisAppear設置如下,不多說;
5.RightNextCover、RightNextPage和RightPageShadow基於同樣的原因和效果出現的位置做如下設置,可在設置過程中體會理解,注意Pivot和Rotation,RightPageShadow可以減少顏色透明度來減淡陰影;
6.創建一個腳本並掛載在MainCanvas上,定義以下變量,上面部分的Image表示對應名字的Image屬性,Sprite[]表示所有書頁,turningTime表示翻頁時間,isturing表示當前是否正在翻頁;
7.右邊翻向左邊的代碼如下,SetSiblingIndex是設置物體在hierarchy面板的位置,用來排序,因為排在下面的物體會顯示在排在上面的物體的前面,SetSiblingIndex具體說明可參看unity文檔。offsetAngle根據旋轉時間來調節旋轉的幅度。然后就是各種角度的疊加和旋轉抵消。ResetBookImage函數和ResetPagesAttribute函數,后面細說。此處使用SetSiblingIndex也可通過,創建兩個空物體然后附加一個canvas組件,把左右兩邊的物體分別作為子物體,然后通過調節sorting order來顯示哪一頁在前面;
8.左邊翻向右邊的代碼如下,同理不再贅述
9.ResetPagesAttribute的代碼如下,重置所有Image的坐標和角度;
10.創建如下變量,含義分別為當前頁數,最大頁數,還有左邊翻頁協程和右邊翻頁協程。ResetBookImage函數代碼如下,用於重新設置各個Image對應的圖片,此處比較需要抽象和想象,想通就很容易理解;
11.在Start里初始化變量和重設圖片,然后再創建兩個函數用來啟動翻頁的功能;
12.在hierarchy面板創建一個空物體並掛載新腳本InputControl用來控制點擊,代碼如下。此處使用Graphic Raycaster(UI射線)來檢測點擊的位置,還需要創建兩個空Image並調至要響應翻頁的地方,此處為頁面左右兩邊並且寬度為總寬度的四分之一。射線檢測通過比對name來進入不同翻頁;
至此,使用unity原生組件制作書本翻頁效果的功能就完成了,以下為效果
另外還可參考GitHub上的這位道友的項目:
https://github.com/Dandarawy/Unity3DBookPageCurl