Problemas com a colisão do unity
4 participantes
Página 1 de 1
Problemas com a colisão do unity
Olá pessoal!!!
Sou novo aqui e estou com um problema.
Eu estou criando um jogo 2d na unity e estou com um problema com a colisão. No meu jogo tem um helicóptero e ele possui rigidbody2D e boxcollider2D, mas por algm motivo ele atravessa as paredes(q tbm possuem boxcollider2D). Invés do helicóptero parar quando encosta na parede, ele entra dentro da parede e depois ele é "cuspido" por ela.
Vi em vários lugares dizendo que é para ir no rigidbody2D e colocar o collision detection em continuous e o interpolate como extrapolete, mas eu fiz isso e não foi.
Sou novo aqui e estou com um problema.
Eu estou criando um jogo 2d na unity e estou com um problema com a colisão. No meu jogo tem um helicóptero e ele possui rigidbody2D e boxcollider2D, mas por algm motivo ele atravessa as paredes(q tbm possuem boxcollider2D). Invés do helicóptero parar quando encosta na parede, ele entra dentro da parede e depois ele é "cuspido" por ela.
Vi em vários lugares dizendo que é para ir no rigidbody2D e colocar o collision detection em continuous e o interpolate como extrapolete, mas eu fiz isso e não foi.
Nii- Iniciante
- PONTOS : 1262
REPUTAÇÃO : 3
Respeito as regras :
Re: Problemas com a colisão do unity
Como você está fazendo para mover o seu helicóptero?? Por acaso está usando transform.position ou algo desse tipo?
Re: Problemas com a colisão do unity
Sim, eu estou usando o transform.position.MarcosSchultz escreveu:Como você está fazendo para mover o seu helicóptero?? Por acaso está usando transform.position ou algo desse tipo?
Aqui está o código:
- Código:
////Rotacionar a hélice
h.transform.Rotate(0,0,50);
//Rotacionar o helicóptero
int RotSpd = 200;//Velocidade do rotacionamento
Vector3 mousePos = Input.mousePosition - Camera.main.WorldToScreenPoint(transform.position);//Pegar posição do mouse
Quaternion targetRotation = Quaternion.LookRotation(transform.position - mousePos, Vector3.forward);//Cria o âgulo
transform.rotation = Quaternion.RotateTowards(transform.rotation, targetRotation, Time.deltaTime * RotSpd);//Rotaciona o obj a partir do ângulo criado
transform.rotation = Quaternion.Euler(0, 0, transform.rotation.eulerAngles.z);//Arrumar os ângulos
//Movimentação do helicóptero
float MovX = Input.GetAxis("Horizontal");
float MovY = Input.GetAxis("Vertical");
transform.position += new Vector3(MovX, MovY, 0) * speed * Time.deltaTime;
//Atirar
if (Input.GetMouseButton(0))
{
foreach (GameObject objet in gun)
{
objet.GetComponent<Gun>().Fire();
}
}
Nii- Iniciante
- PONTOS : 1262
REPUTAÇÃO : 3
Respeito as regras :
Re: Problemas com a colisão do unity
Se você quer movimentar usando o transform, você precisa fazer sua própria forma de checar colisão.
Mexer o transform e depender da física da Unity não dá certo pois além de cada coisa ser executada em tempo diferente
leia aqui https://docs.unity3d.com/Manual/ExecutionOrder.html . O transform ignora completamente a física.
Se quer usar a física pra colisão, você deve mover o objeto acessando o rigidbody e usando o AddForce();
Se quer continuar usando a movimentação com transform, use raycasts na direção que está se movendo e se detectar um hit, não deixe se mover.
Mexer o transform e depender da física da Unity não dá certo pois além de cada coisa ser executada em tempo diferente
leia aqui https://docs.unity3d.com/Manual/ExecutionOrder.html . O transform ignora completamente a física.
Se quer usar a física pra colisão, você deve mover o objeto acessando o rigidbody e usando o AddForce();
Se quer continuar usando a movimentação com transform, use raycasts na direção que está se movendo e se detectar um hit, não deixe se mover.
Fagner- Moderador
- PONTOS : 4443
REPUTAÇÃO : 667
Áreas de atuação : Modelagem 3D, Programação.
Respeito as regras :
Re: Problemas com a colisão do unity
Muuuuito obrigado!!! Fiquei quebrando a cabeça para corrigir esse problema e finalmente consegui. Eu não usei o addforce, mas , por causa da sua resposta de usar o ridibody para movimentar, eu decidi procurar se tem outra forma de movimentar pelo rigidbody e achei o MovePosition.Fagner escreveu:Se você quer movimentar usando o transform, você precisa fazer sua própria forma de checar colisão.
Mexer o transform e depender da física da Unity não dá certo pois além de cada coisa ser executada em tempo diferente
leia aqui https://docs.unity3d.com/Manual/ExecutionOrder.html . O transform ignora completamente a física.
Se quer usar a física pra colisão, você deve mover o objeto acessando o rigidbody e usando o AddForce();
Se quer continuar usando a movimentação com transform, use raycasts na direção que está se movendo e se detectar um hit, não deixe se mover.
Para resolver o problema no lugar do
- Código:
transform.position += new Vector3(MovX, MovY, 0) * speed * Time.deltaTime;
Eu coloquei
- Código:
rb2d.MovePosition(transform.position + transform.right * speed * verticalMov * Time.deltaTime);
E agora estou
Nii- Iniciante
- PONTOS : 1262
REPUTAÇÃO : 3
Respeito as regras :
Re: Problemas com a colisão do unity
Como eu poderia modificar o meu código a seguir para que o mesmo problema de atravessar os colliders possa ser resolvido?
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class player : MonoBehaviour {
private bool isMoving;
private Vector3 origPos, targetPos;
private float timeToMove = 0.2f;
void Start () {
}
void Update ()
{
if (Input.GetKey(KeyCode.W) && !isMoving)
StartCoroutine(MovePlayer(Vector3.up));
if (Input.GetKey(KeyCode.A) && !isMoving)
StartCoroutine(MovePlayer(Vector3.left));
if (Input.GetKey(KeyCode.S) && !isMoving)
StartCoroutine(MovePlayer(Vector3.down));
if (Input.GetKey(KeyCode.D) && !isMoving)
StartCoroutine(MovePlayer(Vector3.right));
}
private IEnumerator MovePlayer(Vector3 direction)
{
isMoving = true;
float elapsedTime = 0;
origPos = transform.position;
targetPos = origPos + direction;
while(elapsedTime < timeToMove)
{
transform.position = Vector3.Lerp(origPos,targetPos, (elapsedTime / timeToMove));
elapsedTime += Time.deltaTime;
yield return null;
}
transform.position = targetPos;
isMoving = false;
}
}
Shiimo- Iniciante
- PONTOS : 1248
REPUTAÇÃO : 2
Respeito as regras :
Re: Problemas com a colisão do unity
No lugar do:Shiimo escreveu:Como eu poderia modificar o meu código a seguir para que o mesmo problema de atravessar os colliders possa ser resolvido?
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class player : MonoBehaviour {
private bool isMoving;
private Vector3 origPos, targetPos;
private float timeToMove = 0.2f;
void Start () {
}
void Update ()
{
if (Input.GetKey(KeyCode.W) && !isMoving)
StartCoroutine(MovePlayer(Vector3.up));
if (Input.GetKey(KeyCode.A) && !isMoving)
StartCoroutine(MovePlayer(Vector3.left));
if (Input.GetKey(KeyCode.S) && !isMoving)
StartCoroutine(MovePlayer(Vector3.down));
if (Input.GetKey(KeyCode.D) && !isMoving)
StartCoroutine(MovePlayer(Vector3.right));
}
private IEnumerator MovePlayer(Vector3 direction)
{
isMoving = true;
float elapsedTime = 0;
origPos = transform.position;
targetPos = origPos + direction;
while(elapsedTime < timeToMove)
{
transform.position = Vector3.Lerp(origPos,targetPos, (elapsedTime / timeToMove));
elapsedTime += Time.deltaTime;
yield return null;
}
transform.position = targetPos;
isMoving = false;
}
}
- Código:
if (Input.GetKey(KeyCode.W) && !isMoving)
StartCoroutine(MovePlayer(Vector3.up));
if (Input.GetKey(KeyCode.A) && !isMoving)
StartCoroutine(MovePlayer(Vector3.left));
if (Input.GetKey(KeyCode.S) && !isMoving)
StartCoroutine(MovePlayer(Vector3.down));
if (Input.GetKey(KeyCode.D) && !isMoving)
StartCoroutine(MovePlayer(Vector3.right));
}
coloque esse:
- Código:
float MovX = Input.GetAxis("Horizontal");
float MovY = Input.GetAxis("Vertical");
transform.position += new Vector3(MovX, MovY, 0) * speed * Time.deltaTime;
Nii- Iniciante
- PONTOS : 1262
REPUTAÇÃO : 3
Respeito as regras :
Re: Problemas com a colisão do unity
- Código:
float MovX = Input.GetAxis("Horizontal");
float MovY = Input.GetAxis("Vertical");
transform.position += new Vector3(MovX, MovY, 0) * speed * Time.deltaTime;
Nii- Iniciante
- PONTOS : 1262
REPUTAÇÃO : 3
Respeito as regras :
Re: Problemas com a colisão do unity
Que bom que deu tudo certo, só uma dica, quando quiser colar um código, utilize o atalho Ctrl+Shift+V, assim você cola o texto sem formatação e não fica essas tags de tamanho e outras coisas que dão erro se jogar direto na Unity, funciona no chrome pelo menos.Nii escreveu:Muuuuito obrigado!!! Fiquei quebrando a cabeça para corrigir esse problema e finalmente consegui. Eu não usei o addforce, mas , por causa da sua resposta de usar o ridibody para movimentar, eu decidi procurar se tem outra forma de movimentar pelo rigidbody e achei o MovePosition.
Para resolver o problema no lugar do
- Código:
transform.position += new Vector3(MovX, MovY, 0) * speed * Time.deltaTime;
Eu coloquei
- Código:
rb2d.MovePosition(transform.position + transform.right * speed * verticalMov * Time.deltaTime);
E agora estou
Fagner- Moderador
- PONTOS : 4443
REPUTAÇÃO : 667
Áreas de atuação : Modelagem 3D, Programação.
Respeito as regras :
Tópicos semelhantes
» Problemas na detecção de colisão
» Problemas com o Unity
» Problemas com cor na unity
» Unity colisao nao funciona
» [ajuda]problemas com unity
» Problemas com o Unity
» Problemas com cor na unity
» Unity colisao nao funciona
» [ajuda]problemas com unity
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos