PickupMovementFixer.cs 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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. private void Update()
  25. {
  26. Vector3 currentTargetPosition = targetObject.transform.position;
  27. targetVelocity = (currentTargetPosition - previousTargetPosition) / Time.deltaTime;
  28. previousTargetPosition = currentTargetPosition;
  29. }
  30. private void OnTriggerEnter(Collider other)
  31. {
  32. if (other.gameObject.layer == pickupLayer)
  33. {
  34. VRC_Pickup pickup = other.gameObject.GetComponent<VRC_Pickup>();
  35. if (pickup != null)
  36. {
  37. Vector3 relativePosition = other.transform.position - targetObject.transform.position;
  38. pickup.gameObject.transform.position = targetObject.transform.position + relativePosition;
  39. Rigidbody pickupRigidbody = other.GetComponent<Rigidbody>();
  40. if (pickupRigidbody != null)
  41. {
  42. pickupRigidbody.velocity = targetVelocity;
  43. }
  44. }
  45. }
  46. }
  47. private void OnTriggerStay(Collider other)
  48. {
  49. if (other.gameObject.layer == pickupLayer)
  50. {
  51. VRC_Pickup pickup = other.gameObject.GetComponent<VRC_Pickup>();
  52. if (pickup != null)
  53. {
  54. Vector3 relativePosition = other.transform.position - targetObject.transform.position;
  55. pickup.gameObject.transform.position = targetObject.transform.position + relativePosition;
  56. Rigidbody pickupRigidbody = other.GetComponent<Rigidbody>();
  57. if (pickupRigidbody != null)
  58. {
  59. pickupRigidbody.velocity = targetVelocity;
  60. }
  61. }
  62. }
  63. }
  64. private void OnTriggerExit(Collider other)
  65. {
  66. if (other.gameObject.layer == pickupLayer)
  67. {
  68. // Optionally, you can add code here to handle when the pickup exits the trigger
  69. }
  70. }
  71. }