プレビュー効果:
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("回调到了" + 名前);}