Vamos a solucionar el problema de movimiento de nuestro jugador pues el objeto de juego sigue el movimiento del mouse aun cuando este se sale de la escena.
Disculpa quizas una correccion, el codigo funciona increible mas tiene el problema es que el sprite como fue importado tiene un tamaño mayor en una zona de capa "invisible" por decirlo de alguna manera por lo que para ajustarlo debes hacer una suma, y al realizar esa suma a valores cambiantes lo que generas es una pequeña aceleracion al movimiento que se nota mas y mas al alejarse de los valores en el centro de el escenario, considero yo que tu solucion es completamente viable si tu tienes control total sobre el tamaño de los sprites usados, si no es asi y tienes como en la clase sprites con zonas invisibles que es mejor conocer el tamaño de tu pantalla a lo ancho la cual es de 10 de -5 a 5 y el tamaño de tu sprite en relacion a esta el cual es de 1 a 1 entonces dejando los limites de -4.5 a 4.5 evitas generar mas codigo que se deba compilar en la app haciendola mas pesada y un ajuste mas preciso sin causar aumentos de velocidad.
gracias igual por tu codigo ya que hace uso de muchas cosas que aun no conocia
Hice un código para no hardcodear los valoes... ¿Qué les parece?
using System.Collections;using System.Collections.Generic;using UnityEngine;publicclassPlayerMovement:MonoBehaviour{SpriteRenderer playerSpriteRender;//The Color to be assigned to the Renderer’s MaterialvoidStart(){//Fetch the SpriteRenderer from the GameObject playerSpriteRender =GetComponent<SpriteRenderer>();}// Update is called once per framevoidUpdate(){Vector3 mosuePos =Camera.main.ScreenToWorldPoint(Input.mousePosition); transform.position=newVector3(transform.position.x,Mathf.Clamp(mosuePos.y,LimitDown(),LimitUp()), transform.position.z);} float LimitDown(){returnCameraOrigin().y+ playerSpriteRender.bounds.extents.y;} float LimitUp(){returnCameraBounds().y- playerSpriteRender.bounds.extents.y;}Vector2CameraBounds(){returnCamera.main.ScreenToWorldPoint(newVector2(Screen.width,Screen.height));}Vector2CameraOrigin(){returnCamera.main.ScreenToWorldPoint(Vector2.zero);}}
Gran aporte, se ve muy limpio el código aparte
Hola comunidad alguien porfavor podria explicarme esta linea de codigo. no entiendo en si como seria el funcionamiento y principalmente la parte de transfor.position.x.. muchisimas gracias
estas creando un objecto Vector3 que recibira por parametros
recibira la transformacion de la posicion del eje x
transfor = transformar/convertir, no se a que se refiere ya que no estoy en tu curso
position = mètodo que te devuelve alguna posición
x= supongo que sera una constante
recibe la posición del mouse en el eje y
hace lo mismo que 1 pero con el eje z
Deja fijo el objeto, excepto en el eje Y (su valor cambia dependiendo de la posición del mouse).
Por si quieren limitar el movimiento de la paleta dentro de la cámara, este fue el código que hice para no quemar ningún valor:
/// <summary>/// Move the sprite into the world limits/// </summary>/// <param name="sprite">The current sprite</param>publicstaticvoidmoveSpriteIntoWorldLimits(SpriteRenderer sprite){var topLeftCorner =Camera.main.ViewportToWorldPoint(newVector3(0,0,0));var worldSize =Camera.main.ViewportToWorldPoint(newVector3(1,1,1));var width = sprite.bounds.size.x;var height = sprite.bounds.size.y;setToMousePosition( sprite.transform, topLeftCorner.x+ width/2, worldSize.x- width/2, topLeftCorner.y, worldSize.y- height
);}/// <summary>/// Update the position with the mouse position/// </summary>/// <param name="transform"></param>publicstaticvoidsetToMousePosition(Transform transform, float minX =0, float maxX =0, float minY =0, float maxY =0){var newPosition =Camera.main.ScreenToWorldPoint(Input.mousePosition);if(minX !=0|| maxX !=0){ newPosition.x=Mathf.Clamp(newPosition.x, minX, maxX);}if(minY !=0|| maxY !=0){ newPosition.y=Mathf.Clamp(newPosition.y, minY, maxY);} newPosition.z= transform.position.z; transform.position= newPosition;}
hay un input llamado height el cual sirve para que detecte la altura de lapantalla automaticamente
a la hora que ejecuto el juego la paleta aparece en otra parte solo se puede ver que se mueve en Scene pero no en game?
Checa su posición en z.
Aunque sea un juego 2d, el eje z influye si esta delante o detrás de la cámara, del fondo, del personaje o de algún otro objeto
En este caso sería conveniente, como aclararon más abajo, no usar valores numéricos directamente. Sino usar algo más óptimo como la resolución de la pantalla
Como la obtienes?
Antes de aplicar la función Clamp me funcionaba bien y al aplicarla ya no, o se me queda hasta arriba o se me queda hasta abajo, no sigue el mouse cuando aplico la función Clamp, ¿Saben porque no funciona? Según yo, hice todo lo que indico la Profa y usé la función correctamente.
Hola compañero, espero hayas resolvido tu duda, pero en caso de que no, aqui te va mi solución.
Mathf.clamp, recibe tres parametros como lo notaste, los cuales son 3 variables del tipo float
El primer parametro es la posicion en el eje correspondiente del objeto que sera limitada, el segundo el limite minimo y el tercero el limite maximo
En tu caso pusiste al reves el limite minimo y maximo, es decir pusiste como minimo la posicion 3.8f, cuando esta deberias ser la maxima posicion, pues es mayor a -3.8f, asi quedaria la solucion
Esto en mi caso, que hice la escena un poco mas grande, en tu caso debes mantener las posiciones de tu proyecto, saludos, espero haberter ayudado :D
Jjejejje, si me sirvió, muchas gracias!
Mi paddle no se mueve, si marca los cambios de pocisión según el mouse, pero el personaje (paddle) no se mueve.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
// Start is called before the first frame updatevoidStart(){}// Update is called once per framevoidUpdate(){Debug.Log(Input.mousePosition);Vector3 mousePos =Camera.main.ScreenToWorldPoint(Input.mousePosition); transform.position=newVector3(mousePos.x, mousePos.y, transform.position.z);}
}
el codigo es de la clase anterior
¡Hola!
Puedes intentar con lo siguiente?
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
// Use this for initializationvoidStart(){}// Update is called once per framevoidUpdate(){Vector3 mousePos =Camera.main.ScreenToWorldPoint(Input.mousePosition); transform.position=newVector3(transform.position.x,Mathf.Clamp(mousePos.y,-3.8f,3.8f), transform.position.z);}
}
Cual seria el inconveniente de dejar el código tal como lo hizo lo profe en lugar de hacerlo como algunos compañeros para evitar "hardcodear código"?
Thanks :)
¿De cual de los dos proyectos hablas?
Si hablas del pong al subir la velocidad a la que la palette enemiga sigue la pelota esta se movera muy rapido, o dime de cual proyecto hablas
Hola, me refiero a la parte donde ponemos los valores para restringir el movimiento de la barra en el eje y, ya que vi que algunos compañeros implementaron código para no tener que poner directamente los valores -4 y 4, en este caso.
No se podia poner en el vector3 un valor para la z, o la x, por el problema de la pantalla de los moviles, pero ¿como es que si podemos poner un valor concreto para la frontera de la barra?
Mi paddle sigue al mouse pero no se mueve las mismas posiciones.
Podrias ser mas especifico o sebir tu codigo
Capaz colocaste los valores invertidos.
Este es mi código:
// Obtain and transform the user's mouse positionVector3 mousePos =Camera.main.ScreenToWorldPoint(Input.mousePosition); transform.position=newVector3(transform.position.x,Mathf.Clamp(mousePos.y,-3.8f,3.8f), transform.position.z);
Pruebalo y me dices que tal. 😄
Pues Normalmente se llama Calibrador :v, pero ni idea en realidad :v :v
Se comento sobre una funcion llamada Clamp…es una aplicacion separada o una funcion en Visual Studio?
Clamp es un método de la clase Mathf que pertenece a Unity3D. La clase Mathf tiene muchos métodos muy útiles, vale la pena pegarle una mirada a las funciones más útles.
Soy de Colombia y acá al clamp se le llama sargento (Ni idea por qué)
Para quien lea esto:
La funcion Clamp que habla aqui es la de Mathf, quedaria de la siguiente forma.
Mathf.Clamp(VALOR_A_RESTRINGIR,VALOR_MINIMO,VALOR_MAXIMO);
Esta funciona tanto para numeros enteros (int), como Reales (float). Y, en jerga de programacion, la funcion retorna el valor con el cual fue utilizado (int o float).
alguien tiene algún tutorial para la creación de eventos mediante touch? , me refiero ala creación de botones virtuales
Unicamente para poder moverlo en el eje y se debe modificar el codigo anterior de la siguiente manera
transform.position = new Vector3(transform.position.x, vector3.y, transform.position.z);
Soy de Argentina y eso que llaman ‘clamp’ aquí se nombra como ‘morsa’ o ‘prensa’.
Una consulta sobre el ejercicio: No hay forma de pasarle al método los mínimos y máximos de la pantalla de juego?
No sería una buena practica acceder al Transform primero públicamente?
Es decir, fuera de los void
ej:
Transform trans;
Así ya en el void Update (por ejemplo) puedes solo poner
trans.position = new Vector3(trans.position.x, mousePosition.y, trans.position.z);
Es más rápido y efectivo no? Así ocupas menos espacio, menos letras por lo cual menos memoria…