【问题标题】:Unity C# crashes on execution accessing a list variableUnity C# 在执行访问列表变量时崩溃
【发布时间】:2017-08-09 01:28:45
【问题描述】:

(已在编辑中回答,谢谢大家!)

我在 Unity 中的 MenuScript 基本上应该只是在公共函数调用上创建菜单项。但是,在编辑器中按下 Start 时,整个程序停止工作(没有错误消息,但什么都不会发生)。

我已将其缩小到现有的虚拟按钮列表(它们将根据 newMenu 功能而改变)。在 start 函数中访问 menu_items 变量时,一切都很好。但是,在它之外,Unity 将继续崩溃。

public class MenuScript : MonoBehaviour {

public List<Button> menu_items;
public bool paused;
private bool gameStarted;

// Use this for initialization
void Start()
{

    // initializing (previously forgotten, added upon comments!
    menu_items = new List<Button>();
    foreach (Button btn in GetComponentsInChildren<Button>()) { 
        menu_items.Add(btn);
    }

    print("start function test: " + menu_items[0].name); // works.

}

// Update is called once per frame
void Update () {

}

public bool newMenu(string item0, string item1, string item2, string item3)
{
    int tmp = 0;

    print("new Menu function test: " +menu_items[0].name); // CRASH
    //if (createNewMenuItem(0, item0)) tmp++;
    //if (createNewMenuItem(1, item1)) tmp++;
    //if (createNewMenuItem(2, item2)) tmp++;
    //if (createNewMenuItem(3, item3)) tmp++;

    if (tmp == 4) return true;
    else return false;
}

public void newMenu(int pos, string item)
{
    print("newMenu function");
    createNewMenuItem(pos, item);
}


private bool createNewMenuItem(int pos, string item)
{
    print("Creating new menu item for position " + pos + ": " + item);

    //Crashes unity:
    //Text text = menu_items[pos].GetComponentInChildren<Text>();
    //Text text = menu_items[pos].transform.GetChild(0).GetComponent<Text>();

    /*
    do button stuff here...
    */
    return true;

}


// more unimportant stuff ... 
}

现在,谁能告诉我我忽略了什么?我对这整个考验感到非常困惑。谢谢!

编辑:添加了 menu_items 的初始化。虽然没有解决问题。

Edit2:所以我通过重写很多来让它工作。问题 - 如我所见 - 是 Unity 而不是像往常一样将错误消息写入我愚蠢的拼写错误,它只是崩溃了。我相信 Unity 的错误系统出于某种原因有问题,尽管我无法真正证明这一点。非常感谢。

【问题讨论】:

  • 你永远不会初始化menu_items。你在哪里设置menu_items = new List&lt;Button&gt;()
  • @RenéVogt 我倾向于假设 menu_items 是通过 Unity 的序列化系统填充的。上述行为听起来更像是无限循环或递归,而不是简单的 NRE,应该在不挂起 Unity 的情况下记录它。
  • @rutter 好的,看来我对统一性了解不够,所以我重新提出问题。
  • 完全没有错误信息?嗯,这似乎很奇怪。您可以在上面附加一个调试器,然后尝试单步执行代码,看看会发生什么吗?如果这是一个逻辑/循环错误,它会很快变得明显。

标签: c# unity3d crash


【解决方案1】:

我几乎遇到了同样的问题。原来我的拼写有一个简单的错误。将私有字段 A 与公共字段 A 混合在一起 -> 大写字母。我没有收到来自 Unity Eidtor 的错误消息。编辑器每次都死机,不得不硬性关闭(杀死进程)。

【讨论】:

    【解决方案2】:

    所以我通过重写代码让它工作 - 首先无济于事,直到我修复了一些拼写错误,根据我的经验,实际上应该只给我异常而不会使程序崩溃。问题 - 如我所见 - 是 Unity 而不是像往常一样将错误消息写入我愚蠢的拼写错误,它只是崩溃了。我相信 Unity 的错误系统出于某种原因有问题,尽管我无法真正证明这一点。如果问题再次出现,我会尝试重新安装或其他东西。非常感谢。

    【讨论】:

      【解决方案3】:
      void Start() {
        menu_items = new List<Button>();
      
        foreach (Button btn in GetComponentsInChildren<Button>()) { 
            menu_items.Add(btn);
        }
        print("start function test: " + menu_items[0].name); // works.
      
      }  
      

      您需要在使用前添加 menu_items = new List(); 来实例化一个新的 List 对象。

      【讨论】:

      • 在基于 Unity 的项目中,这可能是不明智的。在分配 menu_items 之前,程序员可能想要检查它是否使用来自 Unity 序列化系统的值填充。
      • 是的,没错。我的回答是针对这个案例的。像if(menu_items == null) 这样的简单测试应该可以完成这项工作。
      • 哦,伙计...谢谢。我仍然对为什么 Unity 崩溃而不是在我忘记初始化东西时做它总是做的事情感到困惑 - 只是向我发送一条错误消息。编辑:好的,我改变了它。 Unity 仍然在同一点崩溃。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多