WindSpeedController.cs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. using UnityEngine;
  2. namespace Kamgam.SkyClouds
  3. {
  4. public class WindSpeedController : MonoBehaviour
  5. {
  6. public float MaxDistance = 10f;
  7. public float MaxSpeed = 100f;
  8. public Material[] Materials;
  9. private Vector3 _initialPosition;
  10. private bool _isDragging = false;
  11. private Vector3 _offset;
  12. void Start()
  13. {
  14. _initialPosition = transform.position;
  15. }
  16. void Update()
  17. {
  18. if (Input.GetMouseButtonDown(0))
  19. {
  20. RaycastHit hit;
  21. Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
  22. if (Physics.Raycast(ray, out hit))
  23. {
  24. if (hit.collider.gameObject == gameObject)
  25. {
  26. _isDragging = true;
  27. _offset = transform.position - hit.point;
  28. }
  29. }
  30. }
  31. if (Input.GetMouseButtonUp(0))
  32. {
  33. _isDragging = false;
  34. }
  35. if (_isDragging)
  36. {
  37. Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
  38. Plane dragPlane = new Plane(Vector3.up, _initialPosition);
  39. if (dragPlane.Raycast(ray, out float distance))
  40. {
  41. Vector3 hitPoint = ray.GetPoint(distance) + _offset;
  42. float clampedX = Mathf.Clamp(hitPoint.x, _initialPosition.x, _initialPosition.x + MaxDistance);
  43. transform.position = new Vector3(clampedX, _initialPosition.y, _initialPosition.z);
  44. }
  45. }
  46. foreach (var material in Materials)
  47. {
  48. if (material == null)
  49. continue;
  50. material.SetFloat("_WindSpeed", GetNormalizedValue() * MaxSpeed);
  51. }
  52. }
  53. private float GetNormalizedValue()
  54. {
  55. float distanceMoved = transform.position.x - _initialPosition.x;
  56. return Mathf.InverseLerp(0, MaxDistance, distanceMoved);
  57. }
  58. }
  59. }