Como usar uma coroutine para esperar um objeto se movimentar?
2 participantes
Página 1 de 1
Como usar uma coroutine para esperar um objeto se movimentar?
Olá pessoal, tenho uma dúvida/problema com IEnumerator no Unity. Eu tenho um script de movimento de objetos usando Vector3.MoveTowards(), usando uma variável booleana pra validar se ele chegou na posição final. Estou tentando criar uma coroutine que espere o objeto chegar na sua posição final, porém ele retorna no próximo frame.
Meu código:
Alguém sabe como me ajudar?
Meu código:
- Código:
public Vector3 stopPoint;
...
bool ValidatePosition()
{
if(transform.position == stopPoint)
return true;
else
return false;
}
IEnumerator WaitForStopPoint()
{
while(!ValidatePosition())
{
yield return null;
}
}
Alguém sabe como me ajudar?
enrisco- Iniciante
- PONTOS : 1664
REPUTAÇÃO : 0
Respeito as regras :
Re: Como usar uma coroutine para esperar um objeto se movimentar?
tente usar o IEnumerator para mover e esperar o retorno de parada
- Código:
IEnumerator MoveFromTo(Transform objectToMove, Vector3 a, Vector3 b, float speed)
{
float step = (speed / (a - b).magnitude) * Time.fixedDeltaTime;
float t = 0;
while (t <= 1.0f)
{
t += step; // Goes from 0 to 1, incrementing by step each time
objectToMove.position = Vector3.Lerp(a, b, t); // Move objectToMove closer to b
yield return new WaitForFixedUpdate(); // Leave the routine and return here in the next frame
}
objectToMove.position = b;
//STOP HERE
}
Weslley- Moderador
- PONTOS : 5729
REPUTAÇÃO : 744
Idade : 26
Áreas de atuação : Inversión, Desarrollo, Juegos e Web
Respeito as regras :
Re: Como usar uma coroutine para esperar um objeto se movimentar?
Weslley escreveu:tente usar o IEnumerator para mover e esperar o retorno de parada
- Código:
IEnumerator MoveFromTo(Transform objectToMove, Vector3 a, Vector3 b, float speed)
{
float step = (speed / (a - b).magnitude) * Time.fixedDeltaTime;
float t = 0;
while (t <= 1.0f)
{
t += step; // Goes from 0 to 1, incrementing by step each time
objectToMove.position = Vector3.Lerp(a, b, t); // Move objectToMove closer to b
yield return new WaitForFixedUpdate(); // Leave the routine and return here in the next frame
}
objectToMove.position = b;
//STOP HERE
}
Obrigado pela resposta rápida! Primeiro fiz do seu modo e depois adaptei, porém os dois tiveram o mesmo resultado: retornaram 1 segundo depois.
essa foi a forma que adaptei, estou usando Vector3.MoveTowards() por causa do tipo de movimentação do objeto.
- Código:
public IEnumerator MoveAndWait()
{
while (!ValidateStopPoint())
{
...
transform.position = Vector3.MoveTowards(transform.position, stopPoint, velocity * Time.deltaTime);
yield return null;
}
}
enrisco- Iniciante
- PONTOS : 1664
REPUTAÇÃO : 0
Respeito as regras :
Weslley- Moderador
- PONTOS : 5729
REPUTAÇÃO : 744
Idade : 26
Áreas de atuação : Inversión, Desarrollo, Juegos e Web
Respeito as regras :
Re: Como usar uma coroutine para esperar um objeto se movimentar?
Creio ter entendido errado o funcionamento das coroutines. Aparentemente o tempo de espera é apenas para o objeto que está anexado com o script, estava executando a partir de outro objeto, nessa lógica, quem estava esperando era o próprio objeto a ser movimentado, não o script que estava manipulando, criando um IEnumerator referenciando o script do objeto, usando yield return new WaitUntil() pra validar a booleana ValidatePosition() já funcionou muito bem. Muito obrigado pela ajuda!Weslley escreveu:Poste seu Código
IEnumerator criado no script que estava manipulando:
- Código:
IEnumerator WaitForObjectToStop(GameObject obj)
{
var move = obj.GetComponent<MoveObject>();
while (!move.ValidatePosition())
{
yield return null;
}
yield return new WaitUntil(() => move.ValidatePosition());
Debug.Log(move.ValidatePosition());
}
enrisco- Iniciante
- PONTOS : 1664
REPUTAÇÃO : 0
Respeito as regras :
Re: Como usar uma coroutine para esperar um objeto se movimentar?
enrisco escreveu:Creio ter entendido errado o funcionamento das coroutines. Aparentemente o tempo de espera é apenas para o objeto que está anexado com o script, estava executando a partir de outro objeto, nessa lógica, quem estava esperando era o próprio objeto a ser movimentado, não o script que estava manipulando, criando um IEnumerator referenciando o script do objeto, usando yield return new WaitUntil() pra validar a booleana ValidatePosition() já funcionou muito bem. Muito obrigado pela ajuda!Weslley escreveu:Poste seu Código
IEnumerator criado no script que estava manipulando:
- Código:
IEnumerator WaitForObjectToStop(GameObject obj)
{
var move = obj.GetComponent<MoveObject>();
while (!move.ValidatePosition())
{
yield return null;
}
yield return new WaitUntil(() => move.ValidatePosition());
Debug.Log(move.ValidatePosition());
}
Corrigindo o código acima, não precisa do while:
- Código:
IEnumerator WaitForObjectToStop(GameObject obj)
{
var move = obj.GetComponent<MoveObject>();
yield return new WaitUntil(() => move.ValidatePosition());
Debug.Log(move.ValidatePosition());
}
enrisco- Iniciante
- PONTOS : 1664
REPUTAÇÃO : 0
Respeito as regras :
Tópicos semelhantes
» Quiz 2D Unity - Como esperar segundos para ir pra próxima pergunta????
» [DÚVIDA] Script teleporte, como esperar determinados segundos para teleportar
» Como usar Vector3.Angles para detectar que algo está na frente de outro objeto?
» Como usar LOD Group para usar no Mass Place Trees
» Como faço para meu inimigo se movimentar da esquerda para direita estilo super mário?
» [DÚVIDA] Script teleporte, como esperar determinados segundos para teleportar
» Como usar Vector3.Angles para detectar que algo está na frente de outro objeto?
» Como usar LOD Group para usar no Mass Place Trees
» Como faço para meu inimigo se movimentar da esquerda para direita estilo super mário?
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos