Guest

Ggg

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