1.- Creamos un nuevo proyecto y le asignaremos que queremos en 2D a continuacion una captura.
2.- Crearemos 2 carpetas en una guardaremos los Sprites y en la otra el Script como muestro a continuacion.
3.- Ahora agregraremos nuestros sprites, para ello necesitamos uno que sea el jugador y otro para el suelo.
4.- Ahora cambiaremos las propiedades para poderlo manejar en unity como se muestra a continuacion, ambas le daremos en pixel per unit a 70 en ambos casos y le daremos en el boton de appy para guardar los cambios.
5.- Agregamos nuestros sprites a la escena si es necesario componer tamaños aplicar esos cambios.
6.- Ahora agregaremos la fisica para ambos sprites, para ello seleccionamos un sprite y le daremos en el boton de AddComponent del inspector y nos situaremos en Physics2D y en BoxCollider para que colisionen entre ambos objetos, aplicar para ambos.
7.- Ahora al personaje principal le agregaremos otro componente de fisica tambien, pero en esta ocasion sera un rigidbody2D.
8.- Cambiaremos algunos parametros del RigidBody para poder trabajar con este ejemplo, para ello seleccionaremos los que muestro a continuación, el primer ejemplo es para una versión anterior de unity y la siguiente es la actualización, se usa en unity 5.3 en adelante, ahora se utilizan los constraint
.
9.- Ahora podemos ver si el resultado es correcto, para ello le daremos en reproducir, si todo va bien el sprite de nuestro personaje principal rebotara con nuestro suelo, para ello intentamos subir un poco nuestro personaje para dar este efecto.
10.- Ahora que hemos probado, crearemos un C# Script en la carpeta de scripts y lo llamaremos ControlarJugador
11.- Le daremos doble clic para abrir el MonoDevelop e introduciremos el siguiente script.(CODIGO DESACTUALIZADO)
Pueden probar este código.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ControlarJugador : MonoBehaviour
{
//variable para saltar
public float alturasalto;
//variable para la velocidad del movimiento
public float velocidadMovimiento;
public Rigidbody2D rb;
// Start is called before the first frame update
void Start()
{
rb = GetComponent<Rigidbody2D>();
}
// Update is called once per frame
void Update()
{
//MOVIMIENTO DEL PERSONAJE
//Saltar, usamos la barra espaciadora para saltar
if (Input.GetKeyDown(KeyCode.Space))
{
rb.velocity = new Vector2(rb.velocity.x, alturasalto);
}
//Mover a la derecha, usamos la tecla D para movernos a la derecha.
if (Input.GetKey(KeyCode.D))
{
rb.velocity = new Vector2(velocidadMovimiento, rb.velocity.y);
}
//Mover a la izquierda, usamos la tecla A para movernos a la izquierda.
if (Input.GetKey(KeyCode.A))
{
rb.velocity = new Vector2(-velocidadMovimiento, rb.velocity.y);
}
}
}
12.- Ahora que hemos guardado nuestro script se lo asignaremos a nuestro personaje solo con seleccionar a nuestro personaje, despues buscamos nuestro script y lo arrastramos hasta el inspector.
13.- Ahora que hemos asignado el script le asignaremos valores a nuestras variables globales que declaramos, le daremos valores hasta que se ajusten a nuestro gusto para darle forma a la velocidad y al salto.
14.- Ahora si le daremos en reproducir para ver como nos quedo y si no cambiarle algunos valores, recordar que en nuestro script le asignamos para movernos las teclas A y D ambas para izquierda y derecha y para saltar la barra espaciadora. En la siguiente parte revisaremos lo del doble salto y marcadores en el suelo para poder mantener una restricción en el salto del personaje y tener indicadores o banderas para poder realizar nuestro código de manera mas efectiva.
Practica siempre para ir mejorando, la repetición y la constancia nos ayudan a mejorar, recuerda cada vez lo harás mejor, si te equivocas esta bien, permitirse equivocarse es la clave de mejora continua, así que permítete equivocarte mas seguido.
Si te gusta este sitio y deseas que esto continué vivo tu apoyo sera importante, puedes dar clic en la publicidad si lo deseas o puedes donar algo en Patreon si puedes permitírtelo, con esto el proyecto empezara a tener un objetivo y dejara de navegar sin rumbo y empezara a convertirse en una comunidad que ayudara unos a los otros, saludos y excelente día.
<3 AMOR!!!! QUEDO IMPRECIONANTE LLEVAVA 40 MINUTOS BUSCANDO COMO HACER ESTA ESTUPIDES. MUCHAS GRACIAS!!!!
ResponderEliminarHola, muchas gracias, una disculpa si hace falta material no he tenido tiempo para seguir con los tutoriales, espero poder haber sido claro, saludos
EliminarHola que tal, muchas gracias, si me funcionó, pero, ¿como hago para que no se caiga de lado el personaje?
ResponderEliminarHola isaacgz, eso es porque no colocaste restricciones en el rigid body, o constraint, debes colocar que solo se mueva en una sola dirección por ejemplo x y o z, eso hace que se comporte con ese movimiento, no estoy sonando muy claro pero se llaman rotation constraint o position constraint hace que se vaya de lado, por algun error perdi la serie de estos tutoriales y lo deje incompleto, en los demas enseñaba esto y lo perdi, espero volver a realizar estos tutoriales actualizados, saludos
EliminarMuchas gracias!!
ResponderEliminarDe nada, saludos
EliminarHola, todo funciona a la perfección, pero puedo saltar tantas veces como quiera sin tocar el suelo, esto esta resuelto en el siguiente tutorial? Muchas gracias crack.
ResponderEliminarResolvia todo esto en los tutoriales pero los perdi, espero volver a subirlo para solucionarlos, espero realmente poder tener el tiempo, eso que salte muchas veces se debe a que no he restringido el numero de saltos, por eso son infinitos, no se si en el siguiente tutorial lo explique ya que tiene tiempo que lo realice, pero esto se soluciona con una condicion if, no lo tengo a la mano, pero intentare subir otra serie nueva actualizada, saludos
EliminarTodo correcto, pero una pregunta: Como podria hacer para que tubiera que mantener pulsada la tecla para ir de un lado a otro?? en vez de que solo tengas que pulsarla una vez
ResponderEliminarAumentando ya sea la cantidad de saltos, o la distancia
Eliminartengo un problema, no me asigna las variables que se pusieron en el script ,que hago?
ResponderEliminarLo mas probable es que declaraste las variables de tipo private o no colocaste private o public y la declaraste asi, lo cual C# entiende que es private, las variables que se declaran private no aparecen, intenta ponerle public a las variables en el script
EliminarBendiciones y mucha gracias. 👍👍👍👍👍👍👍👍👍
ResponderEliminarBendiciones para ti tambien bro, saludos
Eliminarmi pregunta es por que, por que en NINGUN tutorial dejan el codigo para simplemente hacer copy paste, lo unico que habria que hacer en vez de escribir codigo para algo tan simple seria: ctrl + c , ctrl + v. no me lo e podido explicar...
ResponderEliminarHola cat, entiendo, la verdad creo que es por que los mismos usuarios no dan retroalimentacion, la verdad con lo que acabas de decir, lo reconsiderare para futuros tutoriales, por que al menos yo pienso que lo que subo es correcto y si nadie me dice que eso que hago esta mal pues sigo comentiendo los mismos errores, en cambio si alguien me lo indica como lo hiciste tu claro que se puede hacer algo, te agradezco saludos
Eliminartengo un error, es que hay varias cosas que no reconoce y pone de color. por ejemplo, "rigidbody2d" no lo reconoce, y sí que está añadido al personaje. ".input.GetKey" tampoco lo reconoce, y al poner "new" no me sale la opcion de poner "vector2" y si lo pongo manualmente tampoco vale. Eso y varias cosas más. Agradecería muchñisimo una solución a mi problema. Gracias.
ResponderEliminarestaria bien que me mandaras tu script, para revisarlo, otra puede ser las versiones de unity, saludos
Eliminarmuchas veces escribo el script igual como esta y no pasa nada :(
ResponderEliminarA lo mejor y no estas asignando el script a tu personaje, minimo te mostraria un error en pantalla, checa si lo estas asignando si no me avisas y lo solucionamos, saludos
EliminarEste comentario ha sido eliminado por el autor.
ResponderEliminarMuy bien explicado <3
ResponderEliminarMuchas, gracias Valen, espero subir mas tutoriales, ya que lo he dejado por motivos laborales, espero treaer mas material interesante, saludos.
Eliminarpongo todo igual hasta el punto 9....pero en vez de que el suelo y el persoanje colisione....el personaje se cae...y si lo pongo aun más arriba... se queda ahí en el aire...no sé si es porque el suelo es un tile map o que...pero no he podido pasar del punto 9.
ResponderEliminarya encontré la solución...tenía que poner el componente tilemapcollider 2d...igual gracias :)
EliminarAsi es, si estas usando tilemap o algun objeto, siempre debe de llevar un collider
Eliminarbro, ahora me aparece: Assets\Script\controlar_tronco.cs(40,86): error CS0103: The name 'Getcomponent' does not exist in the current context
ResponderEliminary puse el codigo igual:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class controlar_tronco : MonoBehaviour
{
//variable para saltar
public float alturasalto;
//variable para la velocidad del movimiento
public float velocidadMovimiento;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
//MOVIMIENTO DEL PERSONAJE
//Saltar, usamos la barra espaciadora para saltar
if (Input.GetKeyDown (KeyCode.Space))
{
GetComponent().velocity = new Vector2 (GetComponent().velocity.x, alturasalto);
}
//Mover a la derecha, usamos la tecla D para movernos a la derecha.
if (Input.GetKey(KeyCode.D))
{
GetComponent().velocity = new Vector2(velocidadMovimiento, GetComponent().velocity.y);
}
//Mover a la izquierda, usamos la tecla A para movernos a la izquierda.
if (Input.GetKey(KeyCode.A))
{
GetComponent().velocity = new Vector2(-velocidadMovimiento, Getcomponent().velocity.y);
}
}
}
Ok, puedes cambiar ese Getcomponent de la linea 40 por GetComponent, cambiar la c minuscula por mayuscula, recuerda que en C# es sensible a minusculas o mayusculas si no se resuelve con eso me vuelves a escribir.
EliminarConcretamente en esta parte de la linea del codigo, si te das cuenta el GetComponent esta en minusculas, aqui en esta parte.
Eliminar//Mover a la izquierda, usamos la tecla A para movernos a la izquierda.
if (Input.GetKey(KeyCode.A))
{
GetComponent().velocity = new Vector2(-velocidadMovimiento, Getcomponent().velocity.y);
}
Escribi esto:
ResponderEliminarusing System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class controlar_tronco : MonoBehaviour
{
//variable para saltar
public float alturasalto;
//variable para la velocidad del movimiento
public float velocidadMovimiento;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
//MOVIMIENTO DEL PERSONAJE
//Saltar, usamos la barra espaciadora para saltar
if (Input.GetKeyDown(KeyCode.Space))
{
GetComponent().velocity = new Vector2(GetComponent().velocity.x, alturasalto);
}
//Mover a la derecha, usamos la tecla D para movernos a la derecha.
if (Input.GetKey(KeyCode.D))
{
GetComponent().velocity = new Vector2(velocidadMovimiento, GetComponent().velocity.y);
}
//Mover a la izquierda, usamos la tecla A para movernos a la izquierda.
if (Input.GetKey(KeyCode.A))
{
GetComponent().velocity = new Vector2(-velocidadMovimiento, GetComponent().velocity.y);
}
}
}
Pero me da error, ayuda porfavor
Hola, me podias mencionar que error te dice, ya que unity te dice mas o menos el error en ingles y asi podria apoyarte mejor.
EliminarCreo que ya vi cual es el error que esta pasando, lo que pasa es que ya este codigo esta desactualizado para las nuevas versiones de unity ya que GetComponent usado asi nada mas marca error, lo que yo hice fue agregar el rigidbody y asignarlo, lo dejo aqui para ver si resuelve el error.
Eliminarusing System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class controlar_tronco : MonoBehaviour
{
//variable para saltar
public float alturasalto;
//variable para la velocidad del movimiento
public float velocidadMovimiento;
public Rigidbody rb;
// Start is called before the first frame update
void Start()
{
rb = GetComponent();
}
// Update is called once per frame
void Update()
{
//MOVIMIENTO DEL PERSONAJE
//Saltar, usamos la barra espaciadora para saltar
if (Input.GetKeyDown(KeyCode.Space))
{
rb.velocity = new Vector2(rb.velocity.x, alturasalto);
}
//Mover a la derecha, usamos la tecla D para movernos a la derecha.
if (Input.GetKey(KeyCode.D))
{
rb.velocity = new Vector2(velocidadMovimiento, rb.velocity.y);
}
//Mover a la izquierda, usamos la tecla A para movernos a la izquierda.
if (Input.GetKey(KeyCode.A))
{
rb.velocity = new Vector2(-velocidadMovimiento, rb.velocity.y);
}
}
}
Hola! Me preguntaba si podrias responder mi duda, aca mi problema, el movimiento del personaje va bien y todo, tengo las animaciones y he visto muchas guias pero no se como hacer que pase de estar quieto a correr, si configuro la velocidad no pasa nada y tengo que subir la velocidad a 10 del parametro para que se ejecute la animacion de correr pero si me quedo quieto sigue la animacion de correr, agradeceria que me pudieras ayudar con este problema.
ResponderEliminarHola, por este medio es dificil ya que no me permite poner imagenes para mostrar comodamente, te ire dando informacion para que vayas profundizando, bueno, el problema puede estar en el mecanim, mecanim es donde se ajustas tus parametros y transiciones para los cambios de animaciones, dependiendo como quieras que tu personaje corra por ejemplo por medio de un boton al estilo mario bros, o puedes hacelo despues de un tiempo presionando hacia adelante y que despues de dos segundos empiece a correr, depende del tipo comportamiento que le des a tu personaje para correr lo tienes que plazmar en la parte donde dice parameters, el mecanim lo compones de tres estados el quieto, caminar y correr, ambos tanto caminar como correr tienen que tener flechas de ida y de vuelta hacia estar quieto en mecanim, si quieres caminar la condicion es en mecanim es que la velocidad sea mayor a 1 y es cuando le estes presionando un boton para correr, puede ser similar si tu presionas por ejemplo otra tecla que este asignado a correr entonces debes desactivar la animacion para caminar para activar la animacion, el tipo de variable para decirle si esta corriendo debe ser un booleano en vez de float, ya que puedes activar falso y verdadero, si tu presionaste la tecla para correr entonces lo metes en un if ejemplo if(estaCorriendo == true) si se cumple la condicion desactivas la animacion de caminar y activas la de correr y en el else que seria lo contrario a correr la variable estaCorriendo == false y regresaria al estado de caminar o incluso al estado de estar quieto, pero para ello debe de haber una flecha de ida y de vuelta de estarquieto a correr y de correr a estar quieto. Todo se basa en el mecanim, y que en tu codigo sepas manejar bien los parametros declarado en mecanim y el animator.setfloat o animator.setbool, lo manejes bien en un if y else. Ahora regresando a lo que te sucede es que estas manejando mal tu mecanim, asi configures tu velocidad lo unico que estas haciendo es incrementar la velocidad de dezplazamiento pero no la trancision, no le estas indicando por medio de un indicador(bandera) que se declaran de tipo bool, cuando esta corriendo o no, en ingles lo ponen como isRunning, isJumping, se manejan como falso y verdadero, ahora como estas forzando el parametro de velocidad y al subir a una cantidad de 10, se esta ejecutando pero se comporta distinto por que no hay ningun parametro que lo encienda y apague, isRunning = true o isRunning = false, entonces como no hay ningun valor de eso la transicion de la animacion ocurre por algun fallo de mecanim y te permite usar tu animacion de correr, pero nunca la puedes apagar, ya sea que desde mecanim no haya una flecha de ida y de vuelta desde correr a estar quieto y tambien por que no hay un indicador de tipo bool, en donde puedas apagar y enceder lo de correr. No se si te haya servido mi explicacion, ya que no puedo subir imagenes aqui y el sitio lo deje desactualizado por falta de tiempo, pero a grandes razgos es la logica que debes manejar, te recomiendo veas en youtube videos sobre mecanim, ahi esta la clave, saludos.
EliminarHola tengo este error : Assets/Scripts/ControlarJugador.cs(18,6): error CS0411: The type arguments for method 'Component.GetComponent()' cannot be inferred from the usage. Try specifying the type arguments explicitly.
ResponderEliminarel código :using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class controlar_tronco : MonoBehaviour
{
//variable para saltar
public float alturasalto;
//variable para la velocidad del movimiento
public float velocidadMovimiento;
public Rigidbody rb;
// Start is called before the first frame update
void Start()
{
rb = GetComponent();
}
// Update is called once per frame
void Update()
{
//MOVIMIENTO DEL PERSONAJE
//Saltar, usamos la barra espaciadora para saltar
if (Input.GetKeyDown(KeyCode.Space))
{
rb.velocity = new Vector2(rb.velocity.x, alturasalto);
}
//Mover a la derecha, usamos la tecla D para movernos a la derecha.
if (Input.GetKey(KeyCode.D))
{
rb.velocity = new Vector2(velocidadMovimiento, rb.velocity.y);
}
//Mover a la izquierda, usamos la tecla A para movernos a la izquierda.
if (Input.GetKey(KeyCode.A))
{
rb.velocity = new Vector2(-velocidadMovimiento, rb.velocity.y);
}
}
}
-Me puede ayudar porfavor!!
Hola restone, haber intenta cambiar esta linea, donde dice public RigidBody rb;, cambialo por public RigidBody2D rb; y en el metodo Start colocale rb = GetComponent<RidigBody2D>(); - Avisame si te sirvio si no parar buscar mas sobre este error.
ResponderEliminarHola el error sigue y si ya puse todo lo que me dijo no entiendo que pasa me dice el mismo error aqui le dejo el código de nuevo
EliminarScript :using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class controlar_tronco : MonoBehaviour
{
//variable para saltar
public float alturasalto;
//variable para la velocidad del movimiento
public float velocidadMovimiento;
public RigidBody2D rb;
// Start rb = GetComponent();
rb = GetComponent();
}
// Update is called once per frame
void Update()
{
//MOVIMIENTO DEL PERSONAJE
//Saltar, usamos la barra espaciadora para saltar
if (Input.GetKeyDown(KeyCode.Space))
{
rb.velocity = new Vector2(rb.velocity.x, alturasalto);
}
//Mover a la derecha, usamos la tecla D para movernos a la derecha.
if (Input.GetKey(KeyCode.D))
{
rb.velocity = new Vector2(velocidadMovimiento, rb.velocity.y);
}
//Mover a la izquierda, usamos la tecla A para movernos a la izquierda.
if (Input.GetKey(KeyCode.A))
{
rb.velocity = new Vector2(-velocidadMovimiento, rb.velocity.y);
}
}
}
aah ahora el error cambio ah este: Assets/ControladorJugador.cs(16,8): error CS1519: Invalid token '=' in class, struct, or interface member declaration
EliminarRevisando bien tu codigo, me encontre que usaste Comentarios en Start, checa en esta linea,
EliminarAsi lo tienes tu
// Start rb = GetComponent();
rb = GetComponent();
}
Y deberia ser
void Start()
{
rb = GetComponent();
}
Ademas RigidBody2D no lleva la mayuscula, cambialo por Rigidbody2D, la B debe ser minuscula, en programacion siempre esta clase de errores se deben a que cambias mayusculas por minusculas o el nombre no lo ponemos igual a como lo declaramos, revisa del tutorial la linea 11 donde esta el codigo, no el de la imagen si no lo que esta escrito, ahi puedes comparar con tu codigo y si eso tampoco funciona me vuelves a escribir hasta que lo resolvamos.
Por alguna razon en los comentarios se omite el mayor y el menor que(><) los tuve que poner con codigo html, revisa la linea 11 en la parte del codigo, ahi lo deje bien escrito, si eso tampoco funciona mandame el codigo tal cual lo pusiste y el error que te aparece en unity nuevamente hasta que funcione en tu codigo.
EliminarHola el error sigue y si ya puse todo lo que me dijo no entiendo que pasa me dice el mismo error aqui le dejo el código de nuevo
ResponderEliminarScript :using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class controlar_tronco : MonoBehaviour
{
//variable para saltar
public float alturasalto;
//variable para la velocidad del movimiento
public float velocidadMovimiento;
public RigidBody2D rb;
// Start rb = GetComponent();
rb = GetComponent();
}
// Update is called once per frame
void Update()
{
//MOVIMIENTO DEL PERSONAJE
//Saltar, usamos la barra espaciadora para saltar
if (Input.GetKeyDown(KeyCode.Space))
{
rb.velocity = new Vector2(rb.velocity.x, alturasalto);
}
//Mover a la derecha, usamos la tecla D para movernos a la derecha.
if (Input.GetKey(KeyCode.D))
{
rb.velocity = new Vector2(velocidadMovimiento, rb.velocity.y);
}
//Mover a la izquierda, usamos la tecla A para movernos a la izquierda.
if (Input.GetKey(KeyCode.A))
{
rb.velocity = new Vector2(-velocidadMovimiento, rb.velocity.y);
}
}
}
Restone27 de diciembre de 2020, 12:31
aah ahora el error cambio ah este: Assets/ControladorJugador.cs(16,8): error CS1519: Invalid token '=' in class, struct, or interface member declaration
Sigue funcionando en la version de 2020??
ResponderEliminarHola restone, no, ya no funciona para las versiones 2020, ya que los desarrolladores de unity cambian constantemente y muchas cosas quedan desactualizadas, lo que antes mostré en este codigo funcionaba bastante bien en esa version, ahora en versiones 2018, 2019 y 2020 cambio mucho su estructura de la programación y marca muchos errores que es lo que te esta pasando, de momento no lo he actualizado pero dependiendo del apoyo que reciba lo retomare, pero si no asi quedara abandonado ya que todo blog sin el apoyo de una comunidad no se le puede seguir alimentando con contenido sin un respaldo.
Eliminarsi funciona pero en algunos sprites no les sirve al menos a mi si me funciono pero tuve que cambiar la tecla de salto por la W
EliminarGracias por confirmarlo, no he tenido el tiempo para actualizarlo pero quiero retomarlo con la experiencia que he adquirido en estos años, espero regresar pronto, te agradezco mucho.
Eliminarhola para los que tal vez no les funciona por que tienen que cambiar le tecla de Space por la tecla W y ya les va a saltar o eso se supone porque yo lo intente con la tecla space y no me funciono y con la W si
ResponderEliminarGracias por la confirmación, te agradezco mucho.
Eliminartodo bien se mueve el personaje pero como hago para que no se deslize?
ResponderEliminarHola, el problema que se deslice viene de usar el rigidbody 2D ya que no tiene un comportamiento 100 por ciento 2D y ocurren estos deslizamientos, lo mas común es usar en el mismo rigidbody 2D, en la seccion de constraint debes marcarlo en Z, también debes agregar un physycs material 2D y probar aumentarle el friction, busca sobre physics material 2D para poder probarlo, lamentablemente no pude terminar el tutorial y quedaron muchas dudas, intentare sacar el tiempo para renovar mi contenido mas adelante
EliminarBro pregunta si quiero agregar el cambio de Sprite en q line lo puedo hacer?
ResponderEliminarHola kanon, para hacer los cambios de sprites por ejemplo si tienes alguno con movimientos por ejemplo saltar, correr, caminar, se hace en anim, puedes ver un ejemplo que hice hace años http://recopilacioncodigosprogramacion.blogspot.com/2015/04/animacion-de-sprite-sheet-en-unity-5.html, se le llama animacion de sprite sheet y para darle un poco mas de funcionalidad se usa mecanim para manejar las variables del control de la animacion. Ahora sobre en que linea lo puedes hacer seria en la parte de mover hacia adelante, hacia atras en el salto por lo regular donde manejas tus controles de movimiento.
Eliminar