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 : 1476
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 : 5541
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 : 1476
REPUTAÇÃO : 0
Respeito as regras :
Weslley- Moderador
- PONTOS : 5541
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 : 1476
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 : 1476
REPUTAÇÃO : 0
Respeito as regras :
Tópicos semelhantes
» [RESOLVIDO] Como movimentar um objeto de um lado para o outro
» Quero setar uma variavel de um objeto para outros objetos , mas o objeto esta dentro de uma array desse objeto
» Coroutine & IEnumerator. O que são?
» [Resolvido] Coroutine
» Coroutine ou Invoke - qual tem melhor desempenho
» Quero setar uma variavel de um objeto para outros objetos , mas o objeto esta dentro de uma array desse objeto
» Coroutine & IEnumerator. O que são?
» [Resolvido] Coroutine
» Coroutine ou Invoke - qual tem melhor desempenho
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos