Files
Deroc_Virtual_3D/Assets/FPS/Scripts/Gameplay/Pickup.cs
T
Alex38Lyon 878ea46cac update
2025-06-03 12:00:47 +02:00

88 lines
2.8 KiB
C#

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<Rigidbody>();
DebugUtility.HandleErrorIfNullGetComponent<Rigidbody, Pickup>(PickupRigidbody, this, gameObject);
m_Collider = GetComponent<Collider>();
DebugUtility.HandleErrorIfNullGetComponent<Collider, Pickup>(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<PlayerCharacterController>();
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;
}
}
}