暂无描述
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

Sequence.cs 2.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using UnityEngine;
  5. namespace Unity.VisualScripting
  6. {
  7. /// <summary>
  8. /// Executes the output ports in order.
  9. /// </summary>
  10. [UnitCategory("Control")]
  11. [UnitOrder(13)]
  12. public sealed class Sequence : Unit
  13. {
  14. [SerializeAs(nameof(outputCount))]
  15. private int _outputCount = 2;
  16. /// <summary>
  17. /// The entry point for the sequence.
  18. /// </summary>
  19. [DoNotSerialize]
  20. [PortLabelHidden]
  21. public ControlInput enter { get; private set; }
  22. [DoNotSerialize]
  23. [Inspectable, InspectorLabel("Steps"), UnitHeaderInspectable("Steps")]
  24. public int outputCount
  25. {
  26. get => _outputCount;
  27. set => _outputCount = Mathf.Clamp(value, 1, 10);
  28. }
  29. [DoNotSerialize]
  30. public ReadOnlyCollection<ControlOutput> multiOutputs { get; private set; }
  31. protected override void Definition()
  32. {
  33. enter = ControlInputCoroutine(nameof(enter), Enter, EnterCoroutine);
  34. var _multiOutputs = new List<ControlOutput>();
  35. multiOutputs = _multiOutputs.AsReadOnly();
  36. for (var i = 0; i < outputCount; i++)
  37. {
  38. var output = ControlOutput(i.ToString());
  39. Succession(enter, output);
  40. _multiOutputs.Add(output);
  41. }
  42. }
  43. private ControlOutput Enter(Flow flow)
  44. {
  45. var stack = flow.PreserveStack();
  46. foreach (var output in multiOutputs)
  47. {
  48. flow.Invoke(output);
  49. flow.RestoreStack(stack);
  50. }
  51. flow.DisposePreservedStack(stack);
  52. return null;
  53. }
  54. private IEnumerator EnterCoroutine(Flow flow)
  55. {
  56. var stack = flow.PreserveStack();
  57. foreach (var output in multiOutputs)
  58. {
  59. yield return output;
  60. flow.RestoreStack(stack);
  61. }
  62. flow.DisposePreservedStack(stack);
  63. }
  64. public void CopyFrom(Sequence source)
  65. {
  66. base.CopyFrom(source);
  67. outputCount = source.outputCount;
  68. }
  69. }
  70. }