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

Unity AR卡牌游戏按钮触发NullReferenceException错误求助

问题分析与解决方案

你的NullReferenceException错误核心来自两个关键问题,以下是针对性修复方案:

1. 数组索引越界导致空引用

你的player1Hand和player2Hand都是长度为5的数组(有效索引范围是0-4),但在Rating()方法中,你尝试访问索引5的元素:

if (player1Hand[5].rating > player2Hand[5].rating)

该索引超出数组范围,直接触发空引用错误。修改为正确的索引(如果你想取第5张牌,对应索引是4):

public void Rating()
{
    if (player1Hand[4].rating > player2Hand[4].rating)
    {
        Debug.Log("Player 1 wins the round!");
        player1Score++;
        player2Score--;
    }
    else if (player2Hand[4].rating > player1Hand[4].rating)
    {
        Debug.Log("Player 2 wins the round!");
        player2Score++;
        player1Score--;
    }
    else
    {
        Debug.Log("It's a tie!");
    }
    CheckWinner();
}

同时检查其他方法的索引(比如Year()用索引1、Fame()用索引2),确保符合你想要的卡牌对比逻辑。

2. 按钮绑定的常见排查点

如果修改索引后仍报错,检查以下内容:

  • 确认GameLogic脚本已挂载到场景中激活的GameObject上,且该对象在按钮点击时不会被销毁。
  • 检查按钮的OnClick事件面板:
    • 将挂载GameLogic的GameObject拖拽到事件的对象槽中。
    • 选择正确的方法(例如GameLogic -> Year()),避免选错脚本或方法。
  • 若后续要启用uitext相关代码,需在Inspector面板中为该字段赋值对应的Text组件。

额外优化建议

  • 添加空值与索引合法性检查,避免意外错误:
if(player1Hand != null && player2Hand != null && index < player1Hand.Length && index < player2Hand.Length)
{
    // 执行对比逻辑
}
else
{
    Debug.LogError("卡牌数组未初始化或索引越界");
}
  • 提取通用对比方法,减少重复代码:
private void CompareCards(int index, Func<Card, int> getProperty, string propertyName)
{
    if(player1Hand == null || player2Hand == null || index >= player1Hand.Length || index >= player2Hand.Length)
    {
        Debug.LogError("无效的卡牌索引或未初始化卡牌数组");
        return;
    }

    int p1Val = getProperty(player1Hand[index]);
    int p2Val = getProperty(player2Hand[index]);

    if(p1Val > p2Val)
    {
        Debug.Log($"Player 1 wins the round with {propertyName}!");
        player1Score++;
        player2Score--;
    }
    else if(p2Val > p1Val)
    {
        Debug.Log($"Player 2 wins the round with {propertyName}!");
        player2Score++;
        player1Score--;
    }
    else
    {
        Debug.Log($"Tie on {propertyName}!");
    }
    CheckWinner();
}

// 调用示例
public void Year()
{
    CompareCards(1, card => card.year, "Year");
}

public void Rating()
{
    CompareCards(4, card => card.rating, "Rating");
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 00:32:00