You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

问题原因

  1. 同一位置多次下注时,金额被合并到了同一个BetSpace的stack.value中,而非为每一次下注单独创建Bet和BetSpace条目,导致撤销时直接清空了该位置的所有赌注。
  2. 代码中lastSpace.Clear()会直接清空该区域的全部金额,而非只减去单次下注的1Rs。
  3. 后续遍历删除空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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 22:17:07