PickupMovementFixer.cs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. using UdonSharp;
  2. using UnityEngine;
  3. using VRC.SDKBase;
  4. using VRC.Udon;
  5. using System;
  6. [DisallowMultipleComponent]
  7. [AddComponentMenu("Artyom Scripting System/Pickup Following Mover Fix")]
  8. public class PickupMovementFixer : UdonSharpBehaviour
  9. {
  10. public GameObject targetObject; // The object to follow
  11. private int pickupLayer = 13; // The layer assigned to pickup objects
  12. private Collider triggerCollider;
  13. private Vector3 previousTargetPosition;
  14. private Vector3 targetVelocity;
  15. private void Start()
  16. {
  17. triggerCollider = GetComponent<Collider>();
  18. if (triggerCollider == null || !triggerCollider.isTrigger)
  19. {
  20. Debug.LogError("PickupMovementFixer: Collider must be set as a trigger.");
  21. }
  22. previousTargetPosition = targetObject.transform.position;
  23. }
  24. // LateUpdate runs after Update scripts and Animators have moved the target this frame,
  25. // so the movement measured here matches this frame's deltaTime
  26. private void LateUpdate()
  27. {
  28. Vector3 currentTargetPosition = targetObject.transform.position;
  29. targetVelocity = (currentTargetPosition - previousTargetPosition) / Time.deltaTime;
  30. previousTargetPosition = currentTargetPosition;
  31. }
  32. private void OnTriggerEnter(Collider other)
  33. {
  34. if (other.gameObject.layer == pickupLayer)
  35. {
  36. VRC_Pickup pickup = other.gameObject.GetComponent<VRC_Pickup>();
  37. if (pickup != null)
  38. {
  39. Vector3 relativePosition = other.transform.position - targetObject.transform.position;
  40. pickup.gameObject.transform.position = targetObject.transform.position + relativePosition;
  41. Rigidbody pickupRigidbody = other.GetComponent<Rigidbody>();
  42. if (pickupRigidbody != null)
  43. {
  44. pickupRigidbody.velocity = targetVelocity;
  45. }
  46. }
  47. }
  48. }
  49. private void OnTriggerStay(Collider other)
  50. {
  51. if (other.gameObject.layer == pickupLayer)
  52. {
  53. VRC_Pickup pickup = other.gameObject.GetComponent<VRC_Pickup>();
  54. if (pickup != null)
  55. {
  56. Vector3 relativePosition = other.transform.position - targetObject.transform.position;
  57. pickup.gameObject.transform.position = targetObject.transform.position + relativePosition;
  58. Rigidbody pickupRigidbody = other.GetComponent<Rigidbody>();
  59. if (pickupRigidbody != null)
  60. {
  61. pickupRigidbody.velocity = targetVelocity;
  62. }
  63. }
  64. }
  65. }
  66. private void OnTriggerExit(Collider other)
  67. {
  68. if (other.gameObject.layer == pickupLayer)
  69. {
  70. // Optionally, you can add code here to handle when the pickup exits the trigger
  71. }
  72. }
  73. }