Advertisement
fuccpuff

reworked script with find tag

May 21st, 2024 (edited)
17
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.87 KB | None | 0 0
  1. using UnityEngine;
  2. using UnityEngine.XR.Interaction.Toolkit;
  3. using TMPro;
  4. using System.Collections;
  5.  
  6. public class SkiController : MonoBehaviour
  7. {
  8. public GameObject leftController;
  9. public GameObject rightController;
  10. public float maxSpeed = 20f;
  11. public float acceleration = 0.2f;
  12. public float deceleration = 0.1f;
  13. public float noPushDeceleration = 0.02f;
  14. public LayerMask groundLayer;
  15. public Terrain terrain;
  16.  
  17. private Vector3 lastLeftPosition;
  18. private Vector3 lastRightPosition;
  19. private float speed = 0f;
  20. private TMP_Text speedText;
  21. private float lastPushTime;
  22.  
  23. void Start()
  24. {
  25. lastLeftPosition = leftController.transform.position;
  26. lastRightPosition = rightController.transform.position;
  27. StartCoroutine(FindSpeedTextObject());
  28. }
  29.  
  30. void Update()
  31. {
  32. if (speedText == null) return;
  33.  
  34. Vector3 leftDelta = leftController.transform.position - lastLeftPosition;
  35. Vector3 rightDelta = rightController.transform.position - lastRightPosition;
  36.  
  37. float leftDirection = Vector3.Dot(leftDelta.normalized, -Camera.main.transform.forward);
  38. float rightDirection = Vector3.Dot(rightDelta.normalized, -Camera.main.transform.forward);
  39.  
  40. lastLeftPosition = leftController.transform.position;
  41. lastRightPosition = rightController.transform.position;
  42.  
  43. if (leftDirection > 0 && rightDirection > 0)
  44. {
  45. float pushPower = CalculatePushPower(leftDelta, rightDelta);
  46. UpdateSpeed(pushPower, true);
  47. lastPushTime = Time.time;
  48. }
  49. else if (Time.time - lastPushTime > 1f)
  50. {
  51. UpdateSpeed(0, false);
  52. }
  53. ApplyMovement();
  54. AdjustSpeedBySlope();
  55. PreventTerrainClip();
  56. speedText.text = $"Speed: {speed.ToString("F2")} m/s";
  57. }
  58.  
  59. private float CalculatePushPower(Vector3 leftDelta, Vector3 rightDelta)
  60. {
  61. return (leftDelta.magnitude + rightDelta.magnitude) * acceleration;
  62. }
  63.  
  64. private void UpdateSpeed(float pushPower, bool isPushing)
  65. {
  66. if (isPushing)
  67. {
  68. speed += pushPower;
  69. }
  70. else
  71. {
  72. speed = Mathf.Max(speed - noPushDeceleration * Time.deltaTime, 0);
  73. }
  74.  
  75. speed = Mathf.Clamp(speed, 0, maxSpeed);
  76. }
  77.  
  78. private void ApplyMovement()
  79. {
  80. Vector3 direction = new Vector3(Camera.main.transform.forward.x, 0, Camera.main.transform.forward.z).normalized;
  81. transform.position += direction * speed * Time.deltaTime;
  82. }
  83.  
  84. private void AdjustSpeedBySlope()
  85. {
  86. RaycastHit hit;
  87. if (Physics.Raycast(transform.position + Vector3.up * 0.5f, Vector3.down, out hit, 3f, groundLayer))
  88. {
  89. Vector3 flatForward = new Vector3(Camera.main.transform.forward.x, 0, Camera.main.transform.forward.z).normalized;
  90. float slopeAngle = Vector3.Angle(hit.normal, Vector3.up) - 90;
  91. float forwardSlopeAngle = Vector3.Angle(flatForward, hit.normal) - 90;
  92.  
  93. if (forwardSlopeAngle < 0)
  94. {
  95. speed += Mathf.Abs(forwardSlopeAngle) * acceleration * Time.deltaTime;
  96. }
  97. else
  98. {
  99. if (Time.time - lastPushTime > 1f)
  100. {
  101. speed = Mathf.Max(speed - noPushDeceleration * Time.deltaTime, 0);
  102. }
  103. }
  104. speed = Mathf.Clamp(speed, 0, maxSpeed);
  105. }
  106. }
  107.  
  108. private void PreventTerrainClip()
  109. {
  110. float checkDistance = 1.0f;
  111. Vector3 forwardDirection = new Vector3(Camera.main.transform.forward.x, 0, Camera.main.transform.forward.z).normalized;
  112. Vector3 forwardCheckPoint = transform.position + forwardDirection * checkDistance;
  113.  
  114. float currentTerrainHeight = Terrain.activeTerrain.SampleHeight(transform.position) + Terrain.activeTerrain.transform.position.y;
  115. float forwardTerrainHeight = Terrain.activeTerrain.SampleHeight(forwardCheckPoint) + Terrain.activeTerrain.transform.position.y;
  116. float currentPlayerHeight = transform.position.y;
  117.  
  118. if (currentPlayerHeight > forwardTerrainHeight)
  119. {
  120. transform.position = new Vector3(transform.position.x, forwardTerrainHeight, transform.position.z);
  121. }
  122. else if (currentPlayerHeight < currentTerrainHeight)
  123. {
  124. transform.position = new Vector3(transform.position.x, currentTerrainHeight, transform.position.z);
  125. }
  126. }
  127.  
  128. private IEnumerator FindSpeedTextObject()
  129. {
  130. while (speedText == null)
  131. {
  132. GameObject obj = GameObject.FindWithTag("speedtext");
  133. if (obj != null)
  134. {
  135. speedText = obj.GetComponent<TMP_Text>();
  136. }
  137. yield return new WaitForSeconds(0.5f);
  138. }
  139. }
  140. }
  141.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement