Selector

The Selector node is similar to an “or” operation. It will return success as soon as one of its ‘flow’ return success. If a ‘flow’ returns failure then it will sequentially run the next ‘flow’. If no ‘flow’ returns success then it will return failure.

More Information:

  • This node can only be created from “StateFlow” Graph.
  • This node is using Coroutine.

 

Examples

In this example, the Selector node is called at start. It then call flow from up to bottom.

Program:

  • variable : ‘value’ = “b”
  • Validation 1 : compare variable ‘value’ if value is “a”
  • Validation 2 : compare variable ‘value’ if value is “b”
  • Validation 3 : compare variable ‘value’ if value is “c”
  • Action 4 : log an message “value is a”
  • Action 5 : log an message “value is b”
  • Action 6 : log an message “value is c”

The Selector will never reach ‘Validation 3’ because the ‘Validation 2’ state is success and Selector will stop.

In this examples i use validation node because its more readable and more organized for high level logic.

Flow Graph:

Generated Script:

using UnityEngine;
using System.Collections.Generic;

public class Program : MonoBehaviour {
  public string variable0 = "b";
  public EventCoroutine coroutine1;

  void Start() {
    coroutine1.Run();
  }

  bool ActivateEvent(string name) {
    switch(name) {
      case "Validation_1": {
        if(variable0 == "a") {
          ActivateEvent("Action_4");
        }
      }
      break;
      case "Action_4": {
        Debug.Log("value is a");
      }
      break;
      case "Validation_2": {
        if(variable0 == "b") {
          ActivateEvent("Action_5");
        }
      }
      break;
      case "Action_5": {
        Debug.Log("value is b");
      }
      break;
      case "Validation_3": {
        if(variable0 == "c") {
          ActivateEvent("Action_6");
        }
      }
      break;
      case "Action_6": {
        Debug.Log("value is c");
      }
      break;
    }
    return true;
  }

  System.Collections.IEnumerable ActivateCoroutineEvent(string name) {
    switch(name) {
      case "Selector_0": {
        if(ActivateEvent("Validation_1")) {
          yield return "Success";
        }
        if(ActivateEvent("Validation_2")) {
          yield return "Success";
        }
        if(ActivateEvent("Validation_3")) {
          yield return "Success";
        }
        yield return "Failure";
      }
      break;
    }
    yield break;
  }

  void Awake() {
    coroutine1 = new EventCoroutine(this, ActivateCoroutineEvent("Selector_0"));
  }
}

Output:

value is b
Was this helpful to you?