Search Unity

  1. Welcome to the Unity Forums! Please take the time to read our Code of Conduct to familiarize yourself with the forum rules and how to post constructively.
  2. Dismiss Notice

Question Combining UniTask.WhenAll and UniTask.WhenAny

Discussion in 'Scripting' started by zehreken, May 30, 2021.

  1. zehreken

    zehreken

    Joined:
    Jun 29, 2009
    Posts:
    112
    I recently adopted async/await and currently using Cysharp happily. One thing I couldn't wrap my head around is combining UniTask.WhenAll and UniTask.WhenAny. I'm trying to create a panel where the player just enters a name and presses enter or clicks continue. I want to make sure that the name is at least one character long. Here are two of my unsuccessful attempts,
    1
    Code (CSharp):
    1. public override async UniTask<IResult> Push(string name)
    2.     {
    3.         await base.Push();
    4.  
    5.         _nameInputField.text = name;
    6.         _nameInputField.ActivateInputField();
    7.      
    8.         var nameLengthTask = UniTask.WaitWhile(() => _nameInputField.text.Length == 0);
    9.         var continueButtonTask = _continueButton.OnClickAsync();
    10.         var c1 = UniTask.WhenAll(nameLengthTask, continueButtonTask);
    11.         var enterKeyTask = WaitForKeyDown(KeyCode.Return);
    12.         var c2 = UniTask.WhenAll(nameLengthTask, enterKeyTask);
    13.  
    14.         await UniTask.WhenAny(c1, c2);
    15.  
    16.         await Pop();
    17.         IResult r = new StringResult(_nameInputField.text);
    18.  
    19.         return r;
    20.     }
    2
    Code (CSharp):
    1. public override async UniTask<IResult> Push(string name)
    2.     {
    3.         await base.Push();
    4.  
    5.         _nameInputField.text = name;
    6.         _nameInputField.ActivateInputField();
    7.      
    8.         var nameLengthTask = UniTask.WaitUntil(() => _nameInputField.text.Length > 0);
    9.         var continueButtonTask = _continueButton.OnClickAsync();
    10.         var enterKeyTask = WaitForKeyDown(KeyCode.Return);
    11.         var combined = UniTask.WhenAny(continueButtonTask, enterKeyTask);
    12.  
    13.         await UniTask.WhenAll(nameLengthTask, combined);
    14.  
    15.         await Pop();
    16.         IResult r = new StringResult(_nameInputField.text);
    17.  
    18.         return r;
    19.     }
     
    Last edited: May 30, 2021
  2. Kurt-Dekker

    Kurt-Dekker

    Joined:
    Mar 16, 2013
    Posts:
    36,756
    I dunno what any of that jibba-jabba above is, but usually I just keep the ACCEPT button grayed out until the text has at least one character. I try to spend as little time as possible with user input validation code, but I'm funny that way.
     
  3. zehreken

    zehreken

    Joined:
    Jun 29, 2009
    Posts:
    112
    Here is a working example for the person who will find this post in the next 5 years.
    Code (CSharp):
    1. public override async UniTask<IResult> Push(string name)
    2.     {
    3.         await base.Push();
    4.  
    5.         _nameInputField.text = name;
    6.         _nameInputField.ActivateInputField();
    7.  
    8.         var isNameEntered = false;
    9.         while (!isNameEntered)
    10.         {
    11.             isNameEntered = await WaitForName();
    12.         }
    13.  
    14.         await Pop();
    15.         IResult r = new StringResult(_nameInputField.text);
    16.  
    17.         return r;
    18.     }
    19.  
    20.     private async UniTask<bool> WaitForName()
    21.     {
    22.         var cts = new CancellationTokenSource();
    23.         var continueButtonTask = _continueButton.OnClickAsync(cts.Token);
    24.         var enterKeyTask = WaitForKeyDown(KeyCode.Return);
    25.         await UniTask.WhenAny(continueButtonTask, enterKeyTask);
    26.         cts.Cancel();
    27.         cts.Dispose();
    28.         if (_nameInputField.text.Length != 0)
    29.         {
    30.             return true;
    31.         }
    32.  
    33.         return false;
    34.     }
     
    ontrigger, tomosbach and enes-ozdemir like this.
  4. tomosbach

    tomosbach

    Joined:
    Feb 25, 2021
    Posts:
    7
    try 13 years later <3
     
  5. j1mmie

    j1mmie

    Joined:
    Oct 31, 2013
    Posts:
    26
    May 31 2021 to Nov 15 2022 is 13 years, maybe on planet Gargantua
     
    danyalmazloum likes this.