hellbound/Assets/Sources/Feel/FeelDemos/Duck/Scripts/Duck.cs

87 lines
2.9 KiB
C#

using MoreMountains.Feedbacks;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace MoreMountains.Feel
{
/// <summary>
/// An example class part of the Feel demos
/// This class acts as a character controller for the Duck in the FeelDuck demo scene
/// It looks for input, and jumps when instructed to
/// </summary>
public class Duck : MonoBehaviour
{
[Header("Input")]
/// a key to use to jump
[Tooltip("a key to use to jump")]
public KeyCode ActionKey = KeyCode.Space;
/// a secondary key to use to jump
[Tooltip("a secondary key to use to jump")]
public KeyCode ActionKeyAlt = KeyCode.Joystick1Button0;
[Header("Cooldown")]
/// a duration, in seconds, between two jumps, during which jumps are prevented
[Tooltip("a duration, in seconds, between two jumps, during which jumps are prevented")]
public float CooldownDuration = 1f;
[Header("Feedbacks")]
/// a feedback to call when jumping
[Tooltip("a feedback to call when jumping")]
public MMFeedbacks JumpFeedback;
/// a feedback to call when landing
[Tooltip("a feedback to call when landing")]
public MMFeedbacks LandingFeedback;
/// a feedback to call when trying to jump while in cooldown
[Tooltip("a feedback to call when trying to jump while in cooldown")]
public MMFeedbacks DeniedFeedback;
protected float _lastJumpStartedAt = -100f;
/// <summary>
/// On Update we look for input
/// </summary>
protected virtual void Update()
{
HandleInput();
}
/// <summary>
/// Detects input
/// </summary>
protected virtual void HandleInput()
{
if (Input.GetKeyDown(ActionKey) || Input.GetKeyDown(ActionKeyAlt) || Input.GetMouseButtonDown(0))
{
Jump();
}
}
/// <summary>
/// Performs a jump if possible, otherwise plays a denied feedback
/// </summary>
protected virtual void Jump()
{
if (Time.time - _lastJumpStartedAt < CooldownDuration)
{
DeniedFeedback?.PlayFeedbacks();
}
else
{
JumpFeedback?.PlayFeedbacks();
_lastJumpStartedAt = Time.time;
}
}
/// <summary>
/// This method is called by the duck animator on the frame where it makes contact with the ground.
/// In an actual game context, this may be called when you detect contact with the ground via a physics collision, a downward raycast, etc.
/// </summary>
public virtual void Land()
{
LandingFeedback?.PlayFeedbacks();
}
}
}