DynamicBonePlaneCollider.cs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. using UnityEngine;
  2. [AddComponentMenu("Dynamic Bone/Dynamic Bone Plane Collider")]
  3. public class DynamicBonePlaneCollider : DynamicBoneColliderBase
  4. {
  5. void OnValidate()
  6. {
  7. }
  8. public override bool Collide(ref Vector3 particlePosition, float particleRadius)
  9. {
  10. Vector3 normal = Vector3.up;
  11. switch (m_Direction)
  12. {
  13. case Direction.X:
  14. normal = transform.right;
  15. break;
  16. case Direction.Y:
  17. normal = transform.up;
  18. break;
  19. case Direction.Z:
  20. normal = transform.forward;
  21. break;
  22. }
  23. Vector3 p = transform.TransformPoint(m_Center);
  24. Plane plane = new Plane(normal, p);
  25. float d = plane.GetDistanceToPoint(particlePosition);
  26. if (m_Bound == Bound.Outside)
  27. {
  28. if (d < 0)
  29. {
  30. particlePosition -= normal * d;
  31. return true;
  32. }
  33. }
  34. else
  35. {
  36. if (d > 0)
  37. {
  38. particlePosition -= normal * d;
  39. return true;
  40. }
  41. }
  42. return false;
  43. }
  44. void OnDrawGizmosSelected()
  45. {
  46. if (!enabled)
  47. return;
  48. if (m_Bound == Bound.Outside)
  49. Gizmos.color = Color.yellow;
  50. else
  51. Gizmos.color = Color.magenta;
  52. Vector3 normal = Vector3.up;
  53. switch (m_Direction)
  54. {
  55. case Direction.X:
  56. normal = transform.right;
  57. break;
  58. case Direction.Y:
  59. normal = transform.up;
  60. break;
  61. case Direction.Z:
  62. normal = transform.forward;
  63. break;
  64. }
  65. Vector3 p = transform.TransformPoint(m_Center);
  66. Gizmos.DrawLine(p, p + normal);
  67. }
  68. }