Como percorrer por rampas sem deslizar o Rigdbody?
2 participantes
Página 1 de 1
Como percorrer por rampas sem deslizar o Rigdbody?
Procurei muito por isso mas não achei tutoriais em Português, oque eu gostaria de saber é como Subir e descer rampas, inclinações em 2d sem deslizar ou agarrar para subir, no estilo classico de qualquer jogo de plataforma, estou com um projeto em desenvolvimento e empaquei nessa parte, não tenho ideia do que fazer. Desde ja agradeço qualquer ajuda!
LucasRangel- Membro
- PONTOS : 2736
REPUTAÇÃO : 10
Respeito as regras :
Re: Como percorrer por rampas sem deslizar o Rigdbody?
LucasRangel escreveu:Procurei muito por isso mas não achei tutoriais em Português, oque eu gostaria de saber é como Subir e descer rampas, inclinações em 2d sem deslizar ou agarrar para subir, no estilo classico de qualquer jogo de plataforma, estou com um projeto em desenvolvimento e empaquei nessa parte, não tenho ideia do que fazer. Desde ja agradeço qualquer ajuda!
Como você está fazendo a movimentação do seu personagem? (O código de movimento dele).
Se você estiver usando Ribidbody2D.velocity, isto já deveria acontecer automaticamente
Re: Como percorrer por rampas sem deslizar o Rigdbody?
Que estranho, estou usando o Ribidbody2D.velocity mesmo, estou passando esse valor pelo FixedUpdate, e usando um CapsuleCollider, mas acho estranho que sempre em uma inclinação fica muito ruim pra subir meio que agarando e pra descer escorrega, nao da por exemplo para parar no meio da rampa, algo muito comum em qualquer jogo de plataforma 2D, se tiver alguma sugestão agradeço demais !MarcosSchultz escreveu:LucasRangel escreveu:Procurei muito por isso mas não achei tutoriais em Português, oque eu gostaria de saber é como Subir e descer rampas, inclinações em 2d sem deslizar ou agarrar para subir, no estilo classico de qualquer jogo de plataforma, estou com um projeto em desenvolvimento e empaquei nessa parte, não tenho ideia do que fazer. Desde ja agradeço qualquer ajuda!
Como você está fazendo a movimentação do seu personagem? (O código de movimento dele).
Se você estiver usando Ribidbody2D.velocity, isto já deveria acontecer automaticamente
LucasRangel- Membro
- PONTOS : 2736
REPUTAÇÃO : 10
Respeito as regras :
Re: Como percorrer por rampas sem deslizar o Rigdbody?
LucasRangel escreveu:Que estranho, estou usando o Ribidbody2D.velocity mesmo, estou passando esse valor pelo FixedUpdate, e usando um CapsuleCollider, mas acho estranho que sempre em uma inclinação fica muito ruim pra subir meio que agarando e pra descer escorrega, nao da por exemplo para parar no meio da rampa, algo muito comum em qualquer jogo de plataforma 2D, se tiver alguma sugestão agradeço demais !MarcosSchultz escreveu:LucasRangel escreveu:Procurei muito por isso mas não achei tutoriais em Português, oque eu gostaria de saber é como Subir e descer rampas, inclinações em 2d sem deslizar ou agarrar para subir, no estilo classico de qualquer jogo de plataforma, estou com um projeto em desenvolvimento e empaquei nessa parte, não tenho ideia do que fazer. Desde ja agradeço qualquer ajuda!
Como você está fazendo a movimentação do seu personagem? (O código de movimento dele).
Se você estiver usando Ribidbody2D.velocity, isto já deveria acontecer automaticamente
Por favor, poste o código do seu player... Outra coisa, já tentou alterar o coeficiente de atrito do material? (PhysicMaterial)
Tenta criar um material com atrito maior. Outra coisa, dependendo do código que você tem, da pra fazer um sistema de 'freezePosition' quando não há inputs ou colisões em relação ao jogador.
Re: Como percorrer por rampas sem deslizar o Rigdbody?
{
public float h, v; //Variaveis que representam força horizontal(h), vertical(v)
public float Speed; //Velocidade de movimento
public Rigidbody 2D PlayerRigidBody; //Rigdbody do player
public Transform GroundCheck; //(Groundcheck)Corpo que detecta a colisão com o solo,
public bool Grounded; //Boleano que indica se o personagem esta colidindo com o solo
public LayerMask G; //layermask usada para definir oque o groundcheck deve colidir definindo oque é o chão
void FixedUpdate(){
Grounded = Physics2D.OverlapCircle (GroundCheck.position, 0.02f, G); // Criar um pequeno circulo de colisão no ponto determinado e armazenar em um boleano
PlayerRigidBody.velocity = new Vector2 (h * Speed, PlayerRigidBody.velocity.y); //Comando para Gerar velocidade Horizontal ao andar
}
void Update()
{
h = Input.GetAxis ("Horizontal"); //Criar uma alavanta de movimento no eixo horizontal e armazenar o valor em "h"
v = Input.GetAxisRaw ("Vertical"); //Criar uma alavanta de movimento no eixo vertical e armazenar o valor em "v"
}
}
Simplificando o script para ser específico, o sistema que eue estou usando é esse, uso um alavanca horizontal para gerar o movimento, e multiplico com a velocidade, e passo esse valor para o Rigdbody2D.velocity, também uso uma layermask para detectar quando estou em solo.
public float h, v; //Variaveis que representam força horizontal(h), vertical(v)
public float Speed; //Velocidade de movimento
public Rigidbody 2D PlayerRigidBody; //Rigdbody do player
public Transform GroundCheck; //(Groundcheck)Corpo que detecta a colisão com o solo,
public bool Grounded; //Boleano que indica se o personagem esta colidindo com o solo
public LayerMask G; //layermask usada para definir oque o groundcheck deve colidir definindo oque é o chão
void FixedUpdate(){
Grounded = Physics2D.OverlapCircle (GroundCheck.position, 0.02f, G); // Criar um pequeno circulo de colisão no ponto determinado e armazenar em um boleano
PlayerRigidBody.velocity = new Vector2 (h * Speed, PlayerRigidBody.velocity.y); //Comando para Gerar velocidade Horizontal ao andar
}
void Update()
{
h = Input.GetAxis ("Horizontal"); //Criar uma alavanta de movimento no eixo horizontal e armazenar o valor em "h"
v = Input.GetAxisRaw ("Vertical"); //Criar uma alavanta de movimento no eixo vertical e armazenar o valor em "v"
}
}
Simplificando o script para ser específico, o sistema que eue estou usando é esse, uso um alavanca horizontal para gerar o movimento, e multiplico com a velocidade, e passo esse valor para o Rigdbody2D.velocity, também uso uma layermask para detectar quando estou em solo.
LucasRangel- Membro
- PONTOS : 2736
REPUTAÇÃO : 10
Respeito as regras :
Re: Como percorrer por rampas sem deslizar o Rigdbody?
Não é o melhor código que eu já fiz, mas tenta ai:
Lembre-se de colocar o Player na layer 'IgnoreRaycast' e configurar o LayerMask
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(Rigidbody2D))][RequireComponent(typeof(CapsuleCollider2D))]
public class Move : MonoBehaviour {
public float _maxXSpeed = 5;
public float _maxYSpeed = 5;
public float _jumpForce = 10;
public Transform _groundCheck;
public float _groundCheckSize = 0.1125f;
public LayerMask _layerMask = -1;
//
bool _grounded;
Rigidbody2D _my_Rigidbody;
bool _jump, _jumpAssist;
void Start(){
_my_Rigidbody = GetComponent<Rigidbody2D> ();
_my_Rigidbody.constraints = RigidbodyConstraints2D.FreezeRotation;
_my_Rigidbody.mass = 80;
_my_Rigidbody.collisionDetectionMode = CollisionDetectionMode2D.Continuous;
_my_Rigidbody.interpolation = RigidbodyInterpolation2D.Extrapolate;
PhysicsMaterial2D tempPhysicMat2D = new PhysicsMaterial2D ();
tempPhysicMat2D.friction = 1;
tempPhysicMat2D.bounciness = 0;
this.transform.GetComponent<CapsuleCollider2D> ().sharedMaterial = tempPhysicMat2D;
_jump = _jumpAssist = false;
}
void FixedUpdate(){
//move
_my_Rigidbody.velocity += new Vector2 (Input.GetAxis ("Horizontal") * _maxXSpeed, 0);
_my_Rigidbody.velocity = new Vector2(Mathf.Clamp(_my_Rigidbody.velocity.x, -_maxXSpeed, _maxXSpeed), Mathf.Clamp(_my_Rigidbody.velocity.y, -_maxYSpeed, _maxYSpeed));
if (Mathf.Abs (Input.GetAxis ("Horizontal")) < 0.05f && Mathf.Abs (Input.GetAxis ("Vertical")) < 0.05f && !_jump && _grounded) {
_my_Rigidbody.gravityScale = 0;
_my_Rigidbody.velocity = Vector2.Lerp (_my_Rigidbody.velocity, Vector2.zero, Time.fixedDeltaTime * 3);
} else {
_my_Rigidbody.gravityScale = 1;
}
//jump
_grounded = Physics2D.OverlapCircle (_groundCheck.position, _groundCheckSize, _layerMask);
if (_jump && !_jumpAssist && _grounded) {
_jump = false;
}
}
void Update(){
if (_grounded && Input.GetKeyDown (KeyCode.Space)) {
_my_Rigidbody.AddForce ((Vector2.up * _jumpForce * 100), ForceMode2D.Impulse);
_jump = true;
_jumpAssist = true;
StartCoroutine ("TimerJump");
}
}
IEnumerator TimerJump(){
yield return new WaitForSeconds (0.4f);
_jumpAssist = false;
}
}
Lembre-se de colocar o Player na layer 'IgnoreRaycast' e configurar o LayerMask
Re: Como percorrer por rampas sem deslizar o Rigdbody?
MarcosSchultz escreveu:Não é o melhor código que eu já fiz, mas tenta ai:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(Rigidbody2D))][RequireComponent(typeof(CapsuleCollider2D))]
public class Move : MonoBehaviour {
public float _maxXSpeed = 5;
public float _maxYSpeed = 5;
public float _jumpForce = 10;
public Transform _groundCheck;
public float _groundCheckSize = 0.1125f;
public LayerMask _layerMask = -1;
//
bool _grounded;
Rigidbody2D _my_Rigidbody;
bool _jump, _jumpAssist;
void Start(){
_my_Rigidbody = GetComponent<Rigidbody2D> ();
_my_Rigidbody.constraints = RigidbodyConstraints2D.FreezeRotation;
_my_Rigidbody.mass = 80;
_my_Rigidbody.collisionDetectionMode = CollisionDetectionMode2D.Continuous;
_my_Rigidbody.interpolation = RigidbodyInterpolation2D.Extrapolate;
PhysicsMaterial2D tempPhysicMat2D = new PhysicsMaterial2D ();
tempPhysicMat2D.friction = 1;
tempPhysicMat2D.bounciness = 0;
this.transform.GetComponent<CapsuleCollider2D> ().sharedMaterial = tempPhysicMat2D;
_jump = _jumpAssist = false;
}
void FixedUpdate(){
//move
_my_Rigidbody.velocity += new Vector2 (Input.GetAxis ("Horizontal") * _maxXSpeed, 0);
_my_Rigidbody.velocity = new Vector2(Mathf.Clamp(_my_Rigidbody.velocity.x, -_maxXSpeed, _maxXSpeed), Mathf.Clamp(_my_Rigidbody.velocity.y, -_maxYSpeed, _maxYSpeed));
if (Mathf.Abs (Input.GetAxis ("Horizontal")) < 0.05f && Mathf.Abs (Input.GetAxis ("Vertical")) < 0.05f && !_jump && _grounded) {
_my_Rigidbody.gravityScale = 0;
_my_Rigidbody.velocity = Vector2.Lerp (_my_Rigidbody.velocity, Vector2.zero, Time.fixedDeltaTime * 3);
} else {
_my_Rigidbody.gravityScale = 1;
}
//jump
_grounded = Physics2D.OverlapCircle (_groundCheck.position, _groundCheckSize, _layerMask);
if (_jump && !_jumpAssist && _grounded) {
_jump = false;
}
}
void Update(){
if (_grounded && Input.GetKeyDown (KeyCode.Space)) {
_my_Rigidbody.AddForce ((Vector2.up * _jumpForce * 100), ForceMode2D.Impulse);
_jump = true;
_jumpAssist = true;
StartCoroutine ("TimerJump");
}
}
IEnumerator TimerJump(){
yield return new WaitForSeconds (0.4f);
_jumpAssist = false;
}
}
Lembre-se de colocar o Player na layer 'IgnoreRaycast' e configurar o LayerMask
Poxa cara, muito obrigado! me parece que vai funcionar sim, era isso que eu estava procurando, vou testar assim que der, de qualquer forma obrigado pela atenção !
LucasRangel- Membro
- PONTOS : 2736
REPUTAÇÃO : 10
Respeito as regras :
Tópicos semelhantes
» Gostaria de saber se já tem como colocar esse carro como mod no Spintires Mudrunners
» [RESOLVIDO] Deslizar nas paredes (3D)
» Deslizar personagem - Jogo plataforma 2D
» Unity - Deslizar Para Rotacionar o 'Personagem'
» Como que faço para rotacionar um objeto na posição do player como o cenario
» [RESOLVIDO] Deslizar nas paredes (3D)
» Deslizar personagem - Jogo plataforma 2D
» Unity - Deslizar Para Rotacionar o 'Personagem'
» Como que faço para rotacionar um objeto na posição do player como o cenario
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos