Unity轮盘赌游戏撤销按钮优化:实现单注逐次撤销
轮盘赌撤销按钮逐次撤销单注问题

这是我的Unity轮盘赌游戏项目,我是Unity新手,现在遇到了撤销按钮的功能问题——在同一位置连续下注3次1Rs的赌注后,按下撤销按钮会一次性移除全部3Rs的赌注,但我希望能逐次撤销单注。
当前撤销按钮代码
public void Undo() { if (Bets.Count != 0 && BetSpaces.Count != 0) { var lastBet = Bets.Last(); var lastSpace = BetSpaces.Last(); //UserDetail.Balance += lastBet.chip; UserDetail.Balance += BetSpaces.Last().stack.value; UpdateBalance(UserDetail.Balance); lastSpace.SetAllMeshes(false); lastSpace.Clear(); Bets.Remove(lastBet); BetSpaces.Remove(lastSpace); var totalBets = int.Parse(TotalBetCount.text); if (totalBets > 0) TotalBetCount.text = (totalBets--).ToString(); TakeButton.interactable = false; } var indexesToRemove = new List<int>(); BetSpaces.ForEach(X => { GlobalFunctions.PrintLog($"X: {X.stack.value}"); if (X.stack.value == 0) { indexesToRemove.Add(BetSpaces.IndexOf(X)); } else { X.SetAllMeshes(true); } }); for (int i = 0; i < indexesToRemove.Count; i++) { Bets.RemoveAt(indexesToRemove[i]); BetSpaces.RemoveAt(indexesToRemove[i]); } UndoButton.interactable = Bets.Count != 0; SceneRoulette._Instance.clearButton.interactable = Bets.Count != 0; SceneRoulette._Instance.rollButton.interactable = Bets.Count != 0; }
问题原因
- 同一位置多次下注时,金额被合并到了同一个
BetSpace的stack.value中,而非为每一次下注单独创建Bet和BetSpace条目,导致撤销时直接清空了该位置的所有赌注。 - 代码中
lastSpace.Clear()会直接清空该区域的全部金额,而非只减去单次下注的1Rs。 - 后续遍历删除空
BetSpace的逻辑,会直接移除当前位置的条目,无法保留剩余赌注记录。
修复方案
核心调整思路
让Bets列表存储每一次单独的下注记录,而非按位置合并的总金额;撤销时只扣减单次下注的金额,而非清空整个区域。
修改后的撤销代码
public void Undo() { if (Bets.Count == 0) return; // 获取最后一笔单独的下注记录 var lastBet = Bets.Last(); // 找到该下注对应的区域(需确保Bet对象关联了对应的BetSpace) var targetSpace = BetSpaces.FirstOrDefault(s => s == lastBet.BetSpace); if (targetSpace == null) return; // 退还单次下注的金额 UserDetail.Balance += lastBet.chip; UpdateBalance(UserDetail.Balance); // 扣减该区域的总金额,而非直接清空 targetSpace.stack.value -= lastBet.chip; // 根据剩余金额更新显示 if (targetSpace.stack.value > 0) { // 调用更新筹码显示的方法(需自行实现,刷新当前区域的筹码视觉) targetSpace.UpdateChipDisplay(); } else { // 金额为0时再清空视觉并移除该区域 targetSpace.SetAllMeshes(false); targetSpace.Clear(); BetSpaces.Remove(targetSpace); } // 移除最后一笔单独的下注记录 Bets.Remove(lastBet); // 更新总赌注数,每次减1 var totalBets = int.Parse(TotalBetCount.text); if (totalBets > 0) { totalBets--; TotalBetCount.text = totalBets.ToString(); } // 更新各按钮交互状态 bool hasRemainingBets = Bets.Count != 0; UndoButton.interactable = hasRemainingBets; SceneRoulette._Instance.clearButton.interactable = hasRemainingBets; SceneRoulette._Instance.rollButton.interactable = hasRemainingBets; TakeButton.interactable = false; }
额外注意事项
- 同步修改下注逻辑:每次点击下注(哪怕同一位置),都要向
Bets列表添加一条新的Bet对象,并且确保Bet对象关联对应的BetSpace。 - 若
BetSpace没有UpdateChipDisplay方法,需要自行实现,用来刷新当前区域剩余筹码的视觉效果。 - 移除原代码中遍历删除空
BetSpace的逻辑,只在当前撤销后区域金额变为0时再处理即可。
内容的提问来源于stack exchange,提问作者Vinit Kumawat
相关产品推荐
相关产品推荐

