Hoje estou tentando criar um controlador de caracteres 2D com unidade (usando phisics). Eu sou bastante novo nos motores físicos e é realmente difícil ter a sensação de controle que estou procurando. Ficaria muito feliz se alguém pudesse sugerir solução para um problema que estou encontrando:
Este é o meu FixedUpdate agora:
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);
}
Estou tentando aqui apenas mover o corpo rígido, aplicando uma gravidade e uma força linear para esquerda e direita. Eu configurei um material físico que não faz saltar e 0 atrito quando se move e 1 atrito com o suporte parado. O principal problema é que tenho colididores com declives e a velocidade muda de subir (mais devagar), descer a ladeira (mais rápido) e andar em um colisor reto (normal). Como isso poderia ser corrigido? Como você vê, eu estou aplicando sempre a mesma velocidade para o eixo x.
Para o jogador, tenho uma configuração com uma esfera na posição dos pés, que é o corpo rígido ao qual estou aplicando forças.
Qualquer outra dica que possa facilitar minha vida com isso é bem-vinda :).
PD Ao voltar para casa, notei que poderia resolver isso aplicando uma força constante paralela à superfície que o jogador está andando, mas não sei se é o melhor método.
fonte
Respostas:
Se você deseja imitar os criadores de plataformas da velha escola, o primeiro passo é abandonar completamente a física. Você acabará lutando contra o sistema de física para obter o movimento decididamente não realista de um jogo de plataformas da velha escola. Dê uma olhada nesta substituição do CharacterController que descarta completamente a física para ter uma boa idéia de uma maneira de implementá-la.
fonte
Você provavelmente ficaria mais feliz com o que mheona recomendou. Mas se você for usar a física do Unity, provavelmente desejará usá-lo
ForceMode.VelocityChange
.Exemplo:
Você também deve aplicar a gravidade global nas configurações de física do seu projeto e, para objetos que deseja que caiam mais rapidamente, adicione um componente Constant Force .
ForceMode.Impulse
é semelhante, mas é afetado pela massa do corpo rígido. Torna mais difícil de ajustar.fonte
Mesmo que você não goste do componente de controle de personagem incorporado (como eu), dê uma olhada no código de exemplo do Unity para o Tutorial de jogabilidade 2D .
O código implementa uma jogabilidade 2D completa com plataformas móveis, inimigos e caixas com colisão, usando o Controlador de Personagens.
Mas se você nem quer dar uma olhada, sugiro que você minimize o uso da física e tente copiar seu comportamento com seu próprio código. Dependendo do tipo de jogo 2D que você está planejando, pode funcionar muito bem. Por exemplo, em vez de aplicar força para
Rigidbody.velocity
mover seu personagem, você pode mexer diretamenteTransform.Translate()
, o que move o objeto comTransform.position
base em seu eixo. Você pode determinar oforward
eback
relacionado ao objeto em si ou talvez à plataforma ou pisoTransform.up
, para saber se é uma rampa e o tipo de ângulo.Além disso, se você criar algum tipo de atributo de controle de velocidade (por exemplo, por quanto tempo a tecla é pressionada), poderá aplicá-lo junto com sua direção enquanto estiver traduzindo para impedir que seu personagem ande com algo muito inclinado sem velocidade, como fizeram no Sonic the Hedgehog para Genesis / Mega Drive.
Se você optar por continuar usando a física, não posso ajudá-lo, porque não sou tão bom nisso, mas saiba que é um comportamento normal subir uma ladeira mais devagar, pois o corpo precisa de mais força para acompanhar , como na vida real.
fonte
O que você quer é o controlador de caracteres incorporado . Ao definir a
step offset
propriedade desse componente, você pode fazer com que um jogador suba e desça encostas com facilidade.fonte
Suponho que seja porque a força não é paralela à plataforma e o resultado acaba sendo mais baixo em ascensão e mais alto em descida.
Se você aplicar uma força relativa ao sistema de coordenadas
Você deseja manter uma velocidade máxima em "x" e compará-la com um escalar, lembre-se de que velocidade é um vetor e componha vx e vy, em terreno plano vy é zero, mas necessariamente em declives é maior que zero.
A velocidade muda de acordo com a direção do corpo e seu vx relativo muda em relação ao seu vx geral
Isso pode modificar seu V de uma maneira que você também não deseja:
manter o mesmo Vx global pode parecer estranho aos olhos. (Acelerações indesejadas)
fonte