Como faço um pulo de colisão?
3 participantes
Página 1 de 1
Como faço um pulo de colisão?
Boa noite, estou fazendo um game de plataforma 2D, onde o personagem tem 3 vidas, e que a cada dano que tome perca uma vida. O sistema de vida já está formulado, mas eu preciso que quando encostar em um inimigo ele dê um pulo para trás do impacto da colisão, como nos jogos classicos ao tomar dano.
eu tentei usar um add force com força no X e Y para ele dar um pulo como se fosse na diagonal, mas de todas as maneiras que tentei, ou ele teleporta ou fica parado, não ocorre realmente a força que faça esse impulso. Alguem tem alguma ideia de como posso fazer?
eu tentei usar um add force com força no X e Y para ele dar um pulo como se fosse na diagonal, mas de todas as maneiras que tentei, ou ele teleporta ou fica parado, não ocorre realmente a força que faça esse impulso. Alguem tem alguma ideia de como posso fazer?
mydaegon- Iniciante
- PONTOS : 1920
REPUTAÇÃO : 0
Respeito as regras :
Re: Como faço um pulo de colisão?
Poste seu script, amigo.
JohnRambo- Moderador
- PONTOS : 5171
REPUTAÇÃO : 661
Idade : 24
Áreas de atuação : Unity;
Programação;
Música e Sonorização;
Graduado em Análise e Desenvolvimento de Sistemas;
Respeito as regras :
Re: Como faço um pulo de colisão?
Não estou com nenhuma função no script para fazer isso, mas este é o script:
Quero testar colocando no Ienumerator de Ataque o Pulo pra trás, e se der certo, eu crio o lugar correto para quando acontecer, mas não tenho ideia do que eu posso usar para fazer esse impulso. Eu tentei algo parecido com Rigidbody2D.AddForce(new vector2(200, 200);, para aplicar força para o alto e para frente, porém está teleportando. Alem de que no vetor X, eu precisei colocar uma força de 1000 para ele teleportar, por que menor ele só ficava parado.
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
private Rigidbody2D playerRB;
private float horizontal;
private SpriteRenderer playerSR;
private bool Andando, Pulando, Correndo, Atacando, CanAttack;
private bool Grounded;
private Animator PlayerAnimator;
public GameObject Pe;
public BoxCollider2D Espada;
public LayerMask Ground;
private Animator Anim;
private bool Morreu;
[Header("Atribuição de Valores")]
public Transform A;
public float Velocidade, VelocidadeInicial, VelocidadeBuffada, ForcaPulo, DuracaoDoAtaque;
public int Vida;
void Start()
{
playerRB = GetComponent<Rigidbody2D>();
playerSR = GetComponent<SpriteRenderer>();
CanAttack = true;
PlayerAnimator = GetComponent<Animator>();
Anim = GetComponent<Animator>();
Morreu = false;
}
void Update()
{
PlayerAnimator.SetBool("Morreu", Morreu);
PlayerAnimator.SetBool("Andando", Andando);
PlayerAnimator.SetBool("Grounded", Grounded);
PlayerAnimator.SetBool("Pulando", Pulando);
PlayerAnimator.SetBool("Atacando", Atacando);
Grounded = Physics2D.OverlapCircle(Pe.transform.position, 0.02f, Ground);
horizontal = Input.GetAxisRaw("Horizontal");
if (Morreu == false)
{
playerRB.velocity = new Vector2(horizontal * Velocidade, Pe.transform.position.y);
}
if (Grounded == true)
{
Pulando = false;
}
else
{
Pulando = true;
}
if (Velocidade == VelocidadeBuffada)
{
Correndo = true;
if (Correndo == true && Grounded == true && Atacando == false)
{
Anim.speed = 2;
}
else
{
Anim.speed = 1;
}
}
else
{
Correndo = false;
Anim.speed = 1;
}
if (horizontal == 1 && Morreu == false)
{
playerSR.flipX = false;
}
if (horizontal == -1 && Morreu == false)
{
playerSR.flipX = true;
}
if (horizontal != 0)
{
Andando = true;
}
else
{
Andando = false;
}
if (Vida <= 0 && Morreu == false)
{
Morreu = true;
StartCoroutine(Morte());
}
if (Input.GetButton("Correr"))
{
Velocidade = VelocidadeBuffada;
}
else
{
Velocidade = VelocidadeInicial;
}
if (Input.GetButtonDown("Jump") && Grounded == true && Morreu == false)
{
Pulo();
}
if (Input.GetButtonDown("Fire1") && CanAttack == true && Morreu == false)
{
CanAttack = false;
StartCoroutine(Ataque());
}
}
void Pulo()
{
Pulando = true;
playerRB.AddForce(new Vector2(0, ForcaPulo));
}
IEnumerator Ataque()
{
if (Pulando == false)
{
Atacando = true;
Espada.enabled = true;
yield return new WaitForSeconds(DuracaoDoAtaque);
Espada.enabled = false;
Atacando = false;
}
if (Pulando == true)
{
Atacando = true;
Espada.enabled = true;
yield return new WaitForSeconds(DuracaoDoAtaque - 0.1f);
Espada.enabled = false;
Atacando = false;
}
CanAttack = true;
}
IEnumerator Morte()
{
yield return new WaitForSeconds(3.5f);
print("Morreu");
}
}
Quero testar colocando no Ienumerator de Ataque o Pulo pra trás, e se der certo, eu crio o lugar correto para quando acontecer, mas não tenho ideia do que eu posso usar para fazer esse impulso. Eu tentei algo parecido com Rigidbody2D.AddForce(new vector2(200, 200);, para aplicar força para o alto e para frente, porém está teleportando. Alem de que no vetor X, eu precisei colocar uma força de 1000 para ele teleportar, por que menor ele só ficava parado.
Última edição por Magnatah em Sex Set 20, 2019 1:46 pm, editado 1 vez(es) (Motivo da edição : Coloque os Script na Área de Scripts. (Ajuda Bastante Para Ambos os Lados))
mydaegon- Iniciante
- PONTOS : 1920
REPUTAÇÃO : 0
Respeito as regras :
Re: Como faço um pulo de colisão?
Eu quero algo como nos jogos do sonic, que ao ele encostar em um inimigo, perca vida ( A vida já perde) e de um pulo de impulso, como neste vídeo aos 0:44 segundos.
mydaegon- Iniciante
- PONTOS : 1920
REPUTAÇÃO : 0
Respeito as regras :
Re: Como faço um pulo de colisão?
Entendi... Acho que já sei qual é o erro aí.
O AddForce precisa ter um multiplicador, por exemplo, no Super mario, quando você pula em um inimigo, o inimigo morre e o mario dá mais um pulo para cima. Isto seria feito assim:
experimente usar esta sintaxe, deve funcionar.
O AddForce precisa ter um multiplicador, por exemplo, no Super mario, quando você pula em um inimigo, o inimigo morre e o mario dá mais um pulo para cima. Isto seria feito assim:
- Código:
playerRB.AddForce (Vector2.up * 10);
experimente usar esta sintaxe, deve funcionar.
JohnRambo- Moderador
- PONTOS : 5171
REPUTAÇÃO : 661
Idade : 24
Áreas de atuação : Unity;
Programação;
Música e Sonorização;
Graduado em Análise e Desenvolvimento de Sistemas;
Respeito as regras :
Re: Como faço um pulo de colisão?
Vou tentar, mas pelo que eu entendi, essa sintaxe vai fazer ele dar um pulo apenas né? O que eu poderia colocar para que esse o personagem pule para trás?
mydaegon- Iniciante
- PONTOS : 1920
REPUTAÇÃO : 0
Respeito as regras :
Re: Como faço um pulo de colisão?
O jogo é 2D né? nesse caso poderia usar um Vector2.left
JohnRambo- Moderador
- PONTOS : 5171
REPUTAÇÃO : 661
Idade : 24
Áreas de atuação : Unity;
Programação;
Música e Sonorização;
Graduado em Análise e Desenvolvimento de Sistemas;
Respeito as regras :
Re: Como faço um pulo de colisão?
Eu tentei usar este comando e aconteceu o mesmo, ao inves de aparecer o personagem pulando para tras, ele pula normalmente pro alto, porém ao invés que pular para trás ele dá um teleporte. Poderia ser alguma opção da Unity? Porque até em alguns tutoriais parece que o Script está certo
mydaegon- Iniciante
- PONTOS : 1920
REPUTAÇÃO : 0
Respeito as regras :
Re: Como faço um pulo de colisão?
Teleporte? Vc está colocando o AddForce no IEnumerator ou dentro do FixedUpdate?
Tudo o que é relacionado à física, Rigidbody, Joins, e etc.. deve ser colocado no FixedUpdate.
Tudo o que é relacionado à física, Rigidbody, Joins, e etc.. deve ser colocado no FixedUpdate.
Re: Como faço um pulo de colisão?
Eu nao sei bem a diferença, mas eu Coloquei no Update e não no FixedUpdate, faz diferença?
mydaegon- Iniciante
- PONTOS : 1920
REPUTAÇÃO : 0
Respeito as regras :
Re: Como faço um pulo de colisão?
Ah nao, achei que fosse dentro do Update, mas realmente, é dentro de um Ienumerator
mydaegon- Iniciante
- PONTOS : 1920
REPUTAÇÃO : 0
Respeito as regras :
Re: Como faço um pulo de colisão?
Faz sim!
O Update é chamado dependendo do FPS do jogo, são chamadas irregulares, tanto que precisa sempre multiplicar algum valor por Time.DeltaTime para tentar corrigir .
O FixedUpdate existe justamente para corrigir essa irregularidade, é usado para trabalhar com componentes de física e cálculos muito pesados porque é chamado num número fixo de vezes. A própria documentação da Unity recomenda usar o FixedUpdate para trabalhar com Rigidbody.
Referência: https://docs.unity3d.com/ScriptReference/MonoBehaviour.FixedUpdate.html
O Update é chamado dependendo do FPS do jogo, são chamadas irregulares, tanto que precisa sempre multiplicar algum valor por Time.DeltaTime para tentar corrigir .
O FixedUpdate existe justamente para corrigir essa irregularidade, é usado para trabalhar com componentes de física e cálculos muito pesados porque é chamado num número fixo de vezes. A própria documentação da Unity recomenda usar o FixedUpdate para trabalhar com Rigidbody.
Referência: https://docs.unity3d.com/ScriptReference/MonoBehaviour.FixedUpdate.html
Tópicos semelhantes
» Como faço a colisão do terreno em um jogo estilo Beat n' Up?
» Como fazer um sistema de pulo com character controller?
» Como que faço para rotacionar um objeto na posição do player como o cenario
» [Unity 5] Como retirar pulo do FirstPersonController ?
» Como adiciono um SOM neste script de pulo?
» Como fazer um sistema de pulo com character controller?
» Como que faço para rotacionar um objeto na posição do player como o cenario
» [Unity 5] Como retirar pulo do FirstPersonController ?
» Como adiciono um SOM neste script de pulo?
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos