Скрипт Simple Coroutine Animation нарушает единство - PullRequest
0 голосов
/ 11 июля 2020

Хорошо, я использую сопрограмму, чтобы подождать 6 секунд перед выполнением метода для изменения плавающего объекта в аниматоре, действительно простой материал. Моя проблема в том, что что-то в этом скрипте приводит к полной блокировке моего редактора единства, когда я помещаю его в игровой объект, и я не знаю почему. Я не думаю, что у меня есть бесконечные циклы, но я не уверен. У кого-нибудь есть идеи? спасибо заранее.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class handanimatordock : MonoBehaviour
{

    public Animator hand;
    private float Blendfloat;
    bool ChangeHand = false;
    private float timefloat = 0.0f;
    // Start is called before the first frame update
    void Start()
    {
        StartCoroutine(waiter());
    }

    // Update is called once per frame
    void Update()
    {
        
    }

    public void changeHands()
    {

        if (ChangeHand == false)
        {
            ChangeHand = true;

            while (Blendfloat != 1.0f)
            {
                Blendfloat = Blendfloat + 0.01f;
                hand.SetFloat("Blend", Blendfloat);
            }

        }
        else
        {

            ChangeHand = false;

            while (Blendfloat != 0.0f)
            {
                Blendfloat = Blendfloat - 0.01f;
                hand.SetFloat("Blend", Blendfloat);
            }

        }

    }


    IEnumerator waiter()
    {
        

        //Wait for 4 seconds
        yield return new WaitForSeconds(6);
        changeHands();
        StartCoroutine(waiter());
    }


}

1 Ответ

1 голос
/ 11 июля 2020

Вероятно, у вас бесконечное l oop in

while (Blendfloat != 1.0f)
{
    Blendfloat = Blendfloat + 0.01f;
    hand.SetFloat("Blend", Blendfloat);
}

Никогда напрямую сравнивайте два float значений, используя == или !=.

Из-за впечатления с плавающей запятой значение типа

10f * 0.1f  

может оказаться 1.000000001 или 0.99999999, хотя логически вы ожидаете именно 1. Так что ваше условие, вероятно, никогда не будет ложным!

Обычно вы предпочитаете давать ему определенный диапазон, например,

while(Mathf.Abs(Blendfloat - 1) > certainThreshold)

Unity имеет для этого Mathf.Approximately

while(!Mathf.Approximately(Blendfloat, 1f)

, что в основном соответствует пороговому значению Mathf.Epsilon

which(Math.Abs(Blendfloat - 1) > Mathf.Epsilon)

Обратите внимание, что в любом случае то, что у вас есть прямо сейчас, будет выполнять все l oop в одном кадре .

Если вы действительно хотите, чтобы он исчезал со временем, вам нужно сделать один итерация на кадр, например, в Coroutine!

...