[超詳細] Unity の MVC モードでの宝くじカルーセルの小さなケース、初心者必読

 プレビュー効果:

1: Panelを作成し、 LottoryPanel という名前を付け、Image のチェックを外して背景を透明にします。

2:サブディレクトリにイメージを作成し、turntable (turntable) という名前を付け、ターンテーブルの画像 (ターンテーブルの丸い画像) を設定します。

 背景色は自分で変更できますが、私はダークブルーを選択しました。

 3: ターンテーブル サブディレクトリに複数のイメージを作成し、ロットという名前を付けて、イメージを添付します。

さらに 2 つのボタン、描画開始ボタンと閉じるボタンを追加します。

4: コードを記述してスクリプトをハングする<LotteryPanel>

 1) 変数を宣言する

次のパブリック変数を 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);
           
                    
        });
        
    }

 LottoryModel のコードを見てみましょう。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 メソッドは、取得したランダムなインデックス値 (つまり賞品の添字) を事前に監視します。----->>

を押して宝くじを開始すると、LotteryModel の宝くじメソッドPriceDraw (ランダムな添え字を取得)が呼び出され、メッセージがここにブロードキャストれます。

次に、コールバック メソッドで、GetPrizeCall は渡された添字に基づいて LottoryModel レイヤーのデータを取得し(賞品の名前が取得されます[ここでは ConfigManager を通じて json テーブルを読み取ります] )、ディスクの回転のプロセスを表示します。 -- ------>>

次に、ターンテーブルの回転が終了した後、OnComplete メソッドは GetPrizeModel 内のメソッド GetPrize を呼び出します(抽選された賞品をブロードキャストします) -------->>

別の GetPanel を開くと、 init メソッドで上記のメッセージが監視されます -------->>

賞品名はコールバックメソッド(抽選アイテムの情報表示)で取得されますが、大まかな意味は以下の通りです。

 MessageManager.Ins.OnAddListner(Define.GETPRIZE, getprizeCall);

 private void getprizeCall(object obj)
    {         object[] arr = obj as object[];         文字列名 = arr[0].ToString();         print("回调到了" + 名前);


  }

おすすめ

転載: blog.csdn.net/m0_74022070/article/details/130084322