using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using MoreMountains.Feedbacks;
using UnityEngine.Events;
///
/// A very simple class used to make a character jump, designed to be used in Feel's Getting Started tutorial
/// Yes the name is different from the one in the tutorial, it's to avoid conflicts if you were to name it exactly the same.
///
public class GettingStartedTutorialHeroReference : MonoBehaviour
{
[Header("Hero Settings")]
/// a key the Player has to press to make our Hero jump
public KeyCode ActionKey = KeyCode.Space;
/// the force to apply vertically to the Hero's rigidbody to make it jump up
public float JumpForce = 8f;
[Header("Feedbacks")]
/// a MMFeedbacks to play when the Hero starts jumping
public MMFeedbacks JumpFeedback;
/// a MMFeedbacks to play when the Hero lands after a jump
public MMFeedbacks LandingFeedback;
[Header("Events")]
/// a UnityEvent to fire when jumping
public UnityEvent OnJump;
/// a UnityEvent to fire when landing
public UnityEvent OnLand;
private const float _lowVelocity = 0.1f;
private Rigidbody _rigidbody;
private float _velocityLastFrame;
private bool _jumping = false;
///
/// On Awake we store our Rigidbody and force gravity to -30 on the y axis so that jumps feel better
///
private void Awake()
{
_rigidbody = this.gameObject.GetComponent();
Physics.gravity = Vector3.down * 30;
}
///
/// Every frame
///
private void Update()
{
// we check if the Player has pressed our action key, and trigger a jump if that's the case
if (Input.GetKeyDown(ActionKey) && !_jumping)
{
Jump();
}
// if we're jumping, were going down last frame, and have now reached an almost null velocity
if (_jumping && (_velocityLastFrame < 0) && (Mathf.Abs(_rigidbody.velocity.y) < _lowVelocity))
{
// then we just landed, we reset our state
_jumping = false;
LandingFeedback?.PlayFeedbacks();
if (OnLand != null)
{
OnLand.Invoke();
}
}
// we store our velocity
_velocityLastFrame = _rigidbody.velocity.y;
}
///
/// Makes our hero jump in the air
///
private void Jump()
{
_rigidbody.AddForce(Vector3.up * JumpForce, ForceMode.Impulse);
_jumping = true;
JumpFeedback?.PlayFeedbacks();
if (OnJump != null)
{
OnJump.Invoke();
}
}
}