TyreRipple.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. 
  2. using UnityEngine;
  3. public class TyreRipple : MonoBehaviour
  4. {
  5. public MegaDynamicRipple surface;
  6. public float force = 1.0f;
  7. bool lastdown = false;
  8. float lastrow = 0.0f;
  9. float lastcol = 0.0f;
  10. Collider col;
  11. Vector3 lastpos = Vector3.zero;
  12. void Update()
  13. {
  14. if ( surface )
  15. {
  16. col = surface.GetComponent<Collider>();
  17. if ( col )
  18. {
  19. Vector3 pos = transform.position;
  20. if ( pos != lastpos )
  21. {
  22. lastpos = pos;
  23. RaycastHit hit;
  24. Ray ray = new Ray(pos, Vector3.down);
  25. if ( col.Raycast(ray, out hit, 20.0f) )
  26. {
  27. if ( col is BoxCollider )
  28. {
  29. Vector3 p = surface.transform.worldToLocalMatrix.MultiplyPoint(hit.point);
  30. BoxCollider bc = (BoxCollider)col;
  31. if ( bc.size.x != 0.0f )
  32. p.x /= bc.size.x;
  33. if ( bc.size.y != 0.0f )
  34. p.y /= bc.size.y;
  35. if ( bc.size.z != 0.0f )
  36. p.z /= bc.size.z;
  37. p.x += 0.5f;
  38. p.y += 0.5f;
  39. p.z += 0.5f;
  40. float column = 0.0f;
  41. float row = 0.0f;
  42. switch ( surface.axis )
  43. {
  44. case MegaAxis.X:
  45. column = (p.y) * (surface.cols - 1);
  46. row = p.z * (surface.rows - 1);
  47. break;
  48. case MegaAxis.Y:
  49. column = (p.x) * (surface.cols - 1);
  50. row = p.z * (surface.rows - 1);
  51. break;
  52. case MegaAxis.Z:
  53. column = (p.x) * (surface.cols - 1);
  54. row = p.y * (surface.rows - 1);
  55. break;
  56. }
  57. if ( lastdown )
  58. surface.Line(lastcol, lastrow, column, row, -force);
  59. else
  60. surface.wakeAtPointAdd1((int)column, (int)row, -force);
  61. lastdown = true;
  62. lastrow = row;
  63. lastcol = column;
  64. return;
  65. }
  66. else
  67. {
  68. float column = (1.0f - hit.textureCoord.x) * (surface.cols - 1);
  69. float row = hit.textureCoord.y * (surface.rows - 1);
  70. if ( lastdown )
  71. surface.Line(lastcol, lastrow, column, row, -force);
  72. else
  73. surface.wakeAtPointAdd1((int)column, (int)row, -force);
  74. lastdown = true;
  75. lastrow = row;
  76. lastcol = column;
  77. }
  78. }
  79. else
  80. lastdown = false;
  81. }
  82. else
  83. lastdown = false;
  84. }
  85. else
  86. lastdown = false;
  87. }
  88. }
  89. }