How do I optimize my code?,How do I optimize my script?

I’m pretty new to c# and I’m pretty clueless on how to optimize my code in terms of performance and down the road storage and smoothness. I learn best with experimenting with new bits of code.

My controller code so far:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class Control : MonoBehaviour {
	
	public float speed;
	public Rigidbody rb;
	public Vector3 jumper;
	protected Collider coll;
    public AudioSource music;
	public AudioSource died;//Create AudioSources
	public AudioSource collect;
	
	
	private float count; //Declare count variable
	
	// Use this for initialization
	void Start () {
	
	AudioSource[] audios = GetComponents<AudioSource>(); //Assign array the name audios
    rb = GetComponent<Rigidbody>();//Assigning the component to the definition 
	coll = GetComponent<Collider>();
	music = audios[0];
	died = audios[1]; //Determine where in the array "audios" this resides, second space here
	collect = audios[2];
	count = 0f; //Set the amount of count

	}
	             //the bool must be called as a function, not as a true/false
    bool grounded(){
		                //(origin, direction, range)
		return Physics.Raycast(transform.position, Vector3.down, coll.bounds.extents.y + 0.35f);
		   
	}
	
	
	// Update is called once per frame
	void Update () {
		
		if (Input.GetKey(KeyCode.RightArrow) && Input.GetKey(KeyCode.UpArrow))
			transform.Translate(1f*Time.deltaTime*speed,0f,0.5f*Time.deltaTime*speed);
		if (Input.GetKey(KeyCode.RightArrow) && Input.GetKey(KeyCode.DownArrow))
			transform.Translate(1f*Time.deltaTime*speed,0f,-0.5f*Time.deltaTime*speed);		
		if (Input.GetKey(KeyCode.RightArrow) && !Input.GetKey(KeyCode.UpArrow)
			&& !Input.GetKey(KeyCode.DownArrow))
/*Right*/   transform.Translate(1f*Time.deltaTime*speed,0f,0f);
			

			
/*left*/if (Input.GetKey(KeyCode.LeftArrow)  && !Input.GetKey(KeyCode.UpArrow)
	        && !Input.GetKey(KeyCode.DownArrow))
		    transform.Translate(-1f*Time.deltaTime*speed,0f,0f);
		if (Input.GetKey(KeyCode.LeftArrow) && Input.GetKey(KeyCode.DownArrow))
			transform.Translate(-1f*Time.deltaTime*speed,0f,-0.5f*Time.deltaTime*speed);		
		if (Input.GetKey(KeyCode.LeftArrow) && Input.GetKey(KeyCode.UpArrow))
			transform.Translate(-1f*Time.deltaTime*speed,0f,0.5f*Time.deltaTime*speed);
		
		
		
		
		if (Input.GetKey(KeyCode.UpArrow) && !Input.GetKey(KeyCode.RightArrow)
		    && !Input.GetKey(KeyCode.LeftArrow))
		    transform.Translate(0f,0f,1f*Time.deltaTime*speed);
		
		if (Input.GetKey(KeyCode.DownArrow) && !Input.GetKey(KeyCode.RightArrow)
		    && !Input.GetKey(KeyCode.LeftArrow))
		transform.Translate(0f,0f,-1f*Time.deltaTime*speed);
		
		if(grounded()){
		    if(Input.GetKeyDown(KeyCode.Space) || Input.GetKeyDown(KeyCode.D))
			    rb.velocity = jumper;
			
		}	
		
	}	
       
	void youDead(){
		SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
	}
	
	void nextLevel(){
		SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1f);
	}
		
		
	 void OnTriggerEnter(Collider other) 
    {   
	    if (other.tag == "Death"){
            died.Play();			
		    rb.velocity = jumper;
		    Invoke ("youDead", .4f);
	    }
	    if (other.tag == "Teleporter"){
			transform.position = new Vector3(0f,13.5f,-9f);
			music.Play();
		}
		if (other.tag == "Finish")
            Invoke("nextLevel");
		
		if (other.tag == "Finish2" && count >= 2f)
			Invoke("nextLevel");
			
		
		if (other.tag == "Collectable"){
			other.gameObject.SetActive(false);
			collect.Play();
			count = count + 1f; //When you collide with a collectable count goes up 1
        }
	}

}

There are many things to be changed IMHO.

First, you should have at least three classes :

  1. Control : Responsible for moving the character
  2. Player : Responsible for the interactions with environment
  3. GameController : Responsible for handling score and scene loadings

Yes, it’s more complicated, but it’s better to have multiple small scripts doing few things instead of a big one doing a lot of unrelated things.

using UnityEngine;
using UnityEngine.SceneManagement;
using System;

public class Control : MonoBehaviour
{
    [Header("Components")]

    [SerializeField]
    private Rigidbody rb; // Drag & drop the component in the inspector

    [SerializeField]
    private Collider coll; // Drag & drop the component in the inspector
    
    [Header( "Attributes" )]

    [SerializeField]
    private float speed;

    [SerializeField]
    private Vector3 jumper;
    
    private Vector3 velocity;

    private bool jumpTrigger;


    bool IsGrounded
    {
        //(origin, direction, range)
        get { return Physics.Raycast( transform.position, Vector3.down, coll.bounds.extents.y + 0.35f ); }

    }

    private void Awake()
    {
        enabled = true;
    }

    // Update is called once per frame
    void Update()
    {
        Vector3 deltaPosition = Vector3.zero;

        if ( Input.GetKey( KeyCode.RightArrow ) )
            deltaPosition.x = 1f;
        else if ( Input.GetKey( KeyCode.LeftArrow ) )
            deltaPosition.x = -1f;

        if ( Input.GetKey( KeyCode.UpArrow ) )
            deltaPosition.z = deltaPosition.x > 0 ? 0.5f : 1;
        else if ( Input.GetKey( KeyCode.DownArrow ) )
            deltaPosition.z = deltaPosition.x > 0 ? -0.5f : -1;

        transform.Translate( deltaPosition );

        if ( Input.GetKeyDown( KeyCode.Space ) || Input.GetKeyDown( KeyCode.D ) )
            jumpTrigger = true;
    }

    private void FixedUpdate()
    {
        if ( IsGrounded && jumpTrigger )
        {
            jumpTrigger = false;
            rb.velocity = jumper;
        }
    }

    public void Stop()
    {
        rb.velocity = jumper;
        enabled = false;
    }
}

using UnityEngine;
using UnityEngine.SceneManagement;
using System;

[RequireComponent(typeof(Control))]
public class Player : MonoBehaviour
{
    [Header("Components")]

    [SerializeField]
    private AudioSource audioSource;  // Drag & drop the component in the inspector

    [SerializeField]
    private Control controls;  // Drag & drop the component in the inspector

    [Header("Audio clips")]

    [SerializeField]
    private AudioClip deathClip; // Drag & drop the clip in the inspector

    [SerializeField]
    private AudioClip collectClip; // Drag & drop the clip in the inspector

    [Header( "Events" )]

    [SerializeField]
    // Drag & Drop in the inspector :
    // 1. The gameobject holding the Control script, and select the "Stop" function
    // 2. The gameobject holding the GameManager script, and select the "RestartLevel" function
    private UnityEngine.Events.UnityEvent onDeath;

    [SerializeField]
    // Drag & Drop in the inspector the gameobject holding the GameManager script, and select the "LoadNextLevel" function
    private UnityEngine.Events.UnityEvent onFinishReached;

    [SerializeField]
    // Drag & Drop in the inspector the gameobject holding the GameManager script, and select the "IncreaseScore" function
    private UnityEngine.Events.UnityEvent onItemCollected;
    
    [Header( "Other" )]

    [SerializeField]
    private GameController gameController; // Drag & drop the gameobject holding the GameController in the inspector
    
    [SerializeField]
    private float speed;

    /// <summary>
    /// Awake is called when the script instance is being loaded.
    /// </summary>
    private void Awake()
    {
        if ( audioSource == null )
            audioSource = GetComponent<AudioSource>();
        if ( audioSource == null )
            audioSource = gameObject.AddComponent<AudioSource>();
    }

    /// <summary>
    /// Kills the player.
    /// </summary>
    public void Kill()
    {
        audioSource.PlayOneShot( deathClip );
        
        if ( onDeath != null )
            onDeath.Invoke();
    }


    void OnTriggerEnter( Collider other )
    {
        if ( other.CompareTag( "Finish" ) )
        {
            if ( onFinishReached != null )
                onFinishReached.Invoke();
        }
        else if ( other.CompareTag("Finish2") && gameController.Score >= 2f )
        {
            if ( onFinishReached != null )
                onFinishReached.Invoke();
        }
        else if ( other.CompareTag( "Collectable" ) )
        {
            other.gameObject.SetActive( false );
            audioSource.PlayOneShot( collectClip );
            if ( onItemCollected != null )
                onItemCollected.Invoke();
        }
    }
}

using UnityEngine;
using UnityEngine.SceneManagement;

public class GameController : MonoBehaviour
{
    private int score;

    [SerializeField]
    private UnityEngine.UI.Text scoreText ;  // Drag & drop the text in the inspector


    public int Score
    {
        get { return score; }
        private set { score = value; scoreText.text = score.ToString(); }
    }

    public void ReloadLevel()
    {
        SceneManager.LoadScene( SceneManager.GetActiveScene().buildIndex );
    }

    void LoadNextLevel()
    {
        SceneManager.LoadScene( SceneManager.GetActiveScene().buildIndex + 1 );
    }

    public void IncreaseScore()
    {
        Score += 1;
    }
}