[RESOLVIDO] Detectar colisão usando if em C#?
+2
Phph09
MayLeone
6 participantes
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
[RESOLVIDO] Detectar colisão usando if em C#?
Estou desenvolvendo uma cidade no Unity, e diferente de muitos tutoriais que encontrei, eu quero fazer com que os carros se movimente pelas ruas por conta própria, sem apertar qualquer botão. Já consegui faze-lo acelerar, mas para faze-lo virar de uma rua para outra (rotacionar em Y) de uma forma natural não está funcionando, segue o script:
Ao passar o Script para o carro, eu informei que Rotacao1 ficaria (0,-180,0), no momento que o carro colidir com outro objeto, o carro iria rotacionar de sua rotação -90 para -180 aos poucos (já que eu usei Quaternion), mas essa void de colisão é executada somente uma vez, então o carro não rotaciona para -180, ele vai de -90 para -91 e pouco, e não continua rotacionando até -180. Tentei substituir essa void de colisão pela void Update () para ver se era isso mesmo, e assim que eu executei o carro rotacionou perfeitamente até o -180, mas é claro, não no momento certo que eu quero, que é no momento que o carro se colidir. É possível eu usar esse void Update () e em seguida colocar um if perguntando quando o carro se colidir, este então irá rotacionar? Algo mais ou menos assim:
Não sei se isso é possível dentro de um if e não sei como fazer, por isso escrevi uma condição em texto para que possam me ajudar como fazer esse if. Também se souberem outro método que seja melhor que esse de colisão eu agradeço muito.
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class rotacao : MonoBehaviour {
public Vector3 Rotacao1;
void OnTriggerEnter(Collider other)
{
transform.rotation = Quaternion.Lerp (transform.rotation, Quaternion.Euler (Rotacao1), Time.deltaTime);}
}
Ao passar o Script para o carro, eu informei que Rotacao1 ficaria (0,-180,0), no momento que o carro colidir com outro objeto, o carro iria rotacionar de sua rotação -90 para -180 aos poucos (já que eu usei Quaternion), mas essa void de colisão é executada somente uma vez, então o carro não rotaciona para -180, ele vai de -90 para -91 e pouco, e não continua rotacionando até -180. Tentei substituir essa void de colisão pela void Update () para ver se era isso mesmo, e assim que eu executei o carro rotacionou perfeitamente até o -180, mas é claro, não no momento certo que eu quero, que é no momento que o carro se colidir. É possível eu usar esse void Update () e em seguida colocar um if perguntando quando o carro se colidir, este então irá rotacionar? Algo mais ou menos assim:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class rotacao : MonoBehaviour {
public Vector3 Rotacao1;
void Update()
{
if("objeto colidir com outro"){
transform.rotation = Quaternion.Lerp (transform.rotation, Quaternion.Euler (Rotacao1), Time.deltaTime);}
}
}
Não sei se isso é possível dentro de um if e não sei como fazer, por isso escrevi uma condição em texto para que possam me ajudar como fazer esse if. Também se souberem outro método que seja melhor que esse de colisão eu agradeço muito.
Última edição por dstaroski em Qua Jul 11, 2018 2:14 pm, editado 1 vez(es) (Motivo da edição : Resolvido)
Lorena Martins- Iniciante
- PONTOS : 2765
REPUTAÇÃO : 1
Idade : 24
Áreas de atuação : Unity e programação
Respeito as regras :
Re: [RESOLVIDO] Detectar colisão usando if em C#?
Você pode criar um boolean e fazer com que quando colidir, ele fique ativado, dessa forma, dentro do Update você faz o carro rotacionar somente se o boolean for true, e quando ele chegar na rotação ideal, o boolean volta a ficar falso, assim:
- Código:
private bool rotCheck = false;
void OnTriggerEnter(Collider other){
if (!rotCheck)
rotCheck = true;
}
void Update(){
if (rotCheck)
transform.rotation = Quaternion.Lerp (transform.rotation, Quaternion.Euler (Rotacao1), Time.deltaTime);
if (transform.rotation == -180)
rotCheck = false;
}
Re: [RESOLVIDO] Detectar colisão usando if em C#?
já tentou usar OnTriggerStay()?
https://docs.unity3d.com/ScriptReference/MonoBehaviour.OnTriggerStay.html
No exemplo acima é pegado o eixo y (float) do transform.eulerAngles(Vector3) e comparado com outro float
https://docs.unity3d.com/ScriptReference/MonoBehaviour.OnTriggerStay.html
- Código:
if(transform.rotation == -180)
- Código:
if(transform.eulerAngles.y == -180)
No exemplo acima é pegado o eixo y (float) do transform.eulerAngles(Vector3) e comparado com outro float
Phph09- Profissional
- PONTOS : 3791
REPUTAÇÃO : 240
Idade : 19
Respeito as regras :
Re: [RESOLVIDO] Detectar colisão usando if em C#?
É, eu sei oq vc quer: não criar vários scripts para os filhos, só para ver se colidiu ou não.
https://docs.unity3d.com/ScriptReference/Physics.OverlapSphere.html
^ Veja este link da referência da Unity. É algo muito legal e útil para fazer isso..
https://docs.unity3d.com/ScriptReference/Physics.OverlapSphere.html
^ Veja este link da referência da Unity. É algo muito legal e útil para fazer isso..
NKKF- ProgramadorMaster
- PONTOS : 4820
REPUTAÇÃO : 574
Idade : 20
Áreas de atuação : Desenvolvedor na Unity, NodeJS, React, ReactJS, React Native, MongoDB e Firebase.
Respeito as regras :
Re: [RESOLVIDO] Detectar colisão usando if em C#?
Tem uns projetos Exemplos na unity sobre IA de Veiculos pronto acho que e Aqui
Na unity tem esse mecanismo
Na unity tem esse mecanismo
Re: [RESOLVIDO] Detectar colisão usando if em C#?
No OnTrigger vc faz ativar um boleano. Passando valor verdadeiro quando entrar no trigger. No Update vc deixa a execução da rotação com um IF(boleano for verdadeiro) então execute a rotação. Crie tb no Update um if(chegou no limite da rotação) então boleano recebe falso.
Tiago95- Avançado
- PONTOS : 2631
REPUTAÇÃO : 32
Respeito as regras :
Re: [RESOLVIDO] Detectar colisão usando if em C#?
No OnTrigger vc faz ativar um boleano. Passando valor verdadeiro quando entrar no trigger. No Update vc deixa a execução da rotação com um IF(boleano for verdadeiro) então execute a rotação. Crie tb no Update um if(chegou no limite da rotação) então boleano recebe falso OU crie um OnTriggerExit e nele vc coloca para o boleano receber falso.
Tiago95- Avançado
- PONTOS : 2631
REPUTAÇÃO : 32
Respeito as regras :
Re: [RESOLVIDO] Detectar colisão usando if em C#?
fiz o teste e OnTriggerStay funciona tranquilamente. Crie uma tag nova e coloque o cruzamento ou o local que vc quer que faça iniciar a rotação com essa tag nova.
- Código:
void OnTriggerStay(Collider other)
{
if (other.gameObject.tag.Equals ("cruzamento")) {
transform.rotation = Quaternion.Lerp (transform.rotation, Quaternion.Euler (Rotacao1), Time.deltaTime);
}
}
Tiago95- Avançado
- PONTOS : 2631
REPUTAÇÃO : 32
Respeito as regras :
Re: [RESOLVIDO] Detectar colisão usando if em C#?
e nao esqueça de colocar um colisor com IS Trigger no localTiago95 escreveu:fiz o teste e OnTriggerStay funciona tranquilamente. Crie uma tag nova e coloque o cruzamento ou o local que vc quer que faça iniciar a rotação com essa tag nova.
- Código:
void OnTriggerStay(Collider other)
{
if (other.gameObject.tag.Equals ("cruzamento")) {
transform.rotation = Quaternion.Lerp (transform.rotation, Quaternion.Euler (Rotacao1), Time.deltaTime);
}
}
Tiago95- Avançado
- PONTOS : 2631
REPUTAÇÃO : 32
Respeito as regras :
Re: [RESOLVIDO] Detectar colisão usando if em C#?
Tiago95 escreveu:fiz o teste e OnTriggerStay funciona tranquilamente. Crie uma tag nova e coloque o cruzamento ou o local que vc quer que faça iniciar a rotação com essa tag nova.
- Código:
void OnTriggerStay(Collider other)
{
if (other.gameObject.tag.Equals ("cruzamento")) {
transform.rotation = Quaternion.Lerp (transform.rotation, Quaternion.Euler (Rotacao1), Time.deltaTime);
}
}
Testei e funcionou, mas estava rotacionando o y para -160 e vi que é por causa do tempo, então multipliquei o Time.deltaTime por 2 e rotacionou até -180, valeu mesmo!
Também testei o seguinte Script que funcionou perfeitamente, valeu a todos! Me ajudaram muito
MayLeone escreveu:Você pode criar um boolean e fazer com que quando colidir, ele fique ativado, dessa forma, dentro do Update você faz o carro rotacionar somente se o boolean for true, e quando ele chegar na rotação ideal, o boolean volta a ficar falso, assim:
- Código:
private bool rotCheck = false;
void OnTriggerEnter(Collider other){
if (!rotCheck)
rotCheck = true;
}
void Update(){
if (rotCheck)
transform.rotation = Quaternion.Lerp (transform.rotation, Quaternion.Euler (Rotacao1), Time.deltaTime);
if (transform.rotation == -180)
rotCheck = false;
}
Lorena Martins- Iniciante
- PONTOS : 2765
REPUTAÇÃO : 1
Idade : 24
Áreas de atuação : Unity e programação
Respeito as regras :
Tópicos semelhantes
» [RESOLVIDO] OverlapBox detectar colisão
» Dúvida - como detectar uma colisão entre 2 OUTROS objetos
» Como detectar colisao com TAG sem ser por trigger
» [RESOLVIDO] Detectar distância de objetos
» [RESOLVIDO] Dúvida. Detectar colisões nas instâncias
» Dúvida - como detectar uma colisão entre 2 OUTROS objetos
» Como detectar colisao com TAG sem ser por trigger
» [RESOLVIDO] Detectar distância de objetos
» [RESOLVIDO] Dúvida. Detectar colisões nas instâncias
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos