El documento describe cómo crear interacciones entre un jugador y objetos en Unity. Se utilizan dos scripts, uno para el jugador que detecta objetos cercanos y otro para los objetos. El script del jugador envía un mensaje al objeto para reducir su vida si está lo suficientemente cerca. Cuando la vida de un objeto llega a cero, este se destruye y agrega un elemento al inventario del jugador. Se explican los pasos para configurar los elementos y scripts necesarios para esta interacción.
2. Comunicación entre objetos
En el siguiente ejemplo se demostrara como crear una
interacción entre el jugador y objetos próximos.
En esta ocasión utilizaremos dos elementos: un First
Person Controller y un objeto cualquiera, ya sea una
esfera, cubo, capsula, etc.
La idea consiste en generar una comunicación entre
estos dos elementos, por lo que es necesario utilizar
dos Scripts.
3. Interacción con objeto
var golpe : int = 1;
var distancia : float;
var distanciaMax : float = 2.5;
function Start () {
}
function Update () {
if(Input.GetButtonDown("Fire1")){
var hit : RaycastHit;
if (Physics.Raycast(transform.position,
transform.TransformDirection(Vector3.forward), hit)){
distancia = hit.distance;
if(distancia < distanciaMax){
hit.transform.SendMessage("golpiar", golpe,
SendMessageOptions.DontRequireReceiver);
}
}
}
}
Cada vez que el jugador presione el botón Fire1 se
realizara una medición de distancia a lo largo del
eje x (vector3) entre el jugador y el primer objeto
presente a lo largo del eje.
Envia mensaje
dependiendo un rango de
distancia entre el jugador y
el objeto.
Script del jugador
4. Acción del objeto
El segundo script se ubicara en el objeto. Como
parámetro principal cada objeto debe tener un
indicador de vida que será equivalente al daño
necesario que se le debe infringir antes de destruirlo.
Como en este el objeto debe desaparecer al momento
de activarlo, se le ha asignado un valor mínimo de vida.
5. Acción del objeto
var vida : int = 1;
var nombreObjeto : String = null;
var jugador : GameObject = null;
var alerta : GameObject = null;
function Update () {
if(vida <= 0){
destruir();
}
}
function golpiar(golpe : int){
vida -= golpe;
}
function destruir(){
Destroy(gameObject);
alerta.GetComponent(GUIText).text = "Has obtenido "+nombreObjeto;
alerta.animation.Play("GUI-textoAlert");
}
La función golpear es la función que se activara
cuando se indique el objeto y se encargara de
restar vida al objeto.
el objeto se destruirá cuando valor de vida
sea menor o igual a 0.
Script del Objeto
6. Configuración de los elementos
Para el ejemplo son necesarios 3 elementos.
Utilizaremos un First Person Controller y un objeto
cylinder que simularan el jugador y la linterna
respectivamente. Se deben asignar los scripts del
ejemplo anterior a estos dos elementos y con los
siguientes parámetros:
7. Configuración de los elementos
Jugador
El script debe estar situado coomo
un componente de la cámara.
8. Configuración de los elementos
Linterna
El tercer elemento será crear un
SpotLight como hijo de la cámara en
el Jugador. Para simular ser una
linterna se debe añadir la siguiente
configuración
9. Creación de Inventario
var linterna = false;
var objetoLinterna : GameObject = null;
private var estadoLinterna = false;
function Start () {
objetoLinterna.light.enabled = estadoLinterna;
}
function Update () {
if(Input.GetButtonDown("Fire2")){
if(estadoLinterna == false){
encenderLinterna(true);
}else{
encenderLinterna(false);
}
}
}
La variable objetoLinterna debe
referenciar al spotlight que se creó para
el jugador.
Instrucciones para encender y
apagar la linterna.
10. function encenderLinterna(resp){
if(linterna == true && objetoLinterna != null){
objetoLinterna.light.enabled = resp;
estadoLinterna = resp;
}
}
function setLinterna(resp){
linterna = resp;
}
Creación de Inventario
Instrucciones para encender y
apagar la linterna.
A este script se le pueden agregar más elementos
solo agregando más variables como linterna y su
respectiva función setLinterna.
11. Agregar objeto al inventario
var vida : int = 1;
var nombreObjeto : String = null;
var jugador : GameObject = null;
var alerta : GameObject = null;
function Update () {
if(vida <= 0){
destruir();
}
}
function golpiar(golpe : int){
vida -= golpe;
}
function destruir(){
Destroy(gameObject);
alerta.GetComponent(GUIText).text = "Has obtenido "+nombreObjeto;
alerta.animation.Play("GUI-textoAlert");
jugador.SendMessage("setLinterna”,
true,SendMessageOptions.DontRequireReceiver);
}
En la función destruir se ha agregado una última
línea de código que envía al jugador el mensaje de
que ejecute la función setLinterna con el
parámetro true.
Script del Objeto
El primer script debe ser ubicado en la cámara del First Person Controller. Cada vez que el jugador presione el botón Fire1, este sencillamente realizara una medición de distancia a lo largo del eje x (vector3) entre el jugador y el primer objeto presente a lo largo del eje.
Almacenara este dato en la variable distancia.
En este caso además se ha añadido que dependiendo un rango de distancia entre el jugador y el objeto se envié un mensaje al objeto. Este mensaje es un básicamente una llamada de función, en este caso a la función golpear, golpe es el parámetro para esta función y supone el daño que se proporcionara al objeto.
La función golpear es la función que se activara cuando se indique el objeto y se encargara de restar vida al objeto.
Como lo indica la función Update, el objeto se destruirá cuando valor de vida sea menor o igual a 0.
Adicionalmente se agregaron dos parámetros extras (nombreObjeto y alerta) con el propósito de mostrar gráficamente un GUItext con la acción realizada al destruir el objeto. El texto se muestra al iniciar la animación GUI-textoAlert.
La idea consiste en que al apuntar al objeto en cuestión este nos devuelva un mensaje que modifique el estado del inventario. Para lograr esto es necesario modificar el script en el objeto del juego que se ha denominado linterna.