Guest

Ооо

Sep 13th, 2026
16
0
Never
Not a member of GistPad yet? Sign Up, it unlocks many cool features!
None 8.78 KB | None | 0 0
  1. using UdonSharp;
  2. using UnityEngine;
  3. using VRC.SDKBase;
  4.  
  5. public class WaterSystem : UdonSharpBehaviour
  6. {
  7. [Header("--- Настройки синевы ---")]
  8. [SerializeField] private float offset = -0.4f; // Смещение синего экрана (глаза)
  9.  
  10. [Header("--- Настройки плавания ---")]
  11. [SerializeField] private float swimSpeed = 2.5f; // Скорость всплытия вверх
  12. [SerializeField] private float shouldersOffset = 0.22f; // Высота плеч аватара
  13. private VRCPlayerApi localPlayer;
  14. private bool inWater = false;
  15.  
  16. void Start()
  17. {
  18. // Инициализируем локального игрока при старте
  19. localPlayer = Networking.LocalPlayer;
  20. }
  21. public override void OnPlayerTriggerEnter(VRCPlayerApi player)
  22. {
  23. if (player != null && player.isLocal)
  24. {
  25. inWater = true;
  26.  
  27. // Твоя оригинальная физика невесомости
  28. player.SetGravityStrength(0.01f);
  29. player.SetWalkSpeed(2f); // Замедление ходьбы в воде
  30. player.SetRunSpeed(2.5f); // Замедление бега в воде
  31. }
  32. }
  33. public override void OnPlayerTriggerExit(VRCPlayerApi player)
  34. {
  35. if (player != null && player.isLocal)
  36. {
  37. inWater = false;
  38.  
  39. // Отключаем туман и сбрасываем плотность в 0 для суши
  40. RenderSettings.fog = false;
  41. RenderSettings.fogDensity = 0f;
  42.  
  43. // Возвращаем стандартные настройки для суши
  44. player.SetGravityStrength(1.0f);
  45. player.SetWalkSpeed(4f);
  46. player.SetRunSpeed(4f);
  47. }
  48. }
  49. void Update()
  50. {
  51. if (inWater && localPlayer != null)
  52. {
  53. // Берем высоту глаз конкретного аватара в реальном времени
  54. float headY = localPlayer.GetTrackingData(VRCPlayerApi.TrackingDataType.Head).position.y;
  55.  
  56. // Твой оригинальный расчет уровня воды по позиции объекта
  57. float triggerTopY = transform.position.y + offset;
  58.  
  59. // Расчет высоты плеч аватара
  60. float shouldersY = headY - shouldersOffset;
  61. // 1. Проверка синего экрана (по глазам) с плотностью на 1.0
  62. if (headY < triggerTopY)
  63. {
  64. RenderSettings.fog = true;
  65. RenderSettings.fogDensity = 1.0f; // Выставляем плотность на однёрку
  66. }
  67. else
  68. {
  69. RenderSettings.fog = false;
  70. RenderSettings.fogDensity = 0f; // Убираем густоту над водой
  71. }
  72.  
  73. // 2. Плавание вверх при зажатии кнопок
  74. bool isJumping = Input.GetButton("Jump"); // Работает на ПК (Пробел)
  75.  
  76. // Фикс для телефонов: проверяем направление взгляда и движение вперед
  77. Vector3 lookDir = localPlayer.GetTrackingData(VRCPlayerApi.TrackingDataType.Head).rotation * Vector3.forward;
  78. bool mobileSwimUp = (Input.GetAxisRaw("Vertical") > 0.1f) && (lookDir.y > 0.4f);
  79.  
  80. if (isJumping || mobileSwimUp)
  81. {
  82. if (shouldersY < triggerTopY) // Если плечи под водой — плывем вверх
  83. {
  84. Vector3 vel = localPlayer.GetVelocity();
  85. vel.y = swimSpeed;
  86. localPlayer.SetVelocity(vel);
  87. }
  88. }
  89. // 3. Блокиратор левитации (не пускает в воздух выше плеч)
  90. if (shouldersY >= triggerTopY)
  91. {
  92. Vector3 vel = localPlayer.GetVelocity();
  93. if (vel.y > 0)
  94. {
  95. vel.y = 0;
  96. localPlayer.SetVelocity(vel);
  97. }
  98. }
  99. }
  100. }
  101. }
RAW Paste Data Copied