记录一下Unity写脚本时遇到的bug

文章讲述了作者在移植C#代码到Unity项目时遇到关于List拷贝的问题,误认为是变量大小写问题,实际上是由于浅拷贝导致的。通过学习和修正,作者了解到如何通过深拷贝避免数据共享带来的影响。
摘要由CSDN通过智能技术生成

鉴定为学C#不精导致的

ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index

点击后导向到这一行,挺常见的报错,有个地方导致a数组大小出问题了

然而,问题在于这个脚本我是移植别人写好的C++函数,可以运行理论上不可能出这种问题,C++函数如下:

我排查了很久发现问题可能在这

我修改了List a的值,打印输出了List A的值,然后发现

居然前后不一样?

那一瞬间我以为unity不区分变量的大小写,我寻思怎么会有这么逆天的事情

问了GPT后回答如下:

在GetExtra()方法中,将C[i]添加到a[i]后,List<List<double>> a = A;实际上是浅拷贝,即a和A指向同一个内存地址,所以在修改a时,实际上也修改了A。因此打印出的信息一样。要避免这种情况,可以使用深拷贝复制A到a。

GPT的回复是错的,应将代码修改如下:

    public List<List<double>> GetExtra()
    {
        List<List<double>> a = new List<List<double>>();
        foreach(var sublist in A)
        {
            List<double> copiedSublist = new List<double>(sublist);
            a.Add(copiedSublist);
        }
        for (int i = 0; i < a.Count; i++)
        {
            Debug.Log("before="+A[i].Count);
            a[i].Add(C[i]); //(N+1)*(N+1)
            Debug.Log("after=" + A[i].Count);
        }
        return a;
    }

这样,在GetExtra()方法中返回的List<List<double>> a就是一个深拷贝,修改a时不会影响原始的A。

我就花了几天草草学了一下C#后直接开干unity项目主打一个边做边学,哪懂什么浅拷贝深拷贝

或者用CopyTo(Unity&&C#学习笔记-拆装箱,List,浅深拷贝,equals和==_unity 深拷贝浅拷贝-CSDN博客

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Unity脚本C#是一种用于编Unity游戏引擎中逻辑和功能的脚本语言。它是一种C家族语言的变体,结合了C++的面向对象特性和C的简洁性。下面我将详细介绍Unity脚本C#的几个重要特性。 首先,Unity脚本C#具有强大的面向对象编程能力。它支持类、对象、继承、多态等常见的面向对象概念,使得开发者可以更加方便地组织和管理代码。通过定义类和对象,我们可以创建游戏场景中的各种物体,为它们添加属性和方法,并实现各种交互和逻辑。 其次,Unity脚本C#提供了丰富的Unity API,使得开发者可以轻松地访问和操作Unity引擎中的功能和资源。我们可以通过API获取游戏对象的位置、旋转和缩放等信息,控制游戏对象的移动、旋转和动画等操作,还可以加载和管理游戏资源,如场景、贴图和音频等。 此外,Unity脚本C#还支持事件驱动编程。开发者可以使用事件来响应用户的输入或者游戏中的某些特定条件。例如,我们可以为按钮添加点击事件,当用户点击按钮,触发指定的方法,实现相应的逻辑。这种事件驱动的编程方式使得游戏的交互性更好,用户可以通过交互体验到更加直观和响应的操作。 最后,Unity脚本C#还提供了强大的调试功能。我们可以在代码中添加断点,通过调试器来跟踪代码的执行流程,并查看变量的值。这对于排查和解决代码中的bug非常有帮助。此外,Unity脚本C#还支持日志输出,我们可以在代码中使用日志函数打印信息,便于在开发过程中调试和分析代码。 综上所述,Unity脚本C#是开发Unity游戏的一种强大的脚本语言,具有丰富的面向对象编程能力、强大的Unity API支持、事件驱动编程和调试功能,为开发者提供了便捷和高效的开发体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值