【问题标题】:Unity: build crashes when trying to copy `mesh`Unity:尝试复制“网格”时构建崩溃
【发布时间】:2019-08-27 19:12:09
【问题描述】:

这段代码在 Unity 编辑器中运行良好:

MeshFilter meshFilter = GetComponent<MeshFilter>();
MeshFilter newFilter = visuals.AddComponent<MeshFilter>();
newFilter.mesh = meshFilter.mesh; // [crashes here]

但在作为 Build 运行时在第 3 行崩溃。

我发现了一个question,它似乎非常相似,但它没有提供任何解释为什么它在构建中崩溃但在编辑器中没有。在我的情况下,我通过使用 sharedMesh 属性而不是 mesh 来修复它,但仍然不知道崩溃的原因。有什么想法吗?


已编辑: 错误文本:

从位置 0000000000000218 读取导致访问冲突。

调用栈结束于:

0x0000016FE7F431C4(程序集-CSharp) .runtime_invoke_void__this___object() 0x00007FFC0663BBCB (mono-2.0-bdwgc) mono_get_runtime_build_info 0x00007FFC065C2252 (mono-2.0-bdwgc) mono_perfcounters_init 0x00007FFC065CB25F (mono-2.0-bdwgc) mono_runtime_invoke 0x00007FFC07DBC6FD (UnityPlayer) UnityMain 0x00007FFC07DB9441 (UnityPlayer) UnityMain 0x00007FFC07D9E545 (UnityPlayer) UnityMain 0x00007FFC0748BACF (UnityPlayer) UnityMain 0x00007FFC07EF2559 (UnityPlayer) UnityMain 0x00007FFC07EF2172 (UnityPlayer) UnityMain 0x00007FFC07D10E99 (UnityPlayer) UnityMain 0x00007FFC07D0CC44 (UnityPlayer) UnityMain 0x00007FFC07A8C157 (UnityPlayer) UnityMain 0x00007FFC07A8C225 (UnityPlayer) UnityMain 0x00007FFC07A8F92F (UnityPlayer) UnityMain 0x00007FFC073DF022 (UnityPlayer) PAL_Memory_Free 0x00007FFC073DD82A (UnityPlayer) PAL_Memory_Free 0x00007FFC073E1F59 (UnityPlayer) PAL_Memory_Free 0x00007FFC073E3BDB (UnityPlayer) UnityMain 错误: SymGetSymFromAddr64, GetLastError: '尝试访问无效 地址。' (地址:00007FF6865A11F2)0x00007FF6865A11F2(玩具坦克) (函数名不可用)0x00007FFC8B414034(KERNEL32) BaseThreadInitThunk 0x00007FFC8BB63691 (ntdll) RtlUserThreadStart

error.log 文件中。

【问题讨论】:

  • 有什么错误?
  • 该错误类似于链接问题中的错误。我从日志中添加了一些错误信息。实际上,这对我来说没有多大意义,甚至没有帮助找到导致错误的行。

标签: unity3d crash mesh


【解决方案1】:

According to Unity's documentation

如果一个网格已经分配给网格过滤器,那么第一次查询网格属性将创建一个副本,并且这个副本将被返回。对网格属性的进一步查询将返回此重复的网格实例。查询网格属性后,原始共享网格的链接将丢失,MeshFilter.sharedMesh 属性将成为网格的别名。如果您想避免这种自动网格复制,请改用 MeshFilter.sharedMesh。

对于你的第一行代码,试试这个。

Mesh mesh = GetComponent<MeshFilter>().sharedMesh;

【讨论】:

  • 但这不能解释崩溃,对吗?
  • 是的,它没有解释为什么它在编辑器中工作并在构建中崩溃。如果我理解正确,复制也没有错。
  • 您正在取消引用此脚本附加到的游戏对象的网格。这个脚本是否偶然运行了多次? @Sergey 如果它运行不止一次,并且获得网格副本的第一个对象已被破坏,那么您会破坏重复的网格,但不会破坏指向它的别名。
  • @ErikOverflow 每个对象运行一次。原来的网状过滤器在第 4 行被销毁Destroy(meshFilter);(问题中没有显示)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-16
  • 1970-01-01
  • 1970-01-01
  • 2017-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多