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

ControlInput.cs 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. namespace Unity.VisualScripting
  6. {
  7. public sealed class ControlInput : UnitPort<ControlOutput, IUnitOutputPort, ControlConnection>, IUnitControlPort, IUnitInputPort
  8. {
  9. public ControlInput(string key, Func<Flow, ControlOutput> action) : base(key)
  10. {
  11. Ensure.That(nameof(action)).IsNotNull(action);
  12. this.action = action;
  13. }
  14. public ControlInput(string key, Func<Flow, IEnumerator> coroutineAction) : base(key)
  15. {
  16. Ensure.That(nameof(coroutineAction)).IsNotNull(coroutineAction);
  17. this.coroutineAction = coroutineAction;
  18. }
  19. public ControlInput(string key, Func<Flow, ControlOutput> action, Func<Flow, IEnumerator> coroutineAction) : base(key)
  20. {
  21. Ensure.That(nameof(action)).IsNotNull(action);
  22. Ensure.That(nameof(coroutineAction)).IsNotNull(coroutineAction);
  23. this.action = action;
  24. this.coroutineAction = coroutineAction;
  25. }
  26. public bool supportsCoroutine => coroutineAction != null;
  27. public bool requiresCoroutine => action == null;
  28. internal readonly Func<Flow, ControlOutput> action;
  29. internal readonly Func<Flow, IEnumerator> coroutineAction;
  30. public override IEnumerable<ControlConnection> validConnections => unit?.graph?.controlConnections.WithDestination(this) ?? Enumerable.Empty<ControlConnection>();
  31. public override IEnumerable<InvalidConnection> invalidConnections => unit?.graph?.invalidConnections.WithDestination(this) ?? Enumerable.Empty<InvalidConnection>();
  32. public override IEnumerable<ControlOutput> validConnectedPorts => validConnections.Select(c => c.source);
  33. public override IEnumerable<IUnitOutputPort> invalidConnectedPorts => invalidConnections.Select(c => c.source);
  34. public bool isPredictable
  35. {
  36. get
  37. {
  38. using (var recursion = Recursion.New(1))
  39. {
  40. return IsPredictable(recursion);
  41. }
  42. }
  43. }
  44. public bool IsPredictable(Recursion recursion)
  45. {
  46. if (!hasValidConnection)
  47. {
  48. return true;
  49. }
  50. if (!recursion?.TryEnter(this) ?? false)
  51. {
  52. return false;
  53. }
  54. var isPredictable = validConnectedPorts.All(cop => cop.IsPredictable(recursion));
  55. recursion?.Exit(this);
  56. return isPredictable;
  57. }
  58. public bool couldBeEntered
  59. {
  60. get
  61. {
  62. if (!isPredictable)
  63. {
  64. throw new NotSupportedException();
  65. }
  66. if (!hasValidConnection)
  67. {
  68. return false;
  69. }
  70. return validConnectedPorts.Any(cop => cop.couldBeEntered);
  71. }
  72. }
  73. public override bool CanConnectToValid(ControlOutput port)
  74. {
  75. return true;
  76. }
  77. public override void ConnectToValid(ControlOutput port)
  78. {
  79. var source = port;
  80. var destination = this;
  81. source.Disconnect();
  82. unit.graph.controlConnections.Add(new ControlConnection(source, destination));
  83. }
  84. public override void ConnectToInvalid(IUnitOutputPort port)
  85. {
  86. ConnectInvalid(port, this);
  87. }
  88. public override void DisconnectFromValid(ControlOutput port)
  89. {
  90. var connection = validConnections.SingleOrDefault(c => c.source == port);
  91. if (connection != null)
  92. {
  93. unit.graph.controlConnections.Remove(connection);
  94. }
  95. }
  96. public override void DisconnectFromInvalid(IUnitOutputPort port)
  97. {
  98. DisconnectInvalid(port, this);
  99. }
  100. public override IUnitPort CompatiblePort(IUnit unit)
  101. {
  102. if (unit == this.unit) return null;
  103. return unit.controlOutputs.FirstOrDefault();
  104. }
  105. }
  106. }