Wheel.cs 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class Wheel : MonoBehaviour
  5. {
  6. public float radius =0.35f;
  7. public float defaultPosition;
  8. public float springConstant =1f;
  9. public ForceMode springForceMode;
  10. public float displacementRange = 0.1f;
  11. public float dampningSpeed =0.1f;
  12. public float hitPoint=0;
  13. public float curDisplacement => defaultPosition- transform.localPosition.y;
  14. public float minDisplacement => defaultPosition + displacementRange;
  15. public float maxDisplacement => defaultPosition - displacementRange;
  16. LayerMask groundMask;
  17. public CarController myCar;
  18. void Awake()
  19. {
  20. defaultPosition=transform.localPosition.y;
  21. groundMask = LayerMask.GetMask("Ground");
  22. }
  23. // Update is called once per frame
  24. void FixedUpdate()
  25. {
  26. if(myCar==null){return;}
  27. RaycastHit hit = new RaycastHit();
  28. float newDisplacement = transform.localPosition.y;
  29. float bottomEnd = transform.position.y - radius;
  30. // hitPoint=0;
  31. bool grounded=false;
  32. // if(Physics.Linecast(transform.position+new Vector3(0,0,-0.1f), new Vector3(transform.position.x,bottomEnd,transform.position.z-0.1f), out hit, groundMask)){
  33. // Debug.DrawLine(transform.position, hit.point, Color.red);
  34. // hitPoint=hit.point.y;
  35. // grounded=true;
  36. // }
  37. if(Physics.Linecast(transform.position, new Vector3(transform.position.x,bottomEnd,transform.position.z), out hit, groundMask)){
  38. Debug.DrawLine(transform.position, hit.point, Color.red);
  39. // if(hit.point.y > hitPoint){
  40. hitPoint=hit.point.y;
  41. // }
  42. grounded=true;
  43. }
  44. // if(Physics.Linecast(transform.position+new Vector3(0,0,0.1f), new Vector3(transform.position.x,bottomEnd,transform.position.z+0.1f), out hit, groundMask)){
  45. // Debug.DrawLine(transform.position, hit.point, Color.red);
  46. // if(hit.point.y > hitPoint){
  47. // hitPoint=hit.point.y;
  48. // }
  49. // grounded=true;
  50. // }
  51. if(!grounded){
  52. newDisplacement = maxDisplacement;
  53. Debug.Log("Not Touching ground ");
  54. }else{
  55. newDisplacement=hitPoint+radius;
  56. }
  57. transform.position = Vector3.Lerp(transform.position, new Vector3(transform.position.x,newDisplacement, transform.position.z),dampningSpeed);
  58. if(curDisplacement < 0){
  59. //Apply upforce
  60. }
  61. myCar.rb.AddForceAtPosition(-Physics.gravity*springConstant,transform.position,springForceMode);
  62. }
  63. void OnDrawGizmos() {
  64. Gizmos.color = Color.green;
  65. int segmants = 12;
  66. Vector3 lastPoint= Vector3.zero;
  67. for(int i=0; i< segmants;i++){
  68. float theta = ((Mathf.PI*2)/segmants) * i;
  69. float z= transform.position.z + (radius * Mathf.Sin(theta));
  70. float y= transform.position.y +(radius * Mathf.Cos(theta));
  71. Vector3 thisPoint = new Vector3(transform.position.x,y,z);
  72. if(i>0){Gizmos.DrawLine(lastPoint,thisPoint);}
  73. lastPoint = thisPoint;
  74. }
  75. Gizmos.DrawWireSphere(new Vector3(transform.position.x,hitPoint,transform.position.z),0.2f);
  76. }
  77. }