/// <inheritdoc /> public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { try { JObject jObject = JObject.Load(reader); var colliderType = jObject["shape"].ToObject <string>(); ColliderGeometry colliderGeometry = null; switch (colliderType) { case "sphere": colliderGeometry = new SphereColliderGeometry(); break; case "box": colliderGeometry = new BoxColliderGeometry(); break; case "capsule": colliderGeometry = new CapsuleColliderGeometry(); break; case "mesh": colliderGeometry = new MeshColliderGeometry(); break; case "auto": colliderGeometry = new AutoColliderGeometry(); break; default: MREAPI.Logger.LogError($"Failed to deserialize collider geometry. Invalid collider type <{colliderType}>."); break; } serializer.Populate(jObject.CreateReader(), colliderGeometry); return(colliderGeometry); } catch (Exception e) { MREAPI.Logger.LogError($"Failed to create collider geometry from json. Exception: {e.Message}\nStack Trace: {e.StackTrace}"); throw; } }
internal ColliderPatch GenerateInitialPatch() { ColliderGeometry colliderGeo = null; // Note: SDK has no "mesh" collider type if (Shape == ColliderType.Auto || Shape == ColliderType.Mesh) { colliderGeo = new AutoColliderGeometry(); } else if (_collider is SphereCollider sphereCollider) { colliderGeo = new SphereColliderGeometry() { Radius = sphereCollider.radius, Center = sphereCollider.center.CreateMWVector3() }; } else if (_collider is BoxCollider boxCollider) { colliderGeo = new BoxColliderGeometry() { Size = boxCollider.size.CreateMWVector3(), Center = boxCollider.center.CreateMWVector3() }; } else if (_collider is CapsuleCollider capsuleCollider) { // The size vector describes the dimensions of the bounding box containing the collider MWVector3 size; if (capsuleCollider.direction == 0) { size = new MWVector3(capsuleCollider.height, 2 * capsuleCollider.radius, 2 * capsuleCollider.radius); } else if (capsuleCollider.direction == 1) { size = new MWVector3(2 * capsuleCollider.radius, capsuleCollider.height, 2 * capsuleCollider.radius); } else { size = new MWVector3(2 * capsuleCollider.radius, 2 * capsuleCollider.radius, capsuleCollider.height); } colliderGeo = new CapsuleColliderGeometry() { Center = capsuleCollider.center.CreateMWVector3(), Size = size }; } else { _ownerActor.App.Logger.LogWarning($"MRE SDK does not support the following Unity collider and will not " + $"be available in the MRE app. Collider Type: {_collider.GetType()}"); } return(colliderGeo == null ? null : new ColliderPatch() { IsEnabled = _collider.enabled, IsTrigger = _collider.isTrigger, Geometry = colliderGeo }); }