Controlador de caracteres 2D em unidade (tentando recuperar os antigos jogadores de plataforma)

11

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.

Não é ruim
fonte
4
Os criadores de plataformas da velha escola usavam "física dos desenhos animados" ajustada à mão para mecânica de salto e controle direto da velocidade (ou seja, nenhuma física) para o movimento de caminhada. Se você pode reescrever o controlador de personagem, faça isso, porque será difícil cutucar e produzir uma simulação de física mole nos movimentos nítidos que os jogos da velha escola tiveram.
Patrick Hughes
O problema de gravar um personalizado é que a detecção de colisão é perdida. E não é fácil reconstruí-lo sem usar o raycast (dependendo do ambiente, etc ... pode ser um monte deles). Como você lida com essas situações?
Notbad
Você pode escolher itens que ainda são de animação personalizada - quando você usa corpos rígidos cinemáticos. Eu garantiria que, na maioria das situações, você realmente não deseja forças / física do mundo real etc. para esse tipo de aplicação. Se você está procurando um ângulo mais técnico, talvez pesquisar IK Humano
Runonthespot
1
Defenda a física nessa situação.
Ray_Garner

Respostas:

7

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.

prime31
fonte
3

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:

public void FixedUpdate()
{
    var v = Vector3.zero;
    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.AddForce(v, ForceMode.VelocityChange);

    Debug.Log("Velocity: "+_body.velocity);
}

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.

michael.bartnett
fonte
2

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.velocitymover seu personagem, você pode mexer diretamente Transform.Translate(), o que move o objeto com Transform.positionbase em seu eixo. Você pode determinar o forwarde backrelacionado ao objeto em si ou talvez à plataforma ou piso Transform.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.

mheona
fonte
A primeira coisa que li quando entrei na unidade foi esse tutorial. O problema é que a sensação de controle é muito ruim. É por isso que eu queria encontrar minha própria solução. Por outro lado, quando você começa a usar o Transform.Translate (), não é tão fácil fazer inclinações e outras coisas. Você deve lançar o raio várias vezes (2 ou 3 para o chão, mais para a direção em que está se movendo, dependendo do tamanho do herói). Para dispositivos móveis, o raycast não é bom e menos se você tiver que fazer 5..n por iteração de detecção de colisão. Talvez eu possa estar errado, mas acho que não.
Notbad
1

O que você quer é o controlador de caracteres incorporado . Ao definir a step offsetpropriedade desse componente, você pode fazer com que um jogador suba e desça encostas com facilidade.

NoobsArePeople2
fonte
Desculpe por não comentar, eu sabia que havia um Controlador de Personagens em unidade e que eu o usei várias vezes, mas não gosto de como ele se comporta. É mais adequado apenas para o FPS, não para um jogo de plataforma em que a mecânica do movimento é uma das coisas mais importantes.
Notbad
Acho que depois de mexer nas configurações do Controlador de caracteres, ele funciona bem. O que você achou faltando?
precisa saber é o seguinte
A primeira coisa que eu não gosto é que ele é lento em relação aos corpos rígidos usuais com algum raio. Sabendo como alcançá-lo, acho que poderia usar um controlador mais leve. Outro problema é que o comportamento estranho de uma cápsula / esfera nas bordas da plataforma (pode ser resolvido com mais alguns lançamentos de raios). É por isso que eu quero fazer o meu próprio.
Notbad 17/01/12
0

insira a descrição da imagem aquiSuponho 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

AddRelativeForce

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:

if (Mathf.Abs (v.x)> _ maxWalkSpeed) v.x = _maxWalkSpeed;

manter o mesmo Vx global pode parecer estranho aos olhos. (Acelerações indesejadas)

NorbyAriel
fonte