using Unity.FPS.Game; using UnityEngine; namespace Unity.FPS.Gameplay { [RequireComponent(typeof(Rigidbody), typeof(Collider))] public class Pickup : MonoBehaviour { [Tooltip("Frequency at which the item will move up and down")] public float VerticalBobFrequency = 1f; [Tooltip("Distance the item will move up and down")] public float BobbingAmount = 1f; [Tooltip("Rotation angle per second")] public float RotatingSpeed = 360f; [Tooltip("Sound played on pickup")] public AudioClip PickupSfx; [Tooltip("VFX spawned on pickup")] public GameObject PickupVfxPrefab; public Rigidbody PickupRigidbody { get; private set; } Collider m_Collider; Vector3 m_StartPosition; bool m_HasPlayedFeedback; protected virtual void Start() { PickupRigidbody = GetComponent(); DebugUtility.HandleErrorIfNullGetComponent(PickupRigidbody, this, gameObject); m_Collider = GetComponent(); DebugUtility.HandleErrorIfNullGetComponent(m_Collider, this, gameObject); // ensure the physics setup is a kinematic rigidbody trigger PickupRigidbody.isKinematic = true; m_Collider.isTrigger = true; // Remember start position for animation m_StartPosition = transform.position; } void Update() { // Handle bobbing float bobbingAnimationPhase = ((Mathf.Sin(Time.time * VerticalBobFrequency) * 0.5f) + 0.5f) * BobbingAmount; transform.position = m_StartPosition + Vector3.up * bobbingAnimationPhase; // Handle rotating transform.Rotate(Vector3.up, RotatingSpeed * Time.deltaTime, Space.Self); } void OnTriggerEnter(Collider other) { PlayerCharacterController pickingPlayer = other.GetComponent(); if (pickingPlayer != null) { OnPicked(pickingPlayer); PickupEvent evt = Events.PickupEvent; evt.Pickup = gameObject; EventManager.Broadcast(evt); } } protected virtual void OnPicked(PlayerCharacterController playerController) { PlayPickupFeedback(); } public void PlayPickupFeedback() { if (m_HasPlayedFeedback) return; if (PickupSfx) { AudioUtility.CreateSFX(PickupSfx, transform.position, AudioUtility.AudioGroups.Pickup, 0f); } if (PickupVfxPrefab) { var pickupVfxInstance = Instantiate(PickupVfxPrefab, transform.position, Quaternion.identity); } m_HasPlayedFeedback = true; } } }