En estos días estoy tratando de crear un controlador de caracteres 2D con unidad (usando física). Soy bastante nuevo en los motores físicos y es realmente difícil obtener la sensación de control que estoy buscando. Estaría muy feliz si alguien pudiera sugerir una solución para un problema que estoy encontrando:
Este es mi FixedUpdate en este momento:
public void FixedUpdate()
{
Vector3 v=new Vector3(0,-10000*Time.fixedDeltaTime,0);
_body.AddForce(v);
v.y=0;
if(state(MovementState.Left))
{
v.x=-_walkSpeed*Time.fixedDeltaTime+v.x;
if(Mathf.Abs(v.x)>_maxWalkSpeed) v.x=-_maxWalkSpeed;
}
else if(state(MovementState.Right))
{
v.x= _walkSpeed*Time.fixedDeltaTime+v.x;
if(Mathf.Abs(v.x)>_maxWalkSpeed) v.x=_maxWalkSpeed;
}
_body.velocity=v;
Debug.Log("Velocity: "+_body.velocity);
}
Estoy tratando de mover el cuerpo rígido aplicando una gravedad y una fuerza lineal para izquierda y derecha. He configurado un material físico que no hace rebotar y 0 fricción cuando se mueve y 1 fricción con el modo detenido. El principal problema es que tengo colisionadores con pendientes y la velocidad cambia de subir (más lento), bajar la pendiente (más rápido) y caminar en un colisionador recto (normal). ¿Cómo podría solucionarse esto? Como ve, estoy aplicando siempre la misma velocidad para el eje x.
Para el jugador lo tengo configurado con una esfera en la posición de los pies que es el cuerpo rígido al que estoy aplicando fuerzas.
Cualquier otro consejo que pueda hacerme la vida más fácil con esto es bienvenido :).
PD Al llegar a casa, me di cuenta de que podía resolver esto aplicando una fuerza constante paralela a la superficie por la que camina el jugador, pero no sé si es el mejor método.
fuente
Respuestas:
Si está buscando imitar los juegos de plataformas de la vieja escuela, el primer paso es abandonar la física por completo. Terminarás luchando contra el sistema de física para obtener el movimiento decididamente no realista de un juego de plataformas de la vieja escuela. Eche un vistazo a este reemplazo de CharacterController que abandona la física por completo para tener una buena idea de una forma de implementarlo.
fuente
Probablemente sería más feliz con lo que mheona recomienda. Pero si vas a usar la física de Unity, entonces probablemente quieras usarla
ForceMode.VelocityChange
.Ejemplo:
También debe aplicar la gravedad global en la configuración de Física de su proyecto, y para los objetos que desea que caigan más rápido, agregue un componente de Fuerza constante .
ForceMode.Impulse
es similar pero se ve afectado por la masa del cuerpo rígido. Lo hace más difícil de sintonizar.fuente
Incluso si no te gusta el componente integrado de Character Controller (como a mí), mira el código de ejemplo de Unity para el Tutorial de juego 2D .
El código implementa un juego 2D completo con plataformas móviles, enemigos y cajas con colisión, utilizando el Controlador de personajes.
Pero si ni siquiera quiere echar un vistazo, le sugiero que minimice el uso de la física e intente copiar su comportamiento con su propio código. Dependiendo de qué tipo de juego 2D estés planeando, puede funcionar bastante bien. Por ejemplo, en lugar de aplicar fuerza para
Rigidbody.velocity
mover a tu personaje con el que podrías meterte directamenteTransform.Translate()
, lo que mueve el objetoTransform.position
según su eje. Se podía determinar elforward
yback
en relación con el objeto mismo o tal vez la plataforma o en el sueloTransform.up
, para que sepa si es una rampa y tipo de saber su ángulo.Además, si crea algún tipo de atributo de control de velocidad (por ejemplo, cuánto tiempo se presiona la tecla), puede aplicarlo junto con su dirección mientras traduce para evitar que su personaje camine algo demasiado inclinado sin cierta velocidad, como lo hicieron en Sonic the Hedgehog para Genesis / Mega Drive.
Si eliges seguir usando la física, no puedo ayudarte en absoluto porque no soy tan bueno en eso, pero ten en cuenta que es un comportamiento normal ir 'cuesta arriba' más lento ya que el cuerpo necesita más fuerza para mantenerse al día , como la vida real.
fuente
Lo que quieres es el controlador de caracteres incorporado . Al configurar la
step offset
propiedad en este componente, puede hacer que un jugador suba y baje pendientes con facilidad.fuente
Supongo que es porque la fuerza no es paralela a la plataforma y el resultado termina siendo más bajo en ascenso y más alto en descenso.
Si aplica una fuerza relativa al sistema de coordenadas
Desea mantener una velocidad máxima en "x" y compararla con un escalar, recuerde que la velocidad es un vector y componga vx y vy, en terreno plano vy es cero, pero necesariamente en pendientes es mayor que cero.
La velocidad cambia de acuerdo con la dirección del cuerpo, y su vx relativo cambia con respecto a su vx general
Esto puede modificar su V de una manera que no desea también:
Mantener el mismo Vx global puede parecer extraño a la vista. (Aceleraciones no deseadas)
fuente