【超级详细】Unity中MVC模式下的抽奖转盘小案例,新手必看

 预览效果:

一:创建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);

  }

猜你喜欢

转载自blog.csdn.net/m0_74022070/article/details/130084322