Unity C#老虎机中奖组合检测失效问题排查与方案咨询
Unity老虎机中奖检测失效的原因及修复方案
核心问题分析
你的Check()方法失效主要有两个关键原因:
错误比较GameObject实例
每次Instantiate()都会生成全新的GameObject实例,哪怕是同一个prefab创建的,==比较的是对象引用,永远不会相等。你现在用reels[2].transform.GetChild(0) == reels[1].transform.GetChild(0)这种方式判断图标类型完全不成立。子物体索引逻辑错误
从旋转代码看,每个卷轴每次只实例化一个图标作为子物体,但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
相关产品推荐
相关产品推荐

