public UniTask DriveBy(Production production) { //各リールの制御タスクを格納するListを用意 List <UniTask> reelDriveTasks = new List <UniTask>(); //左右真ん中3つのリールに対して、同様の処理を行う foreach (var(reelPos, provider) in sequenceProviderTable) { //通常の回転シーケンスを取得 var sq = provider.CreateFirstRollSequence(production[reelPos].FirstRole, production.NormalProperty) //Play時にステータスを更新 .OnPlay(() => productionStatus.Value = SlotProductionStatus.Rolling); //リールの演出がリーチの場合はリーチシーケンスを追加 if (production[reelPos].IsReachProduction) { //リーチ開始時(通常の回転シーケンス完了時)にステータスを更新 sq.OnComplete(() => productionStatus.Value = SlotProductionStatus.Reaching); //リールの演出を取得 ReelProduction reelProduction = production[reelPos]; //拮抗演出の守備側と攻撃側を取得 //defenser:現在の位置を死守しようとする役, offenser:位置を獲得しようとする役 RoleValue defenser = production.IsWinProduction ? reelProduction.FinallyRole.Previous : reelProduction.FinallyRole; RoleValue offenser = production.IsWinProduction ? reelProduction.FinallyRole : reelProduction.FinallyRole.Next; //拮抗直前まで高速回転させるシーケンスを追加 sq.Append(provider.CreateReachReRollSequence(startRole: reelProduction.FirstRole, endValue: defenser, prop: production.ReachProperty)); //ランダムに拮抗演出を取得する AntagonistType antagonistType = UnityUtility.Enum.Random <AntagonistType>(); //拮抗演出シーケンスを追加 sq.Append(provider.CreateAntagonistSequence(antagonistType, new AntagonistSequenceProperty() { Defenser = defenser, Offenser = offenser, IsOffenserWin = production.IsWinProduction })); } //リールの制御を開始して、そのタスクを保持する reelDriveTasks.Add(sq.PlayAsync()); } //各リールの制御がすべて完了したら、当たり演出を追加する //当たり演出が完了するまでのタスクを返す return(UniTask.WhenAll(reelDriveTasks).ContinueWith(() => { //当たりじゃなければここで終了 if (!production.IsWinProduction) { productionStatus.Value = SlotProductionStatus.Idol; return UniTask.CompletedTask; } //当たりなら当たり演出を追加 else { //各リールに対して当たり演出シーケンスを追加 return sequenceProviderTable .Select(kvp => (reelpos: kvp.Key, provider: kvp.Value)) .Select(pair => pair.provider //当たり演出シーケンスを取得 .CreateWinningProductionSequence(production.FinallyRoleset[pair.reelpos]) //再生開始したらステータスを「当たり演出中」に変更 .OnPlay(() => productionStatus.Value = SlotProductionStatus.Winning) //シーケンスが完了したらステータスを「アイドル」に変更 .OnComplete(() => productionStatus.Value = SlotProductionStatus.Idol) //再生してタスクに変換 .PlayAsync()) //各リールのタスクをまとめて返す .WhenAll(); } })); }
/// <summary> /// リーチの拮抗演出シーケンスを取得する /// </summary> /// <param name="antagonist"></param> /// <param name="property"></param> /// <returns></returns> public IReelSequence CreateAntagonistSequence(AntagonistType antagonist, AntagonistSequenceProperty property) { return(antagonistProvider.GetAntagonistSequence(antagonist, property)); }
public IReelSequence GetAntagonistSequence(AntagonistType antagonist, AntagonistSequenceProperty property) { return(antagonistSqCreatorTable[antagonist].Create(property)); }