88 lines
2.8 KiB
C#
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;
|
|
}
|
|
}
|
|
} |