Un script casi nunca trabaja solo: la pala necesita su Rigidbody 2D, y el
GameManager necesita la bola y las palas. Para eso, el script declara una
variable pública cuyo tipo es el del componente que necesita. Puede ser un
componente de Unity (public Rigidbody2D rb;) o uno de nuestros scripts
(public Ball ball;), porque cada script es una clase y, por tanto, un tipo.
Esa variable se rellena en el Inspector arrastrando hasta su hueco el
GameObject que tiene ese componente. A partir de ahí, el script puede leer sus
propiedades y llamar a sus métodos públicos, como ball.ResetPosition().
Es lo que hicimos para terminar: el GameManager recibe la bola y las dos
palas, y las metas reciben el GameManager (public GameManager gameManager;).
Con esa referencia, sustituimos en Goal los Debug.Log por llamadas a
gameManager.Player2Scores() y gameManager.Player1Scores().
Si se nos olvida arrastrarlo, la variable queda vacía (el Inspector muestra
None) y, cuando el código intente usarla, la Consola mostrará un error
NullReferenceException. Es uno de los errores más frecuentes en Unity.
Hay otras formas de conseguir una referencia desde el código, como
GetComponent<Rigidbody2D>(), que busca un componente de ese tipo en el mismo
GameObject. En PongExpress usamos el Inspector, que es lo más sencillo y
visual.