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

Unity C#老虎机中奖组合检测失效问题排查与方案咨询

Unity老虎机中奖检测失效的原因及修复方案

核心问题分析

你的Check()方法失效主要有两个关键原因:

  1. 错误比较GameObject实例
    每次Instantiate()都会生成全新的GameObject实例,哪怕是同一个prefab创建的,==比较的是对象引用,永远不会相等。你现在用reels[2].transform.GetChild(0) == reels[1].transform.GetChild(0)这种方式判断图标类型完全不成立。

  2. 子物体索引逻辑错误
    从旋转代码看,每个卷轴每次只实例化一个图标作为子物体,但Check()里却用了reels[1].transform.GetChild(1)——这个索引对应的子物体根本不存在,会直接导致逻辑判断失效或空引用错误。

修复方案

步骤1:给图标添加类型标识

不要直接比较GameObject,而是给每个图标prefab添加类型标识,推荐两种方案:

方案A:枚举+自定义组件

创建SymbolType枚举和SymbolComponent脚本:

public enum SymbolType
{
    Cherry,
    Grape,
    Seven,
    Orange,
    Lemon
}

public class SymbolComponent : MonoBehaviour
{
    public SymbolType type;
}

给每个图标prefab添加该组件,在Inspector中设置对应的type值(比如cherryPrefab的type设为Cherry)。

方案B:使用标签

给每个图标prefab设置对应标签(比如"Cherry"、"Grape"等),后续通过GameObject.tag判断类型。

步骤2:优化旋转代码(可选)

简化选择图标的逻辑,避免冗长switch:

// 在Inspector按顺序拖入Cherry、Grape、Seven、Orange、Lemon
public GameObject[] symbolPrefabs; 

IEnumerator SpinReel(int reelIndex)
{
    float spinTime = Random.Range(1.5f, 3.0f);
    yield return new WaitForSeconds(spinTime);
    
    int symbolIndex = Random.Range(0, symbolPrefabs.Length);
    GameObject newSymbol = Instantiate(symbolPrefabs[symbolIndex], reels[reelIndex].transform);
    newSymbol.transform.localPosition = Vector3.zero;

    yield return new WaitForSeconds(1.5f);
}

步骤3:重写中奖检测逻辑

以使用SymbolComponent为例,修正Check()方法:

void Check()
{
    // 获取每个卷轴当前显示的图标组件
    SymbolComponent reel0Symbol = reels[0].transform.GetChild(0).GetComponent<SymbolComponent>();
    SymbolComponent reel1Symbol = reels[1].transform.GetChild(0).GetComponent<SymbolComponent>();
    SymbolComponent reel2Symbol = reels[2].transform.GetChild(0).GetComponent<SymbolComponent>();

    // 三者相同的中奖情况
    if (reel0Symbol.type == reel1Symbol.type && reel1Symbol.type == reel2Symbol.type)
    {
        Debug.Log("中大奖!");
        currency += bet * 2;
        Debug.Log($"当前货币:{currency}");
    }
    // 任意两个相同的中奖情况
    else if (reel0Symbol.type == reel1Symbol.type || reel1Symbol.type == reel2Symbol.type || reel0Symbol.type == reel2Symbol.type)
    {
        Debug.Log("小奖!");
        currency += bet;
        Debug.Log($"当前货币:{currency}");
    }
}

额外注意事项

  • 调用时机:必须等所有卷轴的旋转协程执行完毕(所有图标实例化完成)后再调用Check(),否则会因子物体未生成导致空引用。可通过计数器或WaitForAll判断旋转是否完成。
  • 清理旧图标:每次旋转前销毁卷轴上的旧图标,避免子物体堆积导致GetChild(0)拿到历史图标。

内容的提问来源于stack exchange,提问作者Flaviu Lupas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 13:05:17