Member 11391151 Ответов: 2

Сопрограммы с выходом новой waitforseconds(); перейти к исполнению других функций?


Я использую несколько сопрограмм следующим образом

Script1:

Считывает входные значения x,y,z и т. д.

передает значения x и there в script2 для выполнения одно за другим

Script2:

функция получает эти значения и проверяет для каждого, если это x с положительными значениями, она вызывает XPOS coroutine else, если y .....

затем эта сопрограмма перемещает объекты соответствующим образом, но когда она достигает yield return new WaitForSeconds(0.2 f); она возвращается к Script1 и начинает выполнение следующего шага, а затем возвращается и начинает выполнение после yield return new WaitForSeconds(0.2 f); . Если Script1 является finish, то сопрограммы переключаются друг с другом во время yield return new WaitForSeconds(0.2 f);

ниже приведены коды, которые я использую;

Код Script2: получение значений из Scipt1 и вызов сопрограммы для каждого из них
private  void ObjSupport_PositionArrived(string Coordinate, double Value)
   {
       Debug.Log("Cordinate" + Coordinate);
       Debug.Log("Value" + Value);

       float ivalue = (float)Value;
       switch (Coordinate)
       {
           case "X+":
               {
                   if (ivalue == 0)
                   {

                   }
                   else
                   {

                       StartCoroutine("FuncXPlus", ivalue);

                   }

               }
               break;
           case "X-":
               {
                   if (ivalue == 0)
                   {

                   }
                   else
                   {

                       StartCoroutine("FuncXMinus", ivalue);
                   }
               }
               break;

           case "Z+":
               {
                   if (ivalue == 0)
                   {

                   }
                   else
                   {

                       StartCoroutine("FuncZPlus", ivalue);



                   }
               }
               break;
           case "Z-":
               {
                   if (ivalue == 0)
                   {


                   }
                   else
                   {

                       StartCoroutine("FuncZMinus", ivalue);

                   }
               }
               break;

       }

После этого следуют функции сопрограммы
IEnumerator FuncZPlus(float ivalue)
   {
       Vector3 Beemposition = Beem.transform.localPosition;
       float BeemCurrentXpos = Beemposition.y;
       Beemposition.y = Mathf.Clamp(Beemposition.y + ivalue, 0.04f, 0.07f);
       while (BeemCurrentXpos <= Beemposition.y)
       {
           BeemCurrentXpos += 0.0001f;
           Vector3 posX = new Vector3(Beemposition.x, BeemCurrentXpos, Beemposition.z);
           Beem.transform.localPosition = posX;

           yield return new WaitForSeconds(0.2f);

       }

   }

   IEnumerator FuncZMinus(float ivalue)
   {
       Debug.Log("FunZMinus");
       Vector3 Beemposition = Beem.transform.localPosition;
       float BeemCurrentYpos = Beemposition.y;
       Beemposition.y = Mathf.Clamp(Beemposition.y + ivalue, 0.04f, 0.07f);
       while (BeemCurrentYpos >= Beemposition.y)
       {
           BeemCurrentYpos -= 0.0001f;
           Vector3 posX = new Vector3(Beemposition.x, BeemCurrentYpos,Beemposition.z);
           Beem.transform.localPosition = posX;

           yield return new WaitForSeconds(0.2f);

       }

   }
   IEnumerator FuncXPlus(float ivalue)
   {
       Debug.Log("FunXplus");
       Vector3 positionX = HeadRight.transform.localPosition;
       float CurrentXpos = positionX.x;
       positionX.x = Mathf.Clamp(positionX.x + ivalue, -0.02f, -0.002f);
       HeadRight.transform.localPosition = positionX;



       while (CurrentXpos <= positionX.x)
       {
           CurrentXpos += 0.0001f;
           Vector3 posX = new Vector3(CurrentXpos, positionX.y, positionX.z);
           HeadRight.transform.localPosition = posX;

           yield return new WaitForSeconds(0.2f);

       }

   }


   IEnumerator FuncXMinus(float ivalue)
   {
       Debug.Log("FunXminus");
       Vector3 xposition = HeadRight.transform.localPosition;
       float CurrentXpos = xposition.x;
       xposition.x = Mathf.Clamp(xposition.x - ivalue, -0.02f, 0f);
     while (CurrentXpos <= xposition.x)
       {
           Debug.Log("X-While");
           CurrentXpos -= 0.0001f;
           Vector3 posX = new Vector3(CurrentXpos, xposition.y, xposition.z);
           HeadRight.transform.localPosition = posX;

           yield return new WaitForSeconds(0.2f);

       }

   }


Что я уже пробовал:

Коды, которые я дал, - это то, что я пробовал

2 Ответов

Рейтинг:
1

George Swan

Я не уверен, что именно вы пытаетесь сделать, но мне кажется, что switch утверждение можно упростить. Вы это проверяете ivalue это не ноль в каждом случае. Почему бы не проверить для ivalue==0 всего один раз на первой строке метода и return если это так?

Ваш coroutine функции возвращают IEnumerator, я бы предпочел вернуть Ан IEnumerable<float> затем вы можете перебирать коллекцию с помощью простого foreach заявление.

Вызов метода StartCoroutine(“FuncXPlus”, ivalue) похоже, что он собирается найти функцию и передать ее ivalue к нему. Один switch оператор, использующий формат, введенный в C#8, может значительно упростить дело и дать вам ту же функциональность в нескольких строках кода - что-то вроде этого.


private static IEnumerable<float> SwitchCoordinateFunction(string coordinate, float value)
 {
     if (value == 0) return null;
     return coordinate switch
     {
         "X+" => FuncXPlus(value),
         "X-" => FuncXMinus(value),
         "Z+" => FuncZPlus(value),
         "Z-" => FuncXMinus(value),
         _ => null,
     };
 }
 //example useage
    string coordinate = "X+";
     float value = 2;
     var functionResults = SwitchCoordinateFunction(coordinate, value);
     if (functionResults == null) return;

     foreach (float result in functionResults)
     {
         Console.Write($"{result}, ");
     }


Рейтинг:
0

Member 11391151

В моем коде все идет нормально, но во время

yield return new WaitForSeconds(0.2f);

выполняются и другие коды .А я этого не хочу.


Richard Deeming

Если вы хотите ответить на решение, нажмите кнопку "есть вопрос или комментарий?" нажмите кнопку под этим решением и оставьте комментарий.

Не опубликуйте свой комментарий как новое "решение".