feature:Add a type of transition port that could transfer data to next node

main
taoria 3 years ago
parent 032288c379
commit a8ed2ff94d
  1. 3
      Samples/Nodes/CheckSizeNode.cs
  2. 11
      TNodeCore/Runtime/Models/ConditionalNode.cs
  3. 13
      TNodeCore/Runtime/RuntimeModels/ConditionalRuntimeNode.cs
  4. 3
      TNodeCore/Runtime/RuntimeModels/StaticGraph.cs
  5. 3
      Tests/StaticGraphTest.cs

@ -1,5 +1,4 @@
using TNode.TNodeCore.Runtime.Models; using TNodeCore.Runtime.Attributes;
using TNodeCore.Runtime.Attributes;
using TNodeCore.Runtime.Attributes.Ports; using TNodeCore.Runtime.Attributes.Ports;
using TNodeCore.Runtime.Models; using TNodeCore.Runtime.Models;

@ -1,9 +1,6 @@
using TNodeCore.Runtime; using Unity.Plastic.Newtonsoft.Json.Serialization;
using TNodeCore.Runtime.Attributes.Ports;
using TNodeCore.Runtime.Models;
using Unity.Plastic.Newtonsoft.Json.Serialization;
namespace TNode.TNodeCore.Runtime.Models{ namespace TNodeCore.Runtime.Models{
public class ConditionalNode:NodeData{ public class ConditionalNode:NodeData{
} }
@ -25,6 +22,10 @@ namespace TNode.TNodeCore.Runtime.Models{
public object GetValue(){ public object GetValue(){
return DataFunc.Invoke(); return DataFunc.Invoke();
} }
public static implicit operator T(TransitionCondition<T> condition){
return condition.DataFunc.Invoke();
}
} }
public interface IBaseTransition{ public interface IBaseTransition{
public bool Condition{ get; set; } public bool Condition{ get; set; }

@ -1,18 +1,17 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using TNode.TNodeCore.Runtime.Models;
using TNodeCore.Runtime.Models; using TNodeCore.Runtime.Models;
using UnityEngine; using UnityEngine;
namespace TNodeCore.Runtime{ namespace TNodeCore.Runtime{
public class ConditionalRuntimeNode:RuntimeNode{ public class ConditionalRuntimeNode:RuntimeNode{
private readonly List<Tuple<string,Func<TransitionCondition>>> _possibleTransition; private readonly List<Tuple<string,Func<IBaseTransition>>> _possibleTransition;
public ConditionalRuntimeNode(NodeData nodeData) : base(nodeData){ public ConditionalRuntimeNode(NodeData nodeData) : base(nodeData){
if (nodeData is ConditionalNode conditionalNode){ if (nodeData is ConditionalNode conditionalNode){
var transitionPort = GetPortsOfType<TransitionCondition>(); var transitionPort = GetPortsOfType<IBaseTransition>();
_possibleTransition = new List<Tuple<string,Func<TransitionCondition>>>(); _possibleTransition = new List<Tuple<string,Func<IBaseTransition>>>();
var allOutput = GetPortsOfType<object>().Where(x => GetPortDirection(x) == Direction.Output); var allOutput = GetPortsOfType<object>().Where(x => GetPortDirection(x) == Direction.Output);
var enumerable = allOutput as string[] ?? allOutput.ToArray(); var enumerable = allOutput as string[] ?? allOutput.ToArray();
if (enumerable.Count() != transitionPort.Length){ if (enumerable.Count() != transitionPort.Length){
@ -22,7 +21,7 @@ namespace TNodeCore.Runtime{
} }
foreach (var port in transitionPort){ foreach (var port in transitionPort){
if(GetPortDirection(port)==Direction.Input) continue; if(GetPortDirection(port)==Direction.Input) continue;
_possibleTransition.Add(new Tuple<string, Func<TransitionCondition>>(port,() => (TransitionCondition)GetOutput(port)) ); _possibleTransition.Add(new Tuple<string, Func<IBaseTransition>>(port,() => (IBaseTransition)GetOutput(port)) );
} }
} }
else{ else{
@ -39,8 +38,8 @@ namespace TNodeCore.Runtime{
} }
public string GetNextNodeId(){ public string GetNextNodeId(){
List<Tuple<string,TransitionCondition>> possibleCondition = _possibleTransition List<Tuple<string,IBaseTransition>> possibleCondition = _possibleTransition
.Select(x=>new Tuple<string,TransitionCondition>(x.Item1,x.Item2())) .Select(x=>new Tuple<string,IBaseTransition>(x.Item1,x.Item2()))
.Where(x=>x.Item2.Condition).ToList(); .Where(x=>x.Item2.Condition).ToList();
possibleCondition.Sort((a, b) => { possibleCondition.Sort((a, b) => {
var compareTo = b.Item2.Priority.CompareTo(a.Item2.Priority); var compareTo = b.Item2.Priority.CompareTo(a.Item2.Priority);

@ -1,7 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using TNode.TNodeCore.Runtime.Models;
using TNode.TNodeCore.Runtime.Tools; using TNode.TNodeCore.Runtime.Tools;
using TNodeCore.Runtime.Models; using TNodeCore.Runtime.Models;
using UnityEngine; using UnityEngine;
@ -29,8 +28,6 @@ namespace TNodeCore.Runtime.RuntimeModels{
var nodes = graphData.NodeDictionary.Values.ToList(); var nodes = graphData.NodeDictionary.Values.ToList();
var links = graphData.NodeLinks; var links = graphData.NodeLinks;
_nodes = new Dictionary<string, RuntimeNode>(); _nodes = new Dictionary<string, RuntimeNode>();
foreach (var nodeData in nodes){ foreach (var nodeData in nodes){
if(_nodes.ContainsKey(nodeData.id)) continue; if(_nodes.ContainsKey(nodeData.id)) continue;

@ -1,13 +1,12 @@
using System.Linq; using System.Linq;
using NUnit.Framework; using NUnit.Framework;
using TNode.TNodeCore.Runtime.Models;
using TNodeCore.Editor.Tools.NodeCreator; using TNodeCore.Editor.Tools.NodeCreator;
using TNodeCore.Runtime; using TNodeCore.Runtime;
using TNodeCore.Runtime.Attributes; using TNodeCore.Runtime.Attributes;
using TNodeCore.Runtime.Attributes.Ports; using TNodeCore.Runtime.Attributes.Ports;
using TNodeCore.Runtime.Models; using TNodeCore.Runtime.Models;
using TNodeCore.Runtime.RuntimeModels; using TNodeCore.Runtime.RuntimeModels;
using UnityEditor.VersionControl;
using UnityEngine; using UnityEngine;
namespace Tests{ namespace Tests{

Loading…
Cancel
Save