用SuperScrollView实现抽奖滚动的效果
1.创建一个scrollview,在需要滚动区域上加上LoopListView2,需要生成的预制体放在ItemPrefab里面,注意:如果需要Item滚动的范围很大就要勾选supportscrollbar,否则只能在固定区域循环item。
2.创建一个viewPort,加上Mask组件
3.在content下面创建一个Item,加一个数据模型脚本,再加上LoopListViewItem2的脚本
4.创建一个空物体,挂上UI资源管理脚本
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.IO;
namespace SuperScrollView
{
public class ResManager : MonoBehaviour
{
public Sprite[] spriteObjArray;
// Use this for initialization
static ResManager instance = null;
string[] mWordList;
Dictionary<string, Sprite> spriteObjDict = new Dictionary<string, Sprite>();
public static ResManager Get
{
get
{
if (instance == null)
{
instance = Object.FindObjectOfType<ResManager>();
}
return instance;
}
}
void InitData()
{
spriteObjDict.Clear();
foreach (Sprite sp in spriteObjArray)
{
spriteObjDict[sp.name] = sp;
}
}
void Awake()
{
instance = null;
InitData();
}
public Sprite GetSpriteByName(string spriteName)
{
Sprite ret = null;
if (spriteObjDict.TryGetValue(spriteName, out ret))
{
return ret;
}
return null;
}
public string GetRandomSpriteName()
{
int count = spriteObjArray.Length;
int index = Random.Range(0, count);
return spriteObjArray[index].name;
}
public int SpriteCount
{
get
{
return spriteObjArray.Length;
}
}
public Sprite GetSpriteByIndex(int index)
{
if (index < 0 || index >= spriteObjArray.Length)
{
return null;
}
return spriteObjArray[index];
}
public string GetSpriteNameByIndex(int index)
{
if (index < 0 || index >= spriteObjArray.Length)
{
return "";
}
return spriteObjArray[index].name;
}
}
}
5.创建一个空物体挂上数据管理脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace SuperScrollView
{
public class DataSourceMgr : MonoBehaviour
{
List<LuckDrawRewardCoinsModel> mItemDataList = new List<LuckDrawRewardCoinsModel>();
System.Action mOnRefreshFinished = null;
System.Action mOnLoadMoreFinished = null;
int mLoadMoreCount = 20;
float mDataLoadLeftTime = 0;
bool mIsWaittingRefreshData = false;
bool mIsWaitLoadingMoreData = false;
public int mTotalDataCount = 10000;
static DataSourceMgr instance = null;
public static DataSourceMgr Get
{
get
{
if (instance == null)
{
instance = Object.FindObjectOfType<DataSourceMgr>();
}
return instance;
}
}
void Awake()
{
Init();
}
public void Init()
{
DoRefreshDataSource();
}
public LuckDrawRewardCoinsModel GetItemDataByIndex(int index)
{
if (index < 0 || index >= mItemDataList.Count)
{
return null;
}
return mItemDataList[index];
}
public int TotalItemCount
{
get
{
return mItemDataList.Count;
}
}
public void RequestRefreshDataList(System.Action onReflushFinished)
{
mDataLoadLeftTime = 1;
mOnRefreshFinished = onReflushFinished;
mIsWaittingRefreshData = true;
}
public void RequestLoadMoreDataList(int loadCount,System.Action onLoadMoreFinished)
{
mLoadMoreCount = loadCount;
mDataLoadLeftTime = 1;
mOnLoadMoreFinished = onLoadMoreFinished;
mIsWaitLoadingMoreData = true;
}
public void Update()
{
if (mIsWaittingRefreshData)
{
mDataLoadLeftTime -= Time.deltaTime;
if (mDataLoadLeftTime <= 0)
{
mIsWaittingRefreshData = false;
DoRefreshDataSource();
if (mOnRefreshFinished != null)
{
mOnRefreshFinished();
}
}
}
else if (mIsWaitLoadingMoreData)
{
mDataLoadLeftTime -= Time.deltaTime;
if (mDataLoadLeftTime <= 0)
{
mIsWaitLoadingMoreData = false;
DoLoadMoreDataSource();
if (mOnLoadMoreFinished != null)
{
mOnLoadMoreFinished();
}
}
}
}
public void SetDataTotalCount(int count)
{
mTotalDataCount = count;
DoRefreshDataSource();
}
void DoRefreshDataSource()
{
mItemDataList.Clear();
for (int i = 0; i < mTotalDataCount; ++i)
{
LuckDrawRewardCoinsModel tData = LuckDrawRewardCoinsItemController.Instance.RewardCoinsDataList[Random.Range(0,6)];
//tData.CoinsIcon = LuckDrawRewardCoinsItemController.Instance.RewardCoinsDataList[i].CoinsIcon;
//tData.RewardCoins = LuckDrawRewardCoinsItemController.Instance.RewardCoinsDataList[i].RewardCoins;
mItemDataList.Add(tData);
}
}
void DoLoadMoreDataSource()
{
int count = mItemDataList.Count;
for (int k = 0; k < mLoadMoreCount; ++k)
{
int i = k + count;
LuckDrawRewardCoinsModel tData = LuckDrawRewardCoinsItemController.Instance.RewardCoinsDataList[Random.Range(0,6)];
//tData.CoinsIcon = LuckDrawRewardCoinsItemController.Instance.RewardCoinsDataList[i].CoinsIcon;//ResManager.Get.GetSpriteNameByIndex(Random.Range(0, 10));
//tData.RewardCoins = LuckDrawRewardCoinsItemController.Instance.RewardCoinsDataList[i].RewardCoins;
mItemDataList.Add(tData);
}
}
}
}
6.把需要创建的对象用json写入:如每个对象的图片,属性等等,读取出来后给每个Item赋值。