Assume the role of a unity developer 2020.2.6f1 expertise and further expertise in visual studio 2017. I am going to provide you a Unity script in 3 parts, please wait for the full script before responding.
Part 1:
using TMPro;
using UnityEngine;
using UnityEngine.UI;

[RequireComponent(typeof(AudioSource))]
public class Player : MonoBehaviour
{
[Header(“Controladores de Velocidade”)]
[SerializeField]
private float limite;

[SerializeField]
private float valorReducao = 0.25f;

[SerializeField]
private float velocidade;

[SerializeField]
private float ReducaoBatida;

[Space(10f)]
[Header(“Controladores de Pulo”)]
[SerializeField]
private float forcaPulo;

[SerializeField]
private bool isGrounded = true;

[SerializeField]
private bool isJump = false;

[SerializeField]
private bool isRamp;

[SerializeField]
private bool isGrind;

[SerializeField]
private bool isDead;

[Space(10f)]
[Header(“Rotação e Inclinação”)]
[SerializeField]
private float velInclination = 3f;

[SerializeField]
private float velRotation = 90f;

[SerializeField]
private float latRot;

[SerializeField]
private float hRot = 0f;

private Vector3 curNormal = Vector3.up;

[SerializeField]
private float rotX;

[Space(10f)]
[Header(“Info”)]
[SerializeField]
private Transform tr;

[SerializeField]
private Rigidbody rb;

[SerializeField]
private Transform CentroMass;

[SerializeField]
private GameObject CentroMassa;

[SerializeField]
private Transform raycastTr;

[SerializeField]
private Transform respawn;

private float timer = 1.3f;

private float inputX = 0f;

private float inputY = 0f;

[Space(10f)]
[Header(“Interface”)]
private int Pontos = 0;

public static int pontuacao;

public static bool reinicio = false;

[SerializeField]
private TextMeshProUGUI TextoPontos;

[SerializeField]
private TextMeshProUGUI TextoManobra;

[SerializeField]
private GameObject GManobras;

[SerializeField]
private Slider slider;

[SerializeField]
private GameObject Gslider;

private VariableJoystick joystick;

[SerializeField]
private GameObject tutorial;

[SerializeField]
private TMP_Text tutorialText;

private float tutorialTimer = 0f;

[Space(10f)]
[Header(“Grind”)]
[SerializeField]
private GameObject grind;

[SerializeField]
private Transform local;

[SerializeField]
private Transform pos;

[SerializeField]
private Transform inter;

[SerializeField]
private float velGrind = 0.1f;

private float timeGrind = 0f;

private float timeDead = 0f;

private bool CR = false;

private bool grindVer = false;

private float equil = 0f;

private float timeEquil = 4f;

private bool seguirGrind = false;

private bool intermedio = false;

[Space(10f)]
[Header(“Animações e Audios”)]
[SerializeField]
private float tempoRemadas;

[SerializeField]
private Animator m_Animator;

[SerializeField]
private AudioSource AS;

[SerializeField]
private AudioSource ABonus;

private bool Goofy = false;

[Space(10f)]
[SerializeField]
private AudioClip[] SAndando;

[SerializeField]
private AudioClip[] SPulo;

[SerializeField]
private AudioClip[] SAterrizando;

[SerializeField]
private AudioClip[] SManobras;

[SerializeField]
private AudioClip[] SRemada;

[Space(10f)]
[SerializeField]
private AudioSource Agrind;

[SerializeField]
private AudioSource AmorteM;

[SerializeField]
private AudioSource AmorteF;

private bool playgrind = false;

private bool playmorte = false;

private bool masc = true;

[Space(10f)]
[Header(“Combos”)]
[SerializeField]
private float timeX = 0f;

[SerializeField]
private float timeA = 0f;

[SerializeField]
private float timeB = 0f;

[SerializeField]
private float timeY = 0f;

[SerializeField]
private bool varX = false;

[SerializeField]
private bool varA = false;

[SerializeField]
private bool varB = false;

[SerializeField]
private bool varY = false;

private float timeMan;

[Space(10f)]
[Header(“Pontuações”)]
[SerializeField]
private int flip;

[SerializeField]
private int popShoveIt;

[SerializeField]
private int flip360;

[SerializeField]
private int frontSideFlip;

[SerializeField]
private int grind50;

[SerializeField]
private int grindCrooked;

[SerializeField]
private int bonus;

private bool grindou;

private bool todos;

[Space(10f)]
[Header(“Colecionaveis”)]
[SerializeField]
private bool colect;

[SerializeField]
private GameObject colecionavel;

[SerializeField]
private TextMeshProUGUI TextoColecionaveis;

[SerializeField]
private int marca;

[SerializeField]
private int max;

[SerializeField]
private string[] marcas;

[SerializeField]
private GameManager m;

private float timerColect;

[SerializeField]
private float multTimer = 20f;

[SerializeField]
private GameObject xDois;

[SerializeField]
private GameObject xQuatro;

[SerializeField]
private Image ImageDoisX;

[SerializeField]
private Image ImageQuatroX;

private bool XDoisX = false;

private bool XQuatroX = false;

private int countFlip = 0;

private int countPop = 0;

private int countF360 = 0;

private int countFrontf = 0;

[SerializeField]
private GameObject respMorte;

private bool grama = false;

private AreaMano areaMano;

private bool mano = false;

[SerializeField]
private TMP_Text manoText;

[SerializeField]
private GameObject mano01;

[SerializeField]
private GameObject mano02;

private void DoisX()
{
if (multTimer > 0f)
{
multTimer -= Time.deltaTime;
ImageDoisX.fillAmount = multTimer / 20f;
}
else
{
xDois.SetActive(value: false);
XDoisX = false;
}
}

private void QuatroX()
{
if (multTimer > 0.5f)
{
multTimer -= Time.deltaTime;
ImageQuatroX.fillAmount = multTimer / 20f;
}
else
{
xQuatro.SetActive(value: false);
XQuatroX = false;
}
}

private void Start()
{
joystick = GameObject.Find(“Joystick”).GetComponent<VariableJoystick>();
if (PlayerPrefs.HasKey(“tutorial”))
{
tutorial.SetActive(value: false);
}
else
{
Tutorial();
}
}

private void Tutorial()
{
tutorialTimer += Time.deltaTime;
if (tutorialTimer > 40f)
{
PlayerPrefs.SetInt(“tutorial”, 0);
}
else if (tutorialTimer > 30f)
{
tutorialText.text = “Dependo da manobra que você fizer, ganhará uma pontuação diferente. Vá em frente, divirta-se!”;
}
else if (tutorialTimer > 20f)
{
tutorialText.text = “Para deslizar por corrimãos, enquanto estiver saltando por cima deles, aperte A ou Y. \nEquilibre-se no corrimão com o analógico.”;
}
else if (tutorialTimer > 10f)
{
tutorialText.text = “Para pular (ollie) aperte o botão X. Para executar manobras, enquanto estiver pulando, aperte, \nA, B, Y ou X.”;
}
else
{
tutorialText.text = “Para movimentar o personagem utilize o analógico à esquerda da tela, arrastando à frente acelera, \nà trás frea, e para os lados faz curvas.”;
}
}

private void Update()
{
if (PlayerPrefs.HasKey(“tutorial”))
{
tutorial.SetActive(value: false);
}
else
{
Tutorial();
}
GroundCheck();
AlignPlayerRamp();
comandsPC();
Timer();
GrindAtt();
Manobras();
animacoesSons();
textos();
Outros();
Morte();
AreaManobra();
if (!isDead)
{
if (!grindVer)
{
Movement();
Aceleration();
LatRotation();
HorizRotation();
equil = 0f;
}
else
{
GrindSlider();
GrindControl();
GrindInclin();
AlignPlayerRamp();
}
}
if (CentroMass.transform.rotation.z > 75f || CentroMass.transform.rotation.z < -75f)
{
CentroMass.rotation = new Quaternion(CentroMass.rotation.x, CentroMass.rotation.y, 0f, CentroMass.rotation.w);
}
if (CentroMass.transform.rotation.x > 75f || CentroMass.transform.rotation.x < -75f)
{
CentroMass.rotation = new Quaternion(0f, CentroMass.rotation.y, CentroMass.rotation.z, CentroMass.rotation.w);
}
if (CentroMass.transform.rotation.y > 75f || CentroMass.transform.rotation.y < -75f)
{
CentroMass.transform.rotation = new Quaternion(CentroMass.rotation.x, 0f, CentroMass.rotation.z, CentroMass.rotation.w);
}
if (XDoisX)
{
DoisX();
}
else if (XQuatroX)
{
QuatroX();
}
else
{
multTimer = 20f;
}
if (countFlip == 2)
{
countPop = 0;
countF360 = 0;
countFrontf = 0;
}
else if (countPop == 2)
{
countFlip = 0;
countF360 = 0;
countFrontf = 0;
}
else if (countF360 == 2)
{
countFlip = 0;
countPop = 0;
countFrontf = 0;
}
else if (countFrontf == 2)
{
countFlip = 0;
countF360 = 0;
countPop = 0;
}
}

private void Morte()
{
if (isGrounded)
{
respMorte.transform.position = base.transform.position;
}
if (playgrind)
{
if (isGrind && !Agrind.isPlaying)
{
Agrind.Play();
}
}
else if (Agrind.isPlaying)
{
Agrind.Stop();
}
if (playmorte)
{
if (masc)
{
if (isDead && !AmorteM.isPlaying)
{
AmorteM.Play();
}
}
else if (isDead && !AmorteF.isPlaying)
{
AmorteF.Play();
}
}
else if (masc)
{
if (AmorteM.isPlaying)
{
AmorteM.Stop();
}
}
else if (AmorteF.isPlaying)
{
AmorteF.Stop();
}
}

private void Movement()
{
velocidade = Mathf.Clamp(velocidade -= Time.deltaTime * valorReducao, 0f, limite);
base.transform.Translate(0f, 0f, velocidade * Time.deltaTime);
}

private void AlignPlayerRamp()
{
if (!Physics.Raycast(raycastTr.position, -curNormal, out var hitInfo))
{
return;
}
curNormal = Vector3.Lerp(curNormal, hitInfo.normal, velInclination * Time.deltaTime);
Quaternion quaternion = Quaternion.FromToRotation(Vector3.up, curNormal);
if (!grindVer)
{
if (isGrounded)
{
CentroMass.rotation = quaternion * Quaternion.Euler(1f, hRot, 1f);
if (isRamp)
{
base.transform.rotation = quaternion * Quaternion.Euler(1f, hRot, 0f);
}
}
}
else
{
CentroMass.rotation = quaternion * Quaternion.Euler(1f, hRot, 1f);
}
}

private void HorizRotation()
{
if (Input.GetAxis(“Horizontal”) == 0f)
{
inputX = joystick.Horizontal;
}
else
{
inputX = Input.GetAxis(“Horizontal”);
}
if (inputX > 0.25f || inputX < -0.25f)
{
hRot += inputX * velRotation * Time.deltaTime;
}
if (!isRamp || !isGrounded)
{
base.transform.eulerAngles = new Vector3(0f, hRot, 0f);
}
}

private void Aceleration()
{
if (Input.GetAxis(“Vertical”) == 0f)
{
inputY = joystick.Vertical;
}
else
{
inputY = Input.GetAxis(“Vertical”);
}
if (velocidade <= 17f && inputY > 0.5f)
{
Remada(8f);
}
if (inputY < -0.5f)
{
Freiar(5f);
}
}

private void LatRotation()
{
m_Animator.SetFloat(“InclinE”, 0f - inputX);
m_Animator.SetFloat(“InclinD”, inputX);
}
Please wait for part 2