Unity3d C#實現基于UGUI ScrollRect的輪播圖效果功能(含源碼)

前言

輪播功能是一種常見的頁面組件,用于在頁面中顯示多張圖片/素材并自動或手動進行切換,以提高頁面的美觀度和用戶體驗。主要的功能是:自動/手動切換;平滑的切換效果;導航指示器等。可惜Unity的UGUI系統里沒有現成的實現該功能,所以這里直接基于ScrollRect來實現該組件功能。在上述功能上新增了無限輪播、鼠標懸停暫停輪播、鼠標拖拽輪播、豎向輪播等功能。

硬廣

自制3D版三維搭建俄羅斯方塊WX小游戲,走過路過可以掃描支持。
在這里插入圖片描述
三維的消除,地域難度:
在這里插入圖片描述

效果

左右輪播:
在這里插入圖片描述

上下輪播:
在這里插入圖片描述

導航器輪播:
在這里插入圖片描述

拖拽輪播:
在這里插入圖片描述

實現

實現的思路是基于UGUI的ScrollRect組件用于滑動效果,而其中的HorizontalLayoutGroup
或者VerticalLayoutGroup對Content的內容進行排序,其實無限循環的輪播思路參考之前編寫的
《Unity3d C# UGUI實現一個自動循環滾動的列表(ScrollRect)》 (https://blog.csdn.net/qq_33789001/article/details/120813324),平滑的切換效果是使用移動的動畫效果(插件DOTweenPro),其余的核心就是輪播的時候對Content的位置進行計算和移動。以下是部分實現的過程。工程基于Unity3d 2020.3.28f1c1版本實現。

UI搭建

UI的整體搭建以常用的從右至左的輪播為基礎,效果如下:
在這里插入圖片描述

其中最外層為ScrollRect組件,Content上新增了Horizontal Layout Group用于子節點排序和Content Size Fitter用于寬度適配。詳細設置如下:
在這里插入圖片描述

其中需要特別注意的是padding left/right最好相等,Spacing也最好一致,如果設置不一致可能導致功能失效或者異常。
NodeTips下的節點是導航器的小圖標,一個選中的圖(Sel)和一個未選中的圖(UnSel),并使用了Horizontal Layout Group進行了排序:
在這里插入圖片描述

配置參數

為了保持插件的靈活性和適用性,設定了很多配置參數:

    [Header("自動輪播方向")]public SwipeDir swipeDir = SwipeDir.RightToLeft;   [Header("啟用自動輪播")]public bool enbaleAuto = true;[Header("啟用拖拽")]public bool enbaleDrag = true;[Header("輪播閥值(超出多少個元素)")][Range(1, 20)]public int ItemNum = 1;[Header("自動輪播間隔")]public float swipeDura = 5f;[Header("輪播動畫時間")]public float swipeTime = 0.5f;

這些暴露出來的參數,可以在Inspector窗口進行靈活配置:
在這里插入圖片描述

事件處理

這里鼠標滑動的操作依托于ScrollRect組件,而鼠標進入取消輪播,鼠標移出恢復輪播,鼠標拖拽釋放置中節點等操作都需要對事件進行處理,這里使用了EventTrigger來實現,監聽了鼠標進入、移出、開始拖拽、結束拖拽等事件,監聽代碼如下:

        AddETEvent(et, EventTriggerType.PointerEnter, OnPointerIn);AddETEvent(et, EventTriggerType.PointerExit, OnPointerOut);AddETEvent(et, EventTriggerType.BeginDrag, OnBeginDrag);AddETEvent(et, EventTriggerType.EndDrag, OnEndDrag);private void AddETEvent(EventTrigger et, EventTriggerType ei, UnityAction<BaseEventData> ua){UnityAction<BaseEventData> action = ua;EventTrigger.Entry entry = new EventTrigger.Entry();entry.eventID = ei;entry.callback.AddListener(action);et.triggers.Add(entry);
}

輪播方向

雖然常用的輪播是從右至左的操作,不過偶爾還是會有從左至右和上下輪播的需求情況,這里一共定義了四個方向:

public enum SwipeDir
{BottomToTop = 1,TopToBottom = 2,LeftToRight = 3,RightToLeft = 4
}

導航器

導航器是輪播器下方的提示小圖標按鈕,在輪播的節點出現后,需要初始化一下導航器,導航器會根據輪播的節點進行生成排序:

    void refreshTipsState() {for (int j = 0; j < tipList.Count; j++){tipList[j].gameObject.SetActive(tipList[j].refItem ? tipList[j].refItem.gameObject.activeSelf:false);if (nowCenterNode == tipList[j].refItem)tipList[j].Selected();elsetipList[j].Unselected();}
}

導航器初始化完成后,在鼠標點擊后,導航器會根據輪播結果刷新導航器,當自動輪播開始時,也會刷新導航器:

    void refreshTipsState() {for (int j = 0; j < tipList.Count; j++){tipList[j].gameObject.SetActive(tipList[j].refItem ? tipList[j].refItem.gameObject.activeSelf:false);if (nowCenterNode == tipList[j].refItem)tipList[j].Selected();elsetipList[j].Unselected();}}

輪播功能

在自動輪播的過程中,到輪播時間時,會執行輪播過程;或者當手動拖拽輪播圖時,拖拽結束后,也會執行輪播過程。輪播的過程就是將滾動內容移動至中心節點居中的位置,所以整個過程都是圍繞獲取中心節點,計算節點居中位置和移動到目標位置來實現的:

//執行輪播的動作
void doMoveToCenterNode(Transform tran)
{refreshTipsState();nowCenterNode = tran;int idx = getNodeActiveIndex(tran); // tran.GetSiblingIndex();if (idx < 0 || idx >= hvLayoutGroup.transform.childCount)return;Vector3 tPos;switch (swipeDir){case SwipeDir.BottomToTop:tPos = new Vector3(initPos.x, hvLayoutGroup.padding.top + (Space + itemHeight) * (idx + 1) - scrolltran.rect.height , initPos.z);break;case SwipeDir.TopToBottom:tPos = new Vector3(initPos.x, hvLayoutGroup.padding.top + (Space + itemHeight) * (idx + 1) - scrolltran.rect.height, initPos.z);break;case SwipeDir.LeftToRight:tPos = new Vector3(scrolltran.rect.width - hvLayoutGroup.padding.left - (Space + itemWidth) * (idx + 1), initPos.y, initPos.z);//new Vector3(LayoutGroup.padding.right + (Space + itemWidth) * (idx + 1) - scrolltran.rect.width, initPos.y, initPos.z);break;case SwipeDir.RightToLeft:tPos = new Vector3(scrolltran.rect.width - hvLayoutGroup.padding.left - (Space + itemWidth) * (idx + 1), initPos.y, initPos.z);break;default:tPos = new Vector3(scrolltran.rect.width - hvLayoutGroup.padding.left - (Space + itemWidth) * (idx + 1), initPos.y, initPos.z);break;}scrollrect.content.DOKill();scrollrect.content.DOAnchorPos3D(tPos, swipeTime);
}

這里的tPos就是移動的目標位置,計算這個數值和輪播方向有關,更和Content的RectTransform設定有關,結合HorizontalLayoutGroup的padding 和spacing設定進行計算。

工程源碼

包含Unity3d 工程源碼 以及unitypackage包。
https://download.csdn.net/download/qq_33789001/89507901

連接打不開說明審核未通過,稍后重試。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/42528.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/42528.shtml
英文地址,請注明出處:http://en.pswp.cn/web/42528.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

第五次作業(多表聯合查詢)

新增員工表emp和部門表dept create table dept (dept1 int ,dept_name varchar(11)) charsetutf8; create table emp (sid int ,name varchar(11),age int,worktime_start date,incoming int,dept2 int) charsetutf8; insert into dept values (101,財務), (102,銷售…

Shell學習——Shell echo命令

文章目錄 echo命令 echo命令 1.顯示普通字符串: echo "It is a test"這里的雙引號完全可以省略&#xff0c;以下命令與上面實例效果一致&#xff1a; echo It is a test2.顯示轉義字符 echo "\"It is a test\""結果將是: "It is a tes…

掌握MOJO命令行:參數解析的藝術

在軟件開發中&#xff0c;命令行接口&#xff08;CLI&#xff09;是一種與程序交互的強大方式&#xff0c;它允許用戶通過終端輸入指令和參數來控制程序的行為。對于MOJO語言&#xff0c;即使它是一個假想的編程語言&#xff0c;我們也可以設想它具備解析命令行參數的能力。本文…

初識C++【命名空間】【輸入輸出】【缺省參數】【函數重載】

前言 C是一種通用的編程語言&#xff0c;被廣泛用于開發各種應用程序&#xff0c;包括系統軟件、游戲、手機應用和高性能計算等。它是C語言的擴展&#xff0c;添加了許多新特性和功能&#xff0c;并支持面向對象編程。C可以在不同的平臺上編譯和運行&#xff0c;具有高效性、可…

開放式耳機哪個品牌比較好?2024最值得推薦的火爆機型!!

在這個快節奏的時代&#xff0c;我們都在尋找那些既能讓我們享受音樂&#xff0c;又能保持對外界感知的音頻設備。開放式耳機以其獨特的設計&#xff0c;滿足了這一需求&#xff0c;它們讓你在享受音樂的同時&#xff0c;還能聽到周圍環境的聲音&#xff0c;無論是安全出行還是…

華為、H3C、銳捷、思科四大設備廠商交換機配置命令總結合輯

號主&#xff1a;老楊丨11年資深網絡工程師&#xff0c;更多網工提升干貨&#xff0c;請關注公眾號&#xff1a;網絡工程師俱樂部 下午好&#xff0c;我的網工朋友。 一直以來&#xff0c;對于華為、H3C、銳捷、思科交換機的命令配置&#xff0c;不斷的有朋友留言&#xff0c;四…

OpenSNN推文:盛夏智慧之光:七月高校新聞聚焦

隨著夏日的炎炎熱浪逐漸升溫&#xff0c;七月的校園生活也如火如荼地展開。在這個充滿活力的季節里&#xff0c;各大高校不僅迎來了學術交流的高峰&#xff0c;也在科技創新、國際合作等方面取得了顯著成就。以下是本月內幾所知名高校的重要新聞動態&#xff0c;它們不僅展現了…

數據庫 視圖

-- 刪除舊的視圖&#xff08;如果存在&#xff09; DROP VIEW IF EXISTS view_employees_active; -- 創建新的視圖 CREATE VIEW view_employees_active AS SELECT id, name FROM employees WHERE status active; 注意事項 如果視圖不滿足更新條件&#xff08;如包含JOIN、…

譜瑞科技高速傳輸接口芯片選型應用

譜瑞科技股份有限公司為一專供多種普及顯示器以及個人計算機、消費性電子產品與顯示面板所使用之高速訊號傳輸接口標準之混和信號 IC 芯片之領導供貨商。譜瑞公司成立于 2005 年為一無自有晶圓廠之半導體公司&#xff0c;并于 2011 年股票在臺灣柜臺買賣中心正式掛牌交易(股票代…

深入淺出:Scikit-Learn基礎教程

引言 Scikit-Learn&#xff08;簡稱sklearn&#xff09;是Python中一個強大的機器學習庫&#xff0c;提供了豐富的工具和模塊&#xff0c;幫助我們輕松實現數據預處理、模型訓練、評估和預測。本文將通過一個簡單的教程&#xff0c;帶您快速入門Scikit-Learn&#xff0c;掌握其…

Greenplum(三)【分布式事務和兩階段提交協議】

1、事務實現原理和 WAL&#xff08;單機&#xff09; 屬性含義數據庫系統實現Atomic&#xff08;原子性&#xff09;事務中的操作要么全部正確執行&#xff0c;要么完全不執行&#xff08;要么成功、要么失敗&#xff09;Write Ahead Logging 預寫日志&#xff0c;分布式事務&…

C語言希爾排序詳解與實例

希爾排序&#xff08;Shell Sort&#xff09;&#xff0c;是由Donald Shell在1959年提出的一種排序算法。它是插入排序的一種高效改進版&#xff0c;通過引入“增量”概念&#xff0c;將原本的線性查找轉換為分段查找&#xff0c;從而顯著提升了排序效率。本文將深入探討希爾排…

SRC漏洞挖掘技巧:修改返回包的各種姿勢

聽說大家都在要星標&#xff0c;我也要一個吧&#xff0c;可以把我的公眾號打上小星星嗎&#xff1f;~ 又雙叕周一了&#xff0c;還是老樣子&#xff0c;來篇技術向的給大家提提神吧~ 如果你對漏洞挖掘或技術向不感興趣&#xff0c;那么到這就可以了&#xff0c;不用再繼續往下…

【刪庫跑路】一次刪除pip下載的所有第三方庫方法

進入命令行&#xff0c;先list看下庫存 pip list導出所有的第三方庫至一文件列表 pip freeze >requirements.txt按照列表卸載所有庫 pip uninstall -r requirements.txt -y再list看下&#xff0c;可見庫存已清空

1、課程導學(react+區塊鏈實戰)

1、課程導學&#xff08;react區塊鏈實戰&#xff09; 1&#xff0c;課程概述&#xff08;1&#xff09;課程安排&#xff08;2&#xff09;學習前提&#xff08;3&#xff09;講授方式&#xff08;4&#xff09;課程收獲 2&#xff0c;ibloackchain&#xff08;1&#xff09;安…

java:字符緩沖流特有功能

BufferedWriter&#xff1a; void newLine&#xff08;&#xff09;&#xff1a;寫一行行分隔符&#xff0c;行分隔符字符串由系統屬性定義 BufferedReader&#xff1a; public String readLine&#xff08;&#xff09;&#xff1a;讀一行文字&#xff0c;結果包含行的內容的字…

振動分析-11-軸承數據庫之深度學習一維故障分類Transformer

Pytorch-Transformer軸承故障一維信號分類(三) 1 制作數據集 import pandas as pd filename = "CWRU_1797.csv" df = pd.read_csv(filename)from sklearn.model_selection import train_test_split df_x=df.drop(labels=1024,axis=1)

AI賦能OFFICE 智能化辦公利器!

ONLYOFFICE在線編輯器的最新版本8.1已經發布&#xff0c;整個套件帶來了30多個新功能和432個bug修復。這個文檔編輯器無疑成為了辦公軟件中的翹楚。它不僅支持處理文本文檔、電子表格、演示文稿、可填寫的表單和PDF&#xff0c;還允許多人在線協作&#xff0c;并支持AI集成&…

java Pair怎么使用

文章目錄 1. 簡介2. Pair類的來源3. 如何使用Pair類4. Pair類的實際應用5. Pair類的優點和缺點 1. 簡介 什么是Pair Pair是一個通用的數據結構&#xff0c;用于存儲一對關聯的對象&#xff0c;也就是兩個元素。這兩個元素可以是任何類型&#xff0c;并且它們之間沒有特定的層次…

哪些獨立站外鏈策略最有效?

在當前的SEO領域中&#xff0c;獨立站外鏈策略的效果差異很大&#xff0c;但GPB外鏈無疑是其中最為有效的一種。GPB外鏈&#xff0c;指的是通過高質量、包收錄且dofollow的頂級域名獨立站來獲得外鏈&#xff0c;這種外鏈策略能夠顯著提升目標網站的整體排名數據。 關鍵詞排名的…