using FMODUnity;
using TMPro;
using Unity.VisualScripting;
using UnityEngine;
public class PlayerControls : MonoBehaviour
{
[SerializeField] float _speed;
[SerializeField] float _rSpeed;
[SerializeField] float _sideBurst=5f;
[SerializeField] float _sideCool;
[SerializeField] float _agFloat=1.3f;
[SerializeField] float _finOffset = 0.64f;
Rigidbody _p;
[SerializeField] GameObject _eng;
[SerializeField] GameObject _finL;
[SerializeField] GameObject _finR;
float _rotationSpeed = 5f;
[SerializeField] float _cLimit = 1;
[SerializeField] float _sideLimit = 1;
[SerializeField] GameObject badFmodUse;
[SerializeField] ParticleSystem _myPartis;
FMOD.Studio.PARAMETER_ID _parameterID;
[SerializeField] StudioEventEmitter _emitter;
float _eSet = 0.4f;
float _flSet = 0.4f;
float _frSet = 0.4f;
Vector3 forwardForce;
public TextMeshProUGUI _textSpeed;
bool _gravZone;
void Start()
{
_p = GetComponent<Rigidbody>();
Cursor.lockState = CursorLockMode.Locked;
}
void FixedUpdate()
{
HandleMovementInput();
LimitSpeed();
float mouseX = Input.GetAxis("Mouse X");
float mouseY = Input.GetAxis("Mouse Y");
float joyStickX = Input.GetAxis("Horizontal");
RotateObject(joyStickX, mouseY);
}
private void OnTriggerEnter(Collider other)
{
if (other.CompareTag("GravZone"))
{
_gravZone= true;
}
}
private void OnTriggerExit(Collider other)
{
if (other.CompareTag("GravZone"))
{
_gravZone = false;
}
}
void Update()
{
if (Input.GetKeyDown(KeyCode.W))
{
PartEngaged(_eng);
Debug.Log("pressed");
}
if (Input.GetButtonDown("Fire1"))
{
SideBurst(1);
}
if (Input.GetButtonDown("Fire2"))
{
SideBurst(-1);
}
if (Input.GetKeyUp(KeyCode.W))
{
PartDisEngaged(_eng);
Debug.Log("released");
}
if (Input.GetKeyDown(KeyCode.A))
{
}
if (Input.GetKeyDown(KeyCode.D))
{
}
}
void HandleMovementInput()
{
_rotationSpeed = 200 + _p.velocity.magnitude/4;
}
void RotateObject(float mouseX, float mouseY)
{
float rotationY = mouseX * _rotationSpeed;
RaycastHit hit;
if (Physics.Raycast(transform.position, Vector3.down, out hit))
{
if(hit.distance > _agFloat && hit.distance < _agFloat+1f || _gravZone)
{
Vector3 newPos = transform.position;
newPos.y = (hit.point + Vector3.up * _agFloat).y;
transform.position = Vector3.Slerp(transform.position, newPos, .1f);
}
if(hit.distance > _agFloat + 2f && !_gravZone)
{
_p.AddForce(0f,(-200f) * Time.deltaTime,0f);
}
var slopeRotation = Quaternion.FromToRotation(transform.up, hit.normal);
transform.rotation = Quaternion.Slerp(transform.rotation, slopeRotation * transform.rotation, 10f * Time.deltaTime);
}
transform.Rotate(transform.up, rotationY * Time.deltaTime, Space.World);
if (rotationY < 0.2f && rotationY > -0.2f)
{
_flSet = -.2f;
_frSet = -.2f;
}
if (rotationY > .2f)
{
_flSet = -.2f;
_frSet = 0f;
}
if (rotationY < -.2f)
{
_flSet = 0f;
_frSet = -.2f;
}
_finL.transform.localPosition = Vector3.Slerp(_finL.transform.localPosition, new Vector3(_flSet, 0, _finOffset), .1f);
_finR.transform.localPosition = Vector3.Slerp(_finR.transform.localPosition, new Vector3(_frSet, 0, -_finOffset), .1f);
}
void SideBurst(int dir)
{
_emitter.Play();
Vector3 forceToAdd = transform.right * -dir * _sideBurst;
_p.AddForce(forceToAdd);
}
void PartEngaged(GameObject _part)
{
_part.transform.localPosition = new Vector3(_eSet, _part.transform.localPosition.y, _part.transform.localPosition.z);
badFmodUse.SetActive(true);
}
void PartDisEngaged(GameObject _part)
{
_part.transform.localPosition = new Vector3(0f, _part.transform.localPosition.y, _part.transform.localPosition.z);
badFmodUse.SetActive(false);
}
void LimitSpeed()
{
float moveInput = Input.GetAxis("Vertical");
if (_p.velocity.magnitude > _cLimit)
{
float forceMultiplier = _p.velocity.x * _cLimit - (_p.velocity.x / _cLimit);
forwardForce.x = forceMultiplier;
}
else
{
forwardForce = transform.forward * moveInput * _speed;
}
_p.AddForce(forwardForce * Time.deltaTime);
_textSpeed.text = Mathf.RoundToInt(Mathf.Abs(_p.velocity.magnitude*10)).ToString() + " /// M P H /// "