Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Bug / Crash  Error Destroy ObiCollider
#1
Hi Jose,

I spotted something weird when the ObiCollider are destroyed in my project.
I procedurally generate a rope and its blueprint at runtime (similar to your scene RopeGrapplingHook ). Everything looks good and it's working.
However, every time when I turn off the play mode, I got this error :

ArgumentNullException: Value cannot be null.
Parameter name: key
System.Collections.Generic.Dictionary`2[TKey,TValue].Remove (TKey key) (at <599589bf4ce248909b8a14cbe4a2034e>:0)
Obi.ObiMeshShapeTracker.Destroy () (at Assets/Obi/Scripts/Common/Collisions/ColliderTrackers/Trackers3D/ObiMeshShapeTracker.cs:131)
Obi.ObiColliderBase.RemoveCollider () (at Assets/Obi/Scripts/Common/Collisions/ObiColliderBase.cs:216)
Obi.ObiColliderBase.OnDestroy () (at Assets/Obi/Scripts/Common/Collisions/ObiColliderBase.cs:276)

The issues doesn't appear on all ObiCollider, I've more than 1000 ObiCollider in my scene and this error appears on about 100 of them.
So I fixed that by adding an additional check before the Remove in the Destroy method of the ObiMeshShapeTracker class (line 121) :


Code:
public override void Destroy()
{
    base.Destroy();

    MeshCollider meshCollider = collider as MeshCollider;

    if (meshCollider != null && handles != null)
    {

        handles.Unref(); // Decrease handles refcount.

        if (handles.RefCount <= 0)
        {
            if (meshCollider.sharedMesh != null && meshDataCache.ContainsKey(meshCollider.sharedMesh))
            {
                meshDataCache.Remove(meshCollider.sharedMesh);
            }
        }

    }
}



Moreover, although my rope is well initialized and works fine, if I turn off the play mode and turn it on again, I get this error :

NullReferenceException: Object reference not set to an instance of an object
Obi.ObiRopeBlueprint+<Initialize>d__2.MoveNext () (at Assets/Obi/Scripts/RopeAndRod/Blueprints/ObiRopeBlueprint.cs:56)
Obi.ObiActorBlueprint+<Generate>d__68.MoveNext () (at Assets/Obi/Scripts/Common/Blueprints/ObiActorBlueprint.cs:300)
Obi.ObiActorBlueprint.GenerateImmediate () (at Assets/Obi/Scripts/Common/Blueprints/ObiActorBlueprint.cs:278)
Obi.ObiRopeBlueprintBase.OnValidate () (at Assets/Obi/Scripts/RopeAndRod/Blueprints/ObiRopeBlueprintBase.cs:50) 

I suppose it's could be related to the rope creation at runtime or maybe a memory leak during the rope or blueprint destruction ?

Thanks in advance
Reply
#2
Hi there,

I could reproduce the first one. It will happen when a MeshCollider whose sharedMesh is null is destroyed. This is a bug in Obi (thanks for finding and reporting it!), and the fix is as easy as checking if the sharedMesh is null before looking for it in the meshDataCache -just like you did- as it's not necessary to reduce the reference count of a mesh that does not exist. However it's pretty unusual to have a collider referencing no mesh, so this might be indicative of a deeper problem in your scene.

The second one I could not reproduce, though. The error points to the rope being unable to destroy its first particle group (first control point), but a rope should always have at least 2 control points, this is ensured throughout the code. Can you share how you're initializing the rope at runtime?
Reply
#3
Thanks Jose, indeed I've probably something not logic in my scene, I'll take a look !
Finally for the second point, I just tried my code on the last version of Obi (5.5) and I don't have the error. So yes, I think that's is probably an issue with my version of Obi (5.2) or Unity (2019.2). But for technical reasons I prefer to stay on Unity 2019.2, so I will not upgrade to the 5.5 which is tagged 2019.3.1 on the asset store.

That's strange because before I didn't have this error, it suddenly appeared. I wonder if my Obi plugin is probably corrupted. I would appreciate it if you could send me the 5.2 version or the last version compatible with Unity 2019.2.7. I will mail you on the Obi support email.

Thank you  !
Reply