CustomWheelCollider.cs 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. using System;
  2. using UnityEngine;
  3. public struct HitInfo
  4. {
  5. public readonly RaycastHit Hit;
  6. public readonly float Timestamp;
  7. public HitInfo(float timestamp, RaycastHit hit)
  8. {
  9. this.Timestamp = timestamp;
  10. this.Hit = hit;
  11. }
  12. }
  13. public class CustomWheelCollider : MonoBehaviour
  14. {
  15. public float radius;
  16. public int numberOfRays;
  17. public int collisionLayer = 11;
  18. //[Range(10f,90f)]
  19. //public float maxDetectableAngle = 45f;
  20. private Transform t;
  21. private Vector3[] rayDirections;
  22. public HitInfo? CurrentHit { private set; get; } = null;
  23. private void Start()
  24. {
  25. t = transform;
  26. rayDirections = CalculateRayDirections();
  27. }
  28. private void FixedUpdate()
  29. {
  30. for (var i = 0; i < numberOfRays; i++)
  31. {
  32. CastRay(i);
  33. }
  34. }
  35. public Vector3[] CalculateRayDirections()
  36. {
  37. //var startAngle = 90f - maxDetectableAngle;
  38. //var stopAngle = 90f + maxDetectableAngle;
  39. var anglePerRot = 360f / numberOfRays;
  40. var directions = new Vector3[numberOfRays];
  41. for (var i = 0; i < numberOfRays; i++)
  42. {
  43. directions[i] = CalculateRayDirection(i * anglePerRot * Mathf.Deg2Rad);
  44. }
  45. return directions;
  46. }
  47. private Vector3 CalculateRayDirection(float angle)
  48. {
  49. //(1,0,0) rotated by angle
  50. var x = 1f;
  51. var y = 0f;
  52. return new Vector3(0, Mathf.Sin(angle) * x + Mathf.Cos(angle) * y, Mathf.Cos(angle) * x - Mathf.Sin(angle) * y);
  53. }
  54. /*private Vector3 RotateOnYZAxis(Vector3 vector, float angle)
  55. {
  56. var y = vector.y;
  57. var z = vector.z;
  58. return new Vector3(0, Mathf.Sin(angle) * y + Mathf.Cos(angle) * z, Mathf.Cos(angle) * y - Mathf.Sin(angle) * z);
  59. }*/
  60. private void CastRay(int index)
  61. {
  62. var direction = t.TransformDirection(rayDirections[index]);
  63. var layerMask = 1 << collisionLayer;
  64. RaycastHit hit;
  65. //var direction = t.forward;
  66. //direction = new Vector3(direction.x, direction.z * Mathf.Sin(angle) + direction.y * Mathf.Cos(angle),
  67. // direction.z * Mathf.Cos(angle) - direction.y * Mathf.Sin(angle));
  68. if (Physics.Raycast(t.position, direction, out hit, radius, layerMask))
  69. {
  70. Debug.DrawRay(t.position, direction * hit.distance, Color.yellow);
  71. //Debug.Log("Did Hit: ");
  72. CurrentHit = new HitInfo(Time.fixedTime, hit);
  73. }
  74. else
  75. {
  76. Debug.DrawRay(t.position, direction * radius, Color.white);
  77. //Debug.Log("Did not Hit");
  78. }
  79. }
  80. }