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