Variables - glantucan/puzzle_game GitHub Wiki

Un programa describe un mundo formado por información y comportamientos basados en esa información. Las variables son las encargadas de almacenar esa información y de proveer mecanismos para leerla y modificarla cuando nos haga falta.

Definición de variables

Para utilizar las variables primero es necesario definirlas.

Ejemplos de definición:

int lives;
float strength;
string name;

Para definir una variable hay que especificar su tipo y un identificador o nombre de variable, que es el que nos va a permitir referirnos a su valor más adelante en el programa.

Cuando asignemos un valor a una variable (ver más adelante) el tipo de valor y el tipo definido para la variable deben coincidir.

Dar valor a una variable

Para dar valor a una variable debemos utilizar el operador asignación: =.

Ejemplos:

lives = 3;
strength = 8.75F;
name = "Gordon Freeman";

Algunos tipos de valor, requieren del uso de un modificador para expresar claramente que son de ese tipo. El tipo numérico float es uno de ellos (prácticamente el único que vamos a usar con esta peculiaridad). Para expresar que un número es de tipo float debemos incluir una F mayúscula o una f minúscula al final del número.

El valor de una variable puede ser modificado en cualquier lugar del programa (siempre que dicho lugar esté dentro del ámbito de la variable. Ver más adelante), simplemente asignándoles otro valor:

lives = 2;

Si en lugar de asignarle otro valor concreto queremos asignar uno que dependa del valor de otras variables, podemos utilizar el identificador o nombre de esas variables en la sentencia de asignación. Por ejemplo, si queremos que el valor de la fuerza del personaje dependa de los puntos de vida que tenga podemos escribir:

strength = lives * 2.5F;

En la expresión que utilizamos después del igual para crear el valor a asignar, podemos incluso utilizar el identificador de la variable que queremos modificar. Por ejemplo, si queremos reducir en 1 los puntos de vida de un personaje tenga éste los puntos de vida que tenga en ese momento, podemos escribir:

lives = lives - 1;

Definición y asignación de valor en la misma línea de código.

Muchas veces conviene dar un valor inicial a la variable que acabamos de definir inmediatamente después de definirla. A esto se le llama inicializar la variable:

int weaponSkill;
weaponSkill = 6;

En estos casos puede ser más cómodo y está permitido hacer las dos cosas en una sola línea:

int weaponSkill = 6;

Errores al asignar un valor a una variable.

Si al dar valor a una variable no coinciden los tipos del valor asignado y del definido previamente para la variable, el compilador lanzará un error que podremos leer en la consola y que habremos de resolver antes de continuar con nuestro programa. A continuación podéis ver como intento asignar valores incompatibles a las variables definidas previamente y el error que da el compilador de Unity:

lives = 3F;
Assets/NewBehaviourScript.cs(12,17): error CS0031: Constant value `3' cannot be converted to a `int'

Estamos intentando dar un valor de tipo float a una variable de tipo int. Aunque el mensaje no es tremendamente claro, nos está diciendo que no puede convertir el valor aun entero.

strength = 8.75;
Assets/NewBehaviourScript.cs(13,17): error CS0664: Literal of type double cannot be implicitly converted to type `float'. Add suffix `f' to create a literal of this type

Estamos intentando asignar un valor de tipo double (por defecto, los números con decimales escritos sin sufijo son de ese tipo) a una variable float y aunque los dos tipos sean numéricos y con decimales no tienen la misma precisión y no pueden ser convertidos automáticamente.

name = true;
Assets/NewBehaviourScript.cs(14,17): error CS0029: Cannot implicitly convert type `bool' to `string'

La variable name ha sido definida como una cadena de texto (string) y estamos intentando asignarle un valor de booleano.

Aunque los mensajes del compilador no sean muy claros para ti, debes leerlos siempre porque contienen pistas muy importantes para entender lo que está pasando. Esas pistas junto con el número de línea en la que ha detectado el error, son fundamentales para resolver los bugs.

Ámbito de una variable (scope)

Para evitar que todas las variables sean accesibles desde todas las partes de nuestros programas, los lenguajes de programación definen lo que se denominan reglas de ámbito.

En C#, de una forma muy simplificada, se puede decir que el ámbito de las variables alcanza sólo al bloque en el que han sido definidas. Recuerda que un bloque, son las líneas de código que hay entre dos llaves ({, }). Por ejemplo, las variables definidas dentro de una función, sólo están disponibles (tanto para leer su valor como para modificarlo) dentro de las llaves que delimitan la función.

using UnityEngine;
using System.Collections;

public class ScopeExample : MonoBehaviour {

	// Use this for initialization
	void Start () {
		int lives = 3;

	}
	
	// Update is called once per frame
	void Update () {
		lives = lives - 1;
	}
}

Este programa produce el siguiente error:

Assets/NewBehaviourScript.cs(14,25): error CS0103: The name `lives' does not exist in the current context

Porque desde la función Update no se puede acceder al ámbito de otra función, en este caso 'Start' que es donde está definida la variable lives.

Lo mismo ocurre con las variables definidas dentro de un condicional o un bucle. Sólo son accesibles desde dentro de las llaves que los delimitan.

Sin embargo, si una variable ha sido definida al principio del bloque de una función y más adelante (dentro de la misma función) hay un bucle, la variable es accesible desde dentro del bucle, porque es un bloque anidado dentro del que ha definido la variable.

<img align="right" width="200" src="http://i.imgur.com/eSixLN1.png"

void Start() {
	int counter = 0;
	while (counter < 10) {
		Debug.Log(counter);
		counter = counter + 1;
	}
}

Cuando anidamos un bloque de código dentro de otro, en este caso el bucle while dentro de la función Start, el ámbito del bloque padre es accesible desde el bloque hijo.

Entre los ámbitos de las variables se establece la misma relación jerárquica que entre los bloques de código.

Cuando queremos declarar una variable que sea accesible desde todos las funciones de una clase, debemos declararla dentro de la clase, pero fuera de todas las funciones (normalmente se hace al principio de la clase). De este modo, la variable estará definida en el ámbito de la clase, y como las funciones están todas dentro de ella, podrán acceder a la variable porque pueden acceder al ámbito de su madre.

using UnityEngine;
using System.Collections;

public class PropertyExample : MonoBehaviour {
	
	int lives;

	void Start () {
		lives = 3;
	}
	
	void Update () {
		lives = lives - 1;
	}
}

A las variables declaradas de esta manera se les suele llamar propiedades o atributos de la clase.

No se puede definir la misma variable dos veces en el mismo ámbito

No es habitual cometer este error, pero puede ocurrir cuando trabajamos en un programa largo y tenemos mucho código dentro del mismo bloque, por un simple descuido.

void Start() {
	int counter = 0;
	while (counter < 10) {
		Debug.Log(counter);
		counter = counter + 1;
	}
	int counter = 0;
}

El código anterior producirá el siguiente error:

Assets/NewBehaviourScript.cs(13,21): error CS0128: A local variable named `counter' is already defined in this scope

Si nuestro objetivo es devolver a counter su valor inicial tendríamos que escribir:

void Start() {
	int counter = 0;
	while (counter < 10) {
		Debug.Log(counter);
		counter = counter + 1;
	}
	counter = 0;
}

Las variables sólo pueden ser definidas una vez dentro del mismo ámbito. Una vez definidas podemos cambiar o leer su valor tantas veces como queramos.

⚠️ **GitHub.com Fallback** ⚠️