Я не совсем доволен полученными ответами.
В основном вопрос заключался в том, как использовать WaitUntil
, который даже не использовался принятым ответом (который, кстати, предоставлял действительно беспорядочный код ..)
Причина, по которой другой все еще может быть расширен, состоит в том, что оба ответа основаны на использовании ==
для проверки равенства. Для Vector3
однако это просто предполагает, что
Vector3.Distance(vectorA, vectorB) <= 0.00001f
Это обычно отлично подходит для расстояний между позициями, но для шкал вам могут потребоваться более точные значения.
Если это цель, и вам не нужно, чтобы она была более точной, чем придерживаться ее.
В противном случае я бы сделал проверку, используя Mathf.Approximately
например. как метод расширения как
public static class Vector3Extensio s
{
public static bool IsSameValue(this Vector3 a, Vector3 b)
{
return Mathf.Approximately(Vector3.Distance(a,b), 0f);
}
}
А чем пользуетесь
yield return new WaitUntil(() => scaling.objectToScale.transform.localScale.IsSameValue(scaling.maxSize));
Конечно, это во многом зависит от того, как работает op.Scaling
, который вы не показываете.
В качестве альтернативы: (и я бы предпочел это)
К сожалению, вы не показали, что делает op.Scaling()
. Самым простым способом на самом деле было бы сделать его IEnumerator
, так как вы можете просто yield return
другой IEnumerator
, который заставит его выполнить и автоматически ждать, пока он не закончится только в одной строке.
Допустим, вы делаете op.Scaling
что-то вроде, например,
public IEnumerator Scaling(Vector3 targetScale, float duration)
{
// Get current scale
var startScale = transform.localScale;
var timePassed = 0f;
do
{
transform.localScale = Vector3.Lerp(startScale, targetScale, timePassed / duration);
timePassed += Time.deltaTime;
yield return null;
} while(timePassed <= duration);
transform.localScale = targetScale;
}
Вы могли бы просто сделать
public IEnumerator NaviScaling()
{
// Scale up in 1 second and wait
yield return op.Scaling(scaling.maxSize, 1f);
// As you can see again this could be a Coroutine so you could directly yield it
// instead of having to wait for the bool value to turn true
conversationTrigger.PlayConversations();
yield return new WaitUntil(() => conversationTrigger.conversationEnd);
// Scale down in 1 second and wait
yield return op.Scaling(scaling.minSize, 1f);
}