MeshCollider.cs 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. namespace BansheeEngine
  2. {
  3. /// <summary>
  4. /// A collider represented by an arbitrary mesh.
  5. /// </summary>
  6. public sealed class MeshCollider : Collider
  7. {
  8. [SerializeField]
  9. private PhysicsMesh mesh;
  10. /// <summary>
  11. /// Mesh that represents the collider geometry. This can be a generic triangle mesh, or and convex mesh. Triangle
  12. /// meshes are not supported as triggers, nor are they supported for colliders that are parts of a non-kinematic
  13. /// rigidbody.
  14. /// </summary>
  15. public PhysicsMesh Mesh
  16. {
  17. get { return mesh; }
  18. set
  19. {
  20. if (mesh == value)
  21. return;
  22. if (IsTrigger && mesh.MeshType == PhysicsMeshType.Triangle)
  23. {
  24. Debug.LogWarning("Triangle meshes are not supported on Trigger colliders.");
  25. return;
  26. }
  27. mesh = value;
  28. if (Native != null)
  29. {
  30. Native.Mesh = value;
  31. if (parent != null)
  32. {
  33. // If triangle mesh its possible the parent can no longer use this collider (they're not supported for
  34. // non-kinematic rigidbodies)
  35. if (mesh != null && mesh.MeshType == PhysicsMeshType.Triangle)
  36. UpdateParentRigidbody();
  37. else
  38. parent.UpdateMassDistribution();
  39. }
  40. }
  41. }
  42. }
  43. /// <inheritdoc/>
  44. protected override bool IsValidParent(Rigidbody parent)
  45. {
  46. // Triangle mesh colliders cannot be used for non-kinematic rigidbodies
  47. return mesh == null|| mesh.MeshType == PhysicsMeshType.Convex || parent.IsKinematic;
  48. }
  49. /// <summary>
  50. /// Returns the native mesh collider wrapped by this component.
  51. /// </summary>
  52. private NativeMeshCollider Native
  53. {
  54. get { return (NativeMeshCollider)native; }
  55. }
  56. /// <inheritdoc/>
  57. internal override NativeCollider CreateCollider()
  58. {
  59. NativeMeshCollider meshCollider = new NativeMeshCollider();
  60. meshCollider.Mesh = mesh;
  61. return meshCollider;
  62. }
  63. }
  64. }