Ir ao conteúdo
  • Cadastre-se

C# Personagem preso quando pula colado na parede


vmoraes424

Posts recomendados

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMovementScript : MonoBehaviour
{
public CharacterController controller;

public float Speed = 12f;
public float gravity = -9.81f;
public float jumpHeight = 3f;

public Transform groundCheck;
public float groundDistance = 0.4f;
public LayerMask groundMask;

Vector3 velocity;
bool isGrounded;

void Update()
{
    isGrounded = Physics.CheckSphere(groundCheck.position, groundDistance, groundMask);

    if(isGrounded && velocity.y < 0)
    {
        velocity.y = -2f;
    }

    float x = Input.GetAxis("Horizontal");
    float z = Input.GetAxis("Vertical");

    Vector3 move = transform.right * x + transform.forward * z;


    controller.Move(move * Speed * Time.deltaTime);

    if(Input.GetButtonDown("Jump") && isGrounded)
    {
        velocity.y = Mathf.Sqrt(jumpHeight * -2f * gravity);
    }
    if (Input.GetKeyDown(KeyCode.LeftShift))
    {
        controller.Move(move * Speed * Time.deltaTime * 2);
    }

    if (!isGrounded)
    {
        velocity.y += gravity * Time.deltaTime;
    }

    controller.Move(velocity * Time.deltaTime);
}

https://www.youtube.com/watch?v=oRbdmtRy4bk

Citação

Só trava quando eu pressiono W e pulo, quando eu só aperto espaço ele pula normal

 

Link para o comentário
Compartilhar em outros sites

Essa pra mim é clássica! Já tive tanto problema com isso que hoje sou um ancião do pulo 2d rsrsrs

O que você precisa é de uma coisa bem básica: máquina de estados.

O seu Update tá lotado de código que faz mais de uma coisa.

Por exemplo, ali você está pulando, está caindo, está parando, está caminhando, etc.

Esse seu código se continuar assim vai ficar tão complexo que você não saberá como manter ele.

Com uma mmáquina de estados bem planejada você pode dividir funções entre os estados e ir controlando tudo facilmente. Eu tenho código de máquinas de estados em jogos que deve ter mais de 900 linhas, e eu ainda dividi por métodos pra não encher de código uma única função.

 

Vou dar um exemplo básico:

Supondo que antes de programar, você queira que seu personagem faça 3 coisas: ficar em pé parado, caminhar (não interessa a direção) e pular e cair. (Vou colocar o cair aquis eparado de pular)

 

Então, antes você define esses valores como estados:
const int PARADO = 1

const CAMINHANDO = 2;

const PULANDO = 3;

const CAINDO = 4;

 

Em seguida, na sua classe, você cria uma variável para definir o estado atual:
class Player {

  int estado;

  //no construtor coloque estado = PARADO; que é o estado inicial

  Update ();

}

 

Daí no Update, você verifica em qual estado está e então faz somente o código daquele estado:

void Player.Update (  ) {

   if (estado == PARADO) {

      //aqui faz todo o código de parado, aqui não pula, nem caminha

      facaFicarParado();//seta velocidades para 0

      //verifique se não está no chão

     if (isGround() == false) {

        estado = CAINDO;//não toca o chão? Entao está caindo

     }

   }

  else if (estado == CAMINHANDO) {

    //aqui faz todo o código de caminahndo, aqui não fica parado, nem pula

    facaCaminhar();

      //verifique se não está no chão

     if (isGround() == false) {

        estado = CAINDO;//não toca o chão? Entao está caindo

     }

  }

  //em geral, cair e pular são o mesmo código

  else if (estado == PULANDO || estado == CAINDO) {

     facaMoverNoAr();

     //verifique se não está no chão

     if (isGround() == true) {

        estado = PARADO;//não toca o chão? Entao está caindo

        velocidade.y = 0;

     }

  }

}

 

Observe o seguindte: quando estamos no estado de PULANDO ou CAINDO é nesse momento que devemos mover no eixo que aponta pra cima (Y no caso), e se encostar no chão, deve-se fazer velocidade.y = 0; para parar o player. No estado == PARADO não movemos nada.

Só que tem um porém aqui, o método isGround, ele deve prever a colisão antes que ela ocorra. Por exemplo:
-supondo que o Player colida com o chão, daí a engine de física vai dizer: colidiu com o chão, porém, muitas engines de físicas mal programadas e de interface bem burrinha, vai parar de verificar a colisão do objeto que está bem em cima do outro, porém, separado por uma distância muito, mas muito pequena. E por isso, a função isGround vai retornar false quando o objeto tiver colidido com o chão.

Nesse caso, você deve colocar um ponto 3d em baixo do seu player, à pouca distância do pé dele, tipo, a pouco mais de 0.001 pra baixo do pé. E então, com esse pequeno ponto (ou mais deles), você diz quando de fato o Player está no chão em cima dele mas sem tocá-lo e assim está parado.

Link para o comentário
Compartilhar em outros sites

@cpusam Vou ser sincero com você, eu não entendi nada, eu li e reli essa mensagem várias vezes mas, eu começei a programar jogos a mais ou menos 2 semanas atrás e não sei como aplicar no meu código, que aliás é do brackeys, na minha cabeça o que você ta falando aí faz sentido mas eu não consigo transcrever como código.... De duas semanas pra cá eu to pegando códigos "prontos" na internet e lendo pra tentar entende-los mas isso que você me passou aí pra mim é muito avançado, entende?

Link para o comentário
Compartilhar em outros sites

@vmoraes424 relaxa, se não tem tanta experiência, melhor deixar de lado o que eu disse, pelo menos por enquanto. O que digo é que, máquinas de estados são a alma pra todo jogo, eu nunca conseguiria fazer jogos se não soubesse sobre máquinas de estados. Inicialmente pode parecer complicado mas não é, máquinas de estados também estão na base da computação e robótica, além da IA.

 

Sugiro que você leia esses materiais se quiser ficar bom no assunto:
-livro Linguagens formais e atômatos

Finite state machine for game developers - Gamedevelopertips:

http://gamedevelopertips.com/finite-state-machine-game-developers/

 

Não tem muito material em português, então, use ai o google translator nesse link. O livro que indiquei tem uma ilustração do jogo pacman na capa, mas não fala nada de aplicação de máquinas de estados em jogoso e nem em programação, é apenas teoria.

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...