Unity3D問題之EnhanceScollView選擇角色3D迴圈滾動效果實現
需求
- 呈現3D效果(2D素材)選擇角色效果
- 滾動保證層級,縮放比例,間距正常跟隨
- 迴圈滾動
- 這個介面需求一般也會有遊戲會採用(貌似有挺多)
如何實現
實現技術關鍵點
(3D迴圈效果,根據數學函式和仔細研究下具體效果很容易通過計算方式直接實現,本文主要目的是介紹下AnimationCurve工具,通過這個工具能夠幫助我們實現一些需求當然也包括實現酷炫的3D滾動效果)
- 如何控制每個Item之間的間隔(位置),縮放比例,差值平滑
- 如何實現item層級關係正確顯示("離" 螢幕近的層級高)
- 如何實現迴圈滾動
下面一一講述當前Demo採用的方法
說到實現的核心,需要知道Unity3D中提供的一個叫做AnimationCurve的元件,這個不僅僅是表面上美術可以使用的元件,也不只是單純的動畫曲線的概念,當然它就是動畫曲線,但是我們可以賦予AnimationCurve不同的意義,則可以藉助Curve實現不同的功能,(AnimationCurve定義了一個變化趨勢或者曲線,在不同的時間點,我們可以得到當前時間點下該曲線對應的y軸資訊,這個資訊可以是角色跳躍的高度,模型縮放的一個係數,攝像機距離目標的長度,一個角色當前的心情數值等等,曲線可以表示很多的意義)
沒用過AnimationCurve的朋友,直接去官網看下介紹就明白如何使用
下面簡單說下使用AnimationCurve可以完成的一些功能(上面已經介紹了一部分場景)
- 角色2D跳躍
- 攝像機移動
- 角色心情指數
- 縮放係數
- 距離係數
- ......
我們也賦予AnimationCurve不同的意義,實現我們核心目標(控制位移,控制縮放 當然也可以控制層級)
控制位移,縮放(3D效果的關鍵),差值過度動畫平滑
- 建立兩個AnimationCurve一個是scaleAnimationCurve和positionXAnimationCurve,分別控制縮放和位移
- 時間流水線控制(我們把所有的Item設定好自己對應的時間流位置即可,每次只要一動時間流水線,然後從兩個曲線內獲得當前流水線對應的縮放係數,位移係數,然後設定item的位移和縮放即可)
- 如何製作動畫(這個其實就是簡單的時間流水線的差值處理,一定時間時間流水值達到目標值即可)
控制層級
只有正確的層級控制,才能夠保證"不穿幫",上文也說過,也可以通過AnimationCurve做一個層級曲線,在當前item的時間下面該item的depth或者層級應該是多少,該demo採用的是比較粗暴的list排序方法,按照每個item距離"螢幕的遠近"其實就是scale係數,判斷哪個item在前,哪個在後面,當然也有些問題,如果距離相同,可能存在item相互打架的可能(這個可以通過控制scaleCurve進行控制)
該Demo使用的UITexture控制層級(其他的任何方式原理一樣,只是處理物件不一樣,用mesh實現,那就是z軸等等)
具體實現如下:
實現滾動迴圈
說道迴圈滾動,因為我們使用到了AnimationCurve,先天性的動畫曲線會有三種模式一種是pingpong,loop,一種是clamp,其中我們需要的是LOOP,沒聽錯,這就是滾動迴圈的關鍵點(我們的縮放曲線,位移係數曲線從0到1的效果模擬完畢,如果我們繼續向前增加時間流水值,那麼進入到下一個曲線的時候,所有的item都會反過來進行取樣曲線值,就能夠巧妙的實現迴圈效果(縮放係數,位移係數))如果不理解的,可以自己設定一個AnimationCurve,研究下,下面截圖示意:
程式碼部分只是需要知道,如果點選了一個Item將該item移動到中心對應的時間流應該往前或者往後走多少
注意問題
- 製作曲線,記得保證0-1時間軸填充完畢,這樣在進行迴圈處理的時候才不會出現偏差
- 額,如果自己用這種方法嘗試的朋友,如果有問題,請仔細檢視Demo中的引數即可......(主要就是曲線製作問題)
該Demo使用的NGUI,雖然筆者沒有用過UGUI,我想任何一個介面Tools都可以通過該方法實現,因為共同點一樣,只是層級處理,縮放處理有區別而已
實現效果
改進目標
該專案還有許多需要改進的地方,以後花時間繼續完善
- 支援Editor模式下的編輯,不用執行即可檢視效果(這個應該是最關鍵的功能)
- 支援偶數個Item進行滑動
- 支援Drag操作
- 支援和NGUI類似的DragScrollView和CenterOnChild功能
- 優化每個Item的層級設定演算法效率
- 優化更新每個Item位置,縮放演算法效率
GitHub地址:後續更新會直接在版本庫中更新
https://github.com/tinyantstudio/EnhancedScrollView
APK測試安裝地址:http://pan.baidu.com/s/1bnfPasJ
總結
所有的內容都講述完畢,如果這篇文章能夠幫助到您獲得對看到結束的朋友有一個簡單的啟發,請支援下~,文中存在錯誤或者描述不清楚的也請指正,共同交流學習,最好的方法就是直接下載Demo,然後看下邏輯和動畫曲線的設定引數
歡迎轉載,請註明出處~
By NPC燕(AndyKun)
相關文章
- 文字垂直迴圈滾動效果
- CSS實現迴圈無縫滾動CSS
- css3實現的方塊迴圈翻滾跳動效果CSSS3
- 用marquee和div+js實現首尾相連迴圈滾動效果JS
- 無縫迴圈滾動
- 直播平臺原始碼,迴圈滾動RecyclerView的實現原始碼View
- 線上直播系統原始碼,迴圈滾動RecyclerView的實現原始碼View
- 前端實現文字滾動效果前端
- Unity-卡片迴圈滾動Unity
- javascript無限迴圈滾動JavaScript
- css實現視差滾動效果CSS
- JavaScript(二):選擇、迴圈結構JavaScript
- 程式流程 (順序,選擇,迴圈)
- 小程式自定義音訊元件,帶滾動條,IOS迴圈失效問題音訊元件iOS
- javascript 3D旋轉滾動效果JavaScript3D
- 巢狀滾動效果實現討論巢狀
- Delphi中TFlowPanel實現滾動條效果
- 釘釘小程式自定義年月日日期picker選擇器元件-日無限迴圈滾動元件
- 選擇下拉選單項實現跳轉效果
- 迴圈連結串列(約瑟夫問題)--python實現Python
- 關於ListView或控制元件選擇迴圈切換的實現方法View控制元件
- 微信小程式功能之全屏滾動效果的實現程式碼微信小程式
- Android開發之TextView文字水平滾動效果實現AndroidTextView
- CSS3實現的立方體3D滾動效果程式碼例項CSSS33D
- 利用偽物件選擇器E:after實現清除浮動效果物件
- 使用純 CSS 實現滾動陰影效果CSS
- js實現的模擬滾動條效果JS
- 使用UICollectionView實現首頁的滾動效果UIView
- 影像平滑滾動效果的VC實現 (轉)
- 手動實現輪播圖(二):迴圈滾動、定時切換與指示器
- require()迴圈引用問題UI
- 滑鼠雙擊頁面實現自動滾動效果
- 十行程式碼實現網頁標題滾動效果!行程網頁
- js點選實現多圖順序切換和迴圈切換效果程式碼JS
- C語言系列之 順序、選擇與迴圈-尹成-專題視訊課程C語言
- 淺談迴圈之硬體級實現
- 實現隨著滾動條滾動,導航會自動切換的效果
- 實現報表滾動到底部翻頁效果