protected override void OnUpdate() { Entities.ForEach((UnityEngine.CircleCollider2D collider) => { // Convert the collider if it's valid. if (ConversionUtilities.CanConvertCollider(collider)) { try { var lossyScale = new float3(collider.transform.lossyScale).xy; if (math.any(!math.isfinite(lossyScale)) || math.any(lossyScale <= 0.0f)) { throw new ArgumentException("Transform XY scale cannot be zero or Infinite/NaN.", "Transform XY scale."); } var localToWorld = ConversionUtilities.GetColliderLocalToWorld(collider); var geometry = new CircleGeometry { Center = new float3(localToWorld.MultiplyPoint(collider.offset)).xy, Radius = math.clamp(collider.radius * math.cmax(lossyScale), ConversionUtilities.MinRangeClamp, ConversionUtilities.MaxRangeClamp), }; var colliderBlob = PhysicsCircleCollider.Create( geometry, ConversionUtilities.GetCollisionFilterFromCollider(collider), ConversionUtilities.GetPhysicsMaterialFromCollider(collider) ); // Submit the collider for conversion. m_ColliderConversionSystem.SubmitCollider(collider, ref colliderBlob); } catch (ArgumentException exception) { UnityEngine.Debug.LogWarning($"{collider.name}: {exception.Message}", collider); } } }); }
protected override void OnUpdate() { Entities.ForEach((UnityEngine.PolygonCollider2D collider) => { // Convert the collider if it's valid. if (ConversionUtilities.CanConvertCollider(collider)) { try { // Only single paths with no more than the maximum allowed vertex allowed. // NOTE: Until we implement a convex polygon decomposition, only the convex hull of these points will be used. var colliderPointCount = collider.GetTotalPointCount(); if (collider.pathCount != 1 || colliderPointCount > PhysicsPolygonCollider.Constants.MaxVertexCount) { return; } var lossyScale = new float3(collider.transform.lossyScale).xy; if (math.any(!math.isfinite(lossyScale)) || math.any(lossyScale <= 0.0f)) { throw new ArgumentException("Transform XY scale cannot be zero or Infinite/NaN.", "Transform XY scale."); } var localToWorld = ConversionUtilities.GetColliderLocalToWorld(collider); UnityEngine.Vector3 offset = collider.offset; collider.GetPath(0, m_PolygonVertices); var vertices = new NativeArray <float2>(colliderPointCount, Allocator.Temp, NativeArrayOptions.UninitializedMemory); for (var i = 0; i < colliderPointCount; ++i) { var vertex = localToWorld.MultiplyPoint(offset + (UnityEngine.Vector3)m_PolygonVertices[i]); vertices[i] = new float2(vertex.x, vertex.y); } var geometry = new PolygonGeometry { Vertices = vertices, BevelRadius = PhysicsSettings.Constants.MinimumConvexRadius, }; var colliderBlob = PhysicsPolygonCollider.Create( geometry, ConversionUtilities.GetCollisionFilterFromCollider(collider), ConversionUtilities.GetPhysicsMaterialFromCollider(collider) ); // We finished with the points. vertices.Dispose(); // Submit the collider for conversion. m_ColliderConversionSystem.SubmitCollider(collider, ref colliderBlob); } catch (ArgumentException exception) { UnityEngine.Debug.LogWarning($"{collider.name}: {exception.Message}", collider); } } }); m_PolygonVertices.Clear(); }
protected override void OnUpdate() { Entities.ForEach((UnityEngine.CapsuleCollider2D collider) => { // Convert the collider if it's valid. if (ConversionUtilities.CanConvertCollider(collider)) { try { UnityEngine.Vector3 vertex0; UnityEngine.Vector3 vertex1; float radius; var halfSize = new float2(collider.size) * 0.5f; if (collider.direction == UnityEngine.CapsuleDirection2D.Vertical) { radius = halfSize.x; vertex0 = new UnityEngine.Vector3(0.0f, halfSize.y - radius, 0.0f); vertex1 = new UnityEngine.Vector3(0.0f, -halfSize.y + radius, 0.0f); } else { radius = halfSize.y; vertex0 = new UnityEngine.Vector3(halfSize.x - radius, 0.0f, 0.0f); vertex1 = new UnityEngine.Vector3(-halfSize.x + radius, 0.0f, 0.0f); } // Add offset to capsule. var colliderOffset = (UnityEngine.Vector3)collider.offset; vertex0 += colliderOffset; vertex1 += colliderOffset; var lossyScale = new float3(collider.transform.lossyScale).xy; if (math.any(!math.isfinite(lossyScale)) || math.any(lossyScale <= 0.0f)) { throw new ArgumentException("Transform XY scale cannot be zero or Infinite/NaN.", "Transform XY scale."); } var localToWorld = ConversionUtilities.GetColliderLocalToWorld(collider); var geometry = new CapsuleGeometry { Vertex0 = new float3(localToWorld.MultiplyPoint(vertex0)).xy, Vertex1 = new float3(localToWorld.MultiplyPoint(vertex1)).xy, Radius = math.max(PhysicsSettings.Constants.MinimumConvexRadius, math.cmax(lossyScale) * radius), }; var colliderBlob = PhysicsCapsuleCollider.Create( geometry, ConversionUtilities.GetCollisionFilterFromCollider(collider), ConversionUtilities.GetPhysicsMaterialFromCollider(collider) ); // Submit the collider for conversion. m_ColliderConversionSystem.SubmitCollider(collider, ref colliderBlob); } catch (ArgumentException exception) { UnityEngine.Debug.LogWarning($"{collider.name}: {exception.Message}", collider); } } }); }