预览效果:
一:创建Panel,命名为LotteryPanel,去掉勾选Image,使其背景为透明。
二:在子目录下创建Image,命名为turntable(转盘),设置转盘图片(转盘的圆形图片);
大家可以自行修改背景颜色,我选的是深蓝色。
三:在turntable子目录下创建若干个Image,命名为lot,并附上图片。
再添加两个按钮,开始抽奖按钮和关闭按钮。
四:写代码,挂脚本<LotteryPanel>
1)声明变量
我们逐一拖拽好以下公开变量:
public Image turnTable; //转盘
public Button btn_start,btn_close; //两个按钮
int index; //记录抽到的下标
GetPrizeModel get; //Model层数据
public Transform createPartical; //生成特效的地方,也就是LotteryPanel
2)抽奖开始啦,因为我用到了MVC框架,这里的Init方法类似于Start方法
这里写了注释,大家应该可以看懂。
public override void InitPanel()
{
//获取Get部分的Model层
get = ModelManager.Ins.GetModel<GetPrizeModel>();
//监听获取随机值
MessageManager.Ins.OnAddListner(Define.PRIZEDRAW, GetPrizeCall);
base.InitPanel();
//点击开始抽奖按钮
btn_start.onClick.AddListener(()=>
{
//先让按钮不可交互
btn_start.interactable = false;
//这个方法获取随机值
ModelManager.Ins.GetModel<LotteryModel>().PrizeDraw();
//花钱抽奖
MessageManager.Ins.OnDisPatch(100, 100);
});
//点击关闭按钮
btn_close.onClick.AddListener(() =>
{
UIManager.Ins.CloseUI(PanelName.LotteryPanel);
});
}
private void GetPrizeCall(object obj)
{
object[] arr = obj as object[];
LotData data = arr[0] as LotData; //获取抽到的数据
index = int.Parse(arr[1].ToString()); //获取随机值
//获取抽到的名字
string name = ModelManager.Ins.GetModel<LotteryModel().myalllotdata[index].name;
//转盘转动
turnTable.transform.DORotate(new Vector3(0, 0, 720 + index * 40),
5,RotateMode.FastBeyond360).OnComplete(()=> //转完后执行以下方法
{
btn_start.interactable =true;
//print("转完了获得" + name);
UIManager.Ins.OpenUI(PanelName.GetPanel);
//实例化特效
Instantiate(Resources.Load<GameObject>("P1"), createPartical, false);
//发消息
get.GetPrize(name);
});
}
我们看一下LotteryModel的代码,有数据myalllotdata,害、还有一个方法是负责广播消息的【广播开始抽奖了,传过去随机值】
public class LotteryModel : ModelBase
{
public List<LotData> myalllotdata;
public override void InitModel()
{
myalllotdata = new List<LotData>();
myalllotdata = ConfigManager.Ins.table_Lot.Table;
base.InitModel();
}
public void PrizeDraw() //抽奖方法
{
//获取随机值
int index = Random.Range(0, myalllotdata.Count);
//广播抽奖开始了
MessageManager.Ins.OnDisPatch(Define.PRIZEDRAW, myalllotdata[index],index);
}
}
我们看一下GetPrizeModel的代码,有一个方法是负责广播消息的【广播获取到什么奖品】
public class GetPrizeModel : ModelBase
{
public override void InitModel()
{
base.InitModel();
}
public void GetPrize(string name)
{
MessageManager.Ins.OnDisPatch(Define.GETPRIZE, name);
}
}
我们可以梳理一下:
LotterPanel挂的InitPanel方法提前监听获取到的随机index值(也就是奖品的下标)------>>
当按下开始抽奖的时候,调用LotteryModel的抽奖方法PrizeDraw(获取随机下标),这里就会广播消息,正好我们提前监听了-------->>
然后回调方法里GetPrizeCall就根据刚刚传过来的下标,在LotteryModel层获取了数据(获取到了奖品名字,【这里我通过ConfigManager里的读取了json表】),并显示圆盘转动的过程-------->>
然后转盘结束转动后OnComplete方法就会调用GetPrizeModel里的方法GetPrize(广播抽到什么奖品)-------->>
打开另一个GetPanel时就会在init方法里监听上面的消息-------->>
回调方法里就会获取到奖品名字了(显示抽到物品的信息),大概意思如下:
MessageManager.Ins.OnAddListner(Define.GETPRIZE, getprizeCall);
private void getprizeCall(object obj)
{
object[] arr = obj as object[];
string name = arr[0].ToString();
print("回调到了" + name);}