diff options
Diffstat (limited to 'Other/NodeEditorExamples/Assets/UNEB')
74 files changed, 11493 insertions, 0 deletions
diff --git a/Other/NodeEditorExamples/Assets/UNEB/3rdParty.meta b/Other/NodeEditorExamples/Assets/UNEB/3rdParty.meta new file mode 100644 index 00000000..5a1ce4d5 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/3rdParty.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 2324764fc9139ac44a4bcb1c29af8964 +folderAsset: yes +timeCreated: 1501783373 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Other/NodeEditorExamples/Assets/UNEB/3rdParty/NodeEditorFramework.meta b/Other/NodeEditorExamples/Assets/UNEB/3rdParty/NodeEditorFramework.meta new file mode 100644 index 00000000..66035e2c --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/3rdParty/NodeEditorFramework.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: adab484ec4e6ab246be215991707122b +folderAsset: yes +timeCreated: 1491889781 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Other/NodeEditorExamples/Assets/UNEB/3rdParty/NodeEditorFramework/GUIScaleUtility.cs b/Other/NodeEditorExamples/Assets/UNEB/3rdParty/NodeEditorFramework/GUIScaleUtility.cs new file mode 100644 index 00000000..a0e257b8 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/3rdParty/NodeEditorFramework/GUIScaleUtility.cs @@ -0,0 +1,251 @@ +using UnityEngine; +using System.Collections; +using System.Collections.Generic; +using System; +using System.Reflection; + +namespace NodeEditorFramework.Utilities +{ + + public static class GUIScaleUtility + { + // General + private static bool compabilityMode; + private static bool initiated; + + // Delegates to the reflected methods + private static Func<Rect> GetTopRectDelegate; + private static Func<Rect> topmostRectDelegate; + + // Delegate accessors + public static Rect getTopRect { get { return (Rect)GetTopRectDelegate.Invoke(); } } + + // Rect stack for manipulating groups + public static List<Rect> currentRectStack { get; private set; } + private static List<List<Rect>> rectStackGroups; + + // Matrices stack + private static List<Matrix4x4> GUIMatrices; + private static List<bool> adjustedGUILayout; + + #region Init + + public static void CheckInit() + { + if (!initiated) + Init(); + } + + public static void Init() + { + // Fetch rect acessors using Reflection + Assembly UnityEngine = Assembly.GetAssembly(typeof(UnityEngine.GUI)); + Type GUIClipType = UnityEngine.GetType("UnityEngine.GUIClip", true); + + PropertyInfo topmostRect = GUIClipType.GetProperty("topmostRect", BindingFlags.Static | BindingFlags.Public); + MethodInfo GetTopRect = GUIClipType.GetMethod("GetTopRect", BindingFlags.Static | BindingFlags.NonPublic); + MethodInfo ClipRect = GUIClipType.GetMethod("Clip", BindingFlags.Static | BindingFlags.Public, Type.DefaultBinder, new Type[] { typeof(Rect) }, new ParameterModifier[] { }); + + if (GUIClipType == null || topmostRect == null || GetTopRect == null || ClipRect == null) { + Debug.LogWarning("GUIScaleUtility cannot run on this system! Compability mode enabled. For you that means you're not able to use the Node Editor inside more than one group:( Please PM me (Seneral @UnityForums) so I can figure out what causes this! Thanks!"); + Debug.LogWarning((GUIClipType == null ? "GUIClipType is Null, " : "") + (topmostRect == null ? "topmostRect is Null, " : "") + (GetTopRect == null ? "GetTopRect is Null, " : "") + (ClipRect == null ? "ClipRect is Null, " : "")); + compabilityMode = true; + initiated = true; + return; + } + + // Create simple acessor delegates + GetTopRectDelegate = (Func<Rect>)Delegate.CreateDelegate(typeof(Func<Rect>), GetTopRect); + topmostRectDelegate = (Func<Rect>)Delegate.CreateDelegate(typeof(Func<Rect>), topmostRect.GetGetMethod()); + + if (GetTopRectDelegate == null || topmostRectDelegate == null) { + Debug.LogWarning("GUIScaleUtility cannot run on this system! Compability mode enabled. For you that means you're not able to use the Node Editor inside more than one group:( Please PM me (Seneral @UnityForums) so I can figure out what causes this! Thanks!"); + Debug.LogWarning((GUIClipType == null ? "GUIClipType is Null, " : "") + (topmostRect == null ? "topmostRect is Null, " : "") + (GetTopRect == null ? "GetTopRect is Null, " : "") + (ClipRect == null ? "ClipRect is Null, " : "")); + compabilityMode = true; + initiated = true; + return; + } + + // As we can call Begin/Ends inside another, we need to save their states hierarchial in Lists (not Stack, as we need to iterate over them!): + currentRectStack = new List<Rect>(); + rectStackGroups = new List<List<Rect>>(); + GUIMatrices = new List<Matrix4x4>(); + adjustedGUILayout = new List<bool>(); + + initiated = true; + } + + #endregion + + #region Scale Area + + /// <summary> + /// Begins a scaled local area. + /// Returns vector to offset GUI controls with to account for zooming to the pivot. + /// Using adjustGUILayout does that automatically for GUILayout rects. Theoretically can be nested! + /// </summary> + public static Vector2 BeginScale(ref Rect rect, Vector2 zoomPivot, float zoom, bool adjustGUILayout) + { + Rect screenRect; + if (compabilityMode) { + + // In compability mode, we will assume only one top group and do everything manually, not using reflected calls (-> practically blind) + GUI.EndGroup(); + screenRect = rect; + } + + else { + + // If it's supported, we take the completely generic way using reflected calls + GUIScaleUtility.BeginNoClip(); + screenRect = GUIScaleUtility.GUIToScaledSpace(rect); + } + + rect = Scale(screenRect, screenRect.position + zoomPivot, new Vector2(zoom, zoom)); + + // Now continue drawing using the new clipping group + GUI.BeginGroup(rect); + rect.position = Vector2.zero; // Adjust because we entered the new group + + // Because I currently found no way to actually scale to a custom pivot rather than (0, 0), + // we'll make use of a cheat and just offset it accordingly to let it appear as if it would scroll to the center + // Note, due to that, controls not adjusted are still scaled to (0, 0) + Vector2 zoomPosAdjust = rect.center - screenRect.size / 2 + zoomPivot; + + // For GUILayout, we can make this adjustment here if desired + adjustedGUILayout.Add(adjustGUILayout); + if (adjustGUILayout) { + GUILayout.BeginHorizontal(); + GUILayout.Space(rect.center.x - screenRect.size.x + zoomPivot.x); + GUILayout.BeginVertical(); + GUILayout.Space(rect.center.y - screenRect.size.y + zoomPivot.y); + } + + // Take a matrix backup to restore back later on + GUIMatrices.Add(GUI.matrix); + + // Scale GUI.matrix. After that we have the correct clipping group again. + GUIUtility.ScaleAroundPivot(new Vector2(1 / zoom, 1 / zoom), zoomPosAdjust); + + return zoomPosAdjust; + } + + /// <summary> + /// Ends a scale region previously opened with BeginScale + /// </summary> + public static void EndScale() + { + // Set last matrix and clipping group + if (GUIMatrices.Count == 0 || adjustedGUILayout.Count == 0) + throw new UnityException("GUIScaleUtility: You are ending more scale regions than you are beginning!"); + + GUI.matrix = GUIMatrices[GUIMatrices.Count - 1]; + GUIMatrices.RemoveAt(GUIMatrices.Count - 1); + + // End GUILayout zoomPosAdjustment + if (adjustedGUILayout[adjustedGUILayout.Count - 1]) { + + GUILayout.EndVertical(); + GUILayout.EndHorizontal(); + } + adjustedGUILayout.RemoveAt(adjustedGUILayout.Count - 1); + + // End the scaled group + GUI.EndGroup(); + + if (compabilityMode) { + + // In compability mode, we don't know the previous group rect, but as we cannot use top groups there either way, we restore the screen group + GUI.BeginClip(new Rect(0, 23, Screen.width, Screen.height - 23)); + } + + else { + + // Else, restore the clips (groups) + GUIScaleUtility.RestoreClips(); + } + } + + #endregion + + #region Clips Hierarchy + + /// <summary> + /// Begins a field without groups. They should be restored using RestoreClips. Can be nested! + /// </summary> + public static void BeginNoClip() + { + // Record and close all clips one by one, from bottom to top, until we hit the 'origin' + List<Rect> rectStackGroup = new List<Rect>(); + Rect topMostClip = getTopRect; + while (topMostClip != new Rect(-10000, -10000, 40000, 40000)) { + rectStackGroup.Add(topMostClip); + GUI.EndClip(); + topMostClip = getTopRect; + } + // Store the clips appropriately + rectStackGroup.Reverse(); + rectStackGroups.Add(rectStackGroup); + currentRectStack.AddRange(rectStackGroup); + } + + /// <summary> + /// Restores the clips removed in BeginNoClip or MoveClipsUp + /// </summary> + public static void RestoreClips() + { + if (rectStackGroups.Count == 0) { + Debug.LogError("GUIClipHierarchy: BeginNoClip/MoveClipsUp - RestoreClips count not balanced!"); + return; + } + + // Read and restore clips one by one, from top to bottom + List<Rect> rectStackGroup = rectStackGroups[rectStackGroups.Count - 1]; + for (int clipCnt = 0; clipCnt < rectStackGroup.Count; clipCnt++) { + GUI.BeginClip(rectStackGroup[clipCnt]); + currentRectStack.RemoveAt(currentRectStack.Count - 1); + } + rectStackGroups.RemoveAt(rectStackGroups.Count - 1); + } + + #endregion + + #region Space Transformations + + /// <summary> + /// Scales the rect around the pivot with scale + /// </summary> + public static Rect Scale(Rect rect, Vector2 pivot, Vector2 scale) + { + rect.position = Vector2.Scale(rect.position - pivot, scale) + pivot; + rect.size = Vector2.Scale(rect.size, scale); + return rect; + } + + public static Vector2 GUIToScaledSpace(Vector2 guiPosition) + { + if (rectStackGroups == null || rectStackGroups.Count == 0) + return guiPosition; + // Iterate through the clips and add positions ontop + List<Rect> rectStackGroup = rectStackGroups[rectStackGroups.Count - 1]; + for (int clipCnt = 0; clipCnt < rectStackGroup.Count; clipCnt++) + guiPosition += rectStackGroup[clipCnt].position; + return guiPosition; + } + + /// <summary> + /// Transforms the rect to the new space aquired with BeginNoClip or MoveClipsUp. + /// DOES NOT scale the rect, only offsets it! + /// It's way faster to call GUIToScreenSpace before modifying the space though! + /// </summary> + public static Rect GUIToScaledSpace(Rect guiRect) + { + if (rectStackGroups == null || rectStackGroups.Count == 0) + return guiRect; + guiRect.position = GUIToScaledSpace(guiRect.position); + return guiRect; + } + + #endregion + } +}
\ No newline at end of file diff --git a/Other/NodeEditorExamples/Assets/UNEB/3rdParty/NodeEditorFramework/GUIScaleUtility.cs.meta b/Other/NodeEditorExamples/Assets/UNEB/3rdParty/NodeEditorFramework/GUIScaleUtility.cs.meta new file mode 100644 index 00000000..239f91dd --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/3rdParty/NodeEditorFramework/GUIScaleUtility.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 1531560365f0bfb45881cc297952a854 +timeCreated: 1491887635 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Other/NodeEditorExamples/Assets/UNEB/3rdParty/NodeEditorFramework/License.txt b/Other/NodeEditorExamples/Assets/UNEB/3rdParty/NodeEditorFramework/License.txt new file mode 100644 index 00000000..6a3073a6 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/3rdParty/NodeEditorFramework/License.txt @@ -0,0 +1,23 @@ +# Software license + +The MIT License (MIT) + +Copyright (c) 2015 Baste Nesse Buanes + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.
\ No newline at end of file diff --git a/Other/NodeEditorExamples/Assets/UNEB/3rdParty/NodeEditorFramework/License.txt.meta b/Other/NodeEditorExamples/Assets/UNEB/3rdParty/NodeEditorFramework/License.txt.meta new file mode 100644 index 00000000..1379c6aa --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/3rdParty/NodeEditorFramework/License.txt.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d3b89e570c0baf842b5ea1792547f91d +timeCreated: 1491887832 +licenseType: Free +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Other/NodeEditorExamples/Assets/UNEB/Editor.meta b/Other/NodeEditorExamples/Assets/UNEB/Editor.meta new file mode 100644 index 00000000..191b5f5a --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Editor.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 8b9fa01c72d37c245b1a2eb96937972a +folderAsset: yes +timeCreated: 1501781446 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions.meta b/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions.meta new file mode 100644 index 00000000..f7f8ff4e --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 5357f731dedd7cc468c40f66bcd4487f +folderAsset: yes +timeCreated: 1501781574 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/ActionBase.cs b/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/ActionBase.cs new file mode 100644 index 00000000..426c8a50 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/ActionBase.cs @@ -0,0 +1,23 @@ + +namespace UNEB +{ + public abstract class ActionBase + { + + public ActionManager manager; + + /// <summary> + /// Can be used to check if the action is a valid state for furthur execution. + /// For example, we only want to run delete node if a node is selected for deletion. + /// </summary> + /// <returns></returns> + public virtual bool Init() { return true; } + + public abstract void Do(); + + /// <summary> + /// Called when the action is removed from the undo/redo buffers. + /// </summary> + public virtual void OnDestroy() { } + } +}
\ No newline at end of file diff --git a/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/ActionBase.cs.meta b/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/ActionBase.cs.meta new file mode 100644 index 00000000..eb9d005c --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/ActionBase.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 5dfa0b77744c2bc4eb973c5114f5de79 +timeCreated: 1501781587 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/ActionManager.cs b/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/ActionManager.cs new file mode 100644 index 00000000..b0450b46 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/ActionManager.cs @@ -0,0 +1,169 @@ + +using System; +using System.Collections.Generic; +using UnityEngine; +using UNEB.Utility; + +namespace UNEB +{ + /// <summary> + /// Handles execution of actions, undo, and redo. + /// </summary> + public class ActionManager + { + private NodeEditorWindow _window; + + private FiniteStack<UndoableAction> _undoStack; + private Stack<UndoableAction> _redoStack; + + // Caches the current multi-stage action that is currently executing. + private MultiStageAction _activeMultiAction = null; + + public event Action OnUndo; + public event Action OnRedo; + + public ActionManager(NodeEditorWindow w) + { + _undoStack = new FiniteStack<UndoableAction>(100); + _redoStack = new Stack<UndoableAction>(); + + _window = w; + + // Makes sure that the action cleans up after itself + // when it is removed from the undo buffer. + _undoStack.OnRemoveBottomItem += (action) => + { + action.OnDestroy(); + }; + } + + public void Update() + { + if (IsRunningAction) { + _activeMultiAction.Do(); + } + } + + public bool IsRunningAction + { + get { return _activeMultiAction != null; } + } + + /// <summary> + /// Runs an action and stores it in the undo stack. + /// </summary> + /// <typeparam name="T"></typeparam> + public void RunUndoableAction<T>() where T : UndoableAction, new() + { + T action = new T(); + action.manager = this; + + if (action.Init()) { + + clearRedoStack(); + _undoStack.Push(action); + action.Do(); + } + } + + /// <summary> + /// Starts a multi stage action but does not record it in the undo stack. + /// </summary> + /// <typeparam name="T"></typeparam> + public void StartMultiStageAction<T>() where T : MultiStageAction, new() + { + // Only run 1 multi-action at a time. + if (_activeMultiAction != null) { + return; + } + + T action = new T(); + action.manager = this; + + if (action.Init()) { + _activeMultiAction = action; + _activeMultiAction.OnActionStart(); + } + } + + /// <summary> + /// Records the multi-stage action in the undo stack. + /// </summary> + /// <typeparam name="T"></typeparam> + /// <param name="action"></param> + public void FinishMultiStageAction() + { + if (_activeMultiAction == null) { + return; + } + + // We check if the action ended properly so it can be stored in undo. + if (_activeMultiAction.OnActionEnd()) { + + clearRedoStack(); + _undoStack.Push(_activeMultiAction); + } + + // There is no longer an active multi-stage action. + _activeMultiAction = null; + } + + public void UndoAction() + { + if (_undoStack.Count != 0) { + + var action = _undoStack.Pop(); + _redoStack.Push(action); + + action.Undo(); + + if (OnUndo != null) + OnUndo(); + } + } + + public void RedoAction() + { + if (_redoStack.Count != 0) { + + var action = _redoStack.Pop(); + _undoStack.Push(action); + + action.Redo(); + + if (OnRedo != null) + OnRedo(); + } + } + + public void Reset() + { + _activeMultiAction = null; + clearUndoStack(); + clearRedoStack(); + } + + private void clearRedoStack() + { + foreach (var action in _redoStack) { + action.OnDestroy(); + } + + _redoStack.Clear(); + } + + private void clearUndoStack() + { + foreach (var action in _undoStack) { + action.OnDestroy(); + } + + _undoStack.Clear(); + } + + public NodeEditorWindow window + { + get { return _window; } + } + } +}
\ No newline at end of file diff --git a/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/ActionManager.cs.meta b/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/ActionManager.cs.meta new file mode 100644 index 00000000..3cc64c36 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/ActionManager.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 62fe01f31afcc5a4ab446003a7360cb3 +timeCreated: 1501892528 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/ActionTriggerSystem.cs b/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/ActionTriggerSystem.cs new file mode 100644 index 00000000..d5089754 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/ActionTriggerSystem.cs @@ -0,0 +1,456 @@ + +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using UNEB.Utility; +using System.Reflection; +using System.Linq; + +namespace UNEB +{ + public class ActionTriggerSystem + { + public List<TriggerMapping> triggers; + + /// <summary> + /// Passive triggers do not interrupt the next possible trigger. + /// </summary> + public List<TriggerMapping> passiveTriggers; + + private ActionManager _manager; + private TriggerMapping _focus; + + public ActionTriggerSystem(ActionManager m) + { + _manager = m; + + triggers = new List<TriggerMapping>(); + passiveTriggers = new List<TriggerMapping>(); + + setupStandardTriggers(); + } + + public void Update() + { + foreach (TriggerMapping tm in triggers) { + if (tm.AllTriggersSatisfied()) { + tm.action(); + return; + } + } + + foreach (TriggerMapping tm in passiveTriggers) { + if (tm.AllTriggersSatisfied()) { + tm.action(); + } + } + + // Block all key inputs from passing through the Unity Editor + if (Event.current.isKey) + Event.current.Use(); + } + + private void setupStandardTriggers() + { + setupImmediateTriggers(); + setupContextTriggers(); + setupMultiStageTriggers(); + } + + private void setupImmediateTriggers() + { + var panInput = Create<InputTrigger>().Mouse(EventType.MouseDrag, InputTrigger.Button.Wheel); + panInput.action = () => + { + window.editor.Pan(Event.current.delta); + window.Repaint(); + }; + + var zoomInput = Create<InputTrigger>().Key(EventType.ScrollWheel, KeyCode.None, false, false); + zoomInput.action = () => + { + window.editor.Zoom(Event.current.delta.y); + window.Repaint(); + }; + + var selectSingle = Create<InputTrigger>().Mouse(EventType.MouseDown, InputTrigger.Button.Left); + selectSingle.action = () => + { + bool bResult = window.editor.OnMouseOverNode(onSingleSelected); + + // If the canvas is clicked then remove focus of GUI elements. + if (!bResult) { + GUI.FocusControl(null); + window.Repaint(); + } + }; + + var undoInput = Create<InputTrigger>().Key(EventType.KeyDown, KeyCode.Z, true, false); + undoInput.action = _manager.UndoAction; + + var redoInput = Create<InputTrigger>().Key(EventType.KeyDown, KeyCode.Y, true, false); + redoInput.action = _manager.RedoAction; + + var recordClick = Create<InputTrigger>().EventOnly(EventType.MouseDown); + recordClick.action = () => { window.state.lastClickedPosition = window.editor.MousePosition(); }; + + var homeView = Create<InputTrigger>().Key(EventType.KeyDown, KeyCode.F, false, false); + homeView.action = window.editor.HomeView; + } + + private void setupContextTriggers() + { + setupNodeCreateMenu(); + + Pair<string, Action>[] nodeContext = + { + ContextItem("Copy Node", () => { Debug.Log("Not Implemented"); }), + ContextItem("Delete Node", _manager.RunUndoableAction<DeleteNodeAction>) + }; + + var nodeTrigger = Create<ContextTrigger>().Build(nodeContext).EventOnly(EventType.ContextClick); + nodeTrigger.triggers.Add(isMouseOverNode); + nodeTrigger.triggers.Add(isGraphValid); + } + + private void setupNodeCreateMenu() + { + //Get all classes deriving from Node via reflection + Type derivedType = typeof(Node); + Assembly assembly = Assembly.GetAssembly(derivedType); + + List<Type> nodeTypes = assembly + .GetTypes() + .Where(t => + t != derivedType && + derivedType.IsAssignableFrom(t) + ).ToList(); + + //Populate canvasContext with entries for all node types + var canvasContext = new Pair<string, Action>[nodeTypes.Count]; + + for (int i = 0; i < nodeTypes.Count; i++) { + + Type nodeType = nodeTypes[i]; + Action createNode = () => + { + _manager.window.state.typeToCreate = nodeType; + _manager.RunUndoableAction<CreateNodeAction>(); + }; + + string name = ObjectNames.NicifyVariableName(nodeType.Name); + canvasContext[i] = ContextItem(name, createNode); + } + + var canvasTrigger = Create<ContextTrigger>().Build(canvasContext).EventOnly(EventType.ContextClick); + canvasTrigger.triggers.Add(isMouseOverCanvas); + canvasTrigger.triggers.Add(isGraphValid); + } + + private void setupMultiStageTriggers() + { + setupNodeDrag(); + setupNodeConnection(); + } + + private void setupNodeDrag() + { + var endDragInput = Create<InputTrigger>(false, true).Mouse(EventType.MouseUp, InputTrigger.Button.Left); + var runningDragInput = Create<InputTrigger>(false, true).EventOnly(EventType.MouseDrag); + var startDragInput = Create<InputTrigger>(false, true).Mouse(EventType.MouseDown, InputTrigger.Button.Left); + + startDragInput.triggers.Add(isMouseOverNode); + startDragInput.action = _manager.StartMultiStageAction<DragNode>; + + endDragInput.action = _manager.FinishMultiStageAction; + + runningDragInput.action = _manager.Update; + runningDragInput.action += window.Repaint; + + new MultiStageInputTrigger(startDragInput, endDragInput, runningDragInput); + } + + private void setupNodeConnection() + { + var endConnInput = Create<InputTrigger>(false, true).Mouse(EventType.MouseUp, InputTrigger.Button.Left); + var runningConnInput = Create<InputTrigger>(false, true).EventOnly(EventType.MouseDrag); + var startConnInput = Create<InputTrigger>(false, true).Mouse(EventType.MouseDown, InputTrigger.Button.Left); + + Func<bool> knobCondition = () => { return isMouseOverOutput() || isMouseOverInputStartConn(); }; + + startConnInput.triggers.Add(knobCondition); + startConnInput.triggers.Add(isOutputSelected); + + startConnInput.action = _manager.StartMultiStageAction<CreateConnection>; + + endConnInput.action = _manager.FinishMultiStageAction; + endConnInput.action += window.Repaint; + + runningConnInput.action = _manager.Update; + runningConnInput.action += window.Repaint; + + new MultiStageInputTrigger(startConnInput, endConnInput, runningConnInput); + } + + /// <summary> + /// Create a trigger mapping and store it in the triggers list. + /// </summary> + /// <typeparam name="T"></typeparam> + /// <returns></returns> + public T Create<T>(bool isPassive = false, bool pushToFront = false) where T : TriggerMapping, new() + { + T mapping = new T(); + + if (isPassive) { + + if (pushToFront && passiveTriggers.Count > 0) passiveTriggers.Insert(0, mapping); + else passiveTriggers.Add(mapping); + } + + else { + + if (pushToFront && triggers.Count > 0) triggers.Insert(0, mapping); + else triggers.Add(mapping); + } + + return mapping; + } + + private void onSingleSelected(Node node) + { + _manager.window.state.selectedNode = node; + _manager.window.graph.PushToEnd(node); + + Selection.activeObject = node; + } + + private void onOutputKnobSelected(NodeOutput output) + { + _manager.window.state.selectedOutput = output; + } + + private bool isMouseOverNode() + { + return window.editor.OnMouseOverNode(onSingleSelected); + } + + private bool isMouseOverCanvas() + { + return !isMouseOverNode(); + } + + private bool isMouseOverOutput() + { + return window.editor.OnMouseOverOutput(onOutputKnobSelected); + } + + private bool isMouseOverInputStartConn() + { + Action<NodeInput> startConnFromInput = (NodeInput input) => + { + window.state.selectedOutput = input.Outputs[0]; + + // Detach this input if we are starting a connection action from the input. + if (window.state.selectedOutput != null) { + + window.state.selectedInput = input; + _manager.RunUndoableAction<RemoveConnection>(); + } + }; + + return window.editor.OnMouseOverInput(startConnFromInput); + } + + private bool isOutputSelected() + { + return window.state.selectedOutput != null; + } + + private NodeEditorWindow window + { + get { return _manager.window; } + } + + private bool isGraphValid() + { + return window.graph != null; + } + + public Pair<string, Action> ContextItem(string label, Action a) + { + return new Pair<string, Action>(label, a); + } + + /// <summary> + /// Maps a conditional trigger with an action. + /// </summary> + public class TriggerMapping + { + public List<Func<bool>> triggers = new List<Func<bool>>(); + public Action action; + + protected TriggerMapping() { } + + public TriggerMapping(Func<bool> trigger, Action action) + { + ; + triggers.Add(trigger); + this.action = action; + } + + public bool AllTriggersSatisfied() + { + foreach (var t in triggers) { + if (!t()) { + return false; + } + } + + return true; + } + } + + /// <summary> + /// Special trigger that uses input as a conditional. + /// </summary> + public class InputTrigger : TriggerMapping + { + public enum Button + { + Left = 0, + Right = 1, + Wheel = 2 + } + + private EventType t; + private KeyCode k; + private int button; + private bool bIsShift, bIsCtrl; + + /// <summary> + /// Initialize the input mapping with a key trigger. + /// </summary> + /// <param name="type"></param> + /// <param name="key"></param> + /// <param name="bShift"></param> + /// <param name="bCtrl"></param> + /// <returns></returns> + public InputTrigger Key(EventType type, KeyCode key, bool bShift, bool bCtrl) + { + t = type; + k = key; + + bIsShift = bShift; + bIsCtrl = bCtrl; + + Func<bool> trigger = () => + { + var e = Event.current; + + return + e.type == t && + e.keyCode == k && + e.shift == bIsShift && + e.control == bIsCtrl; + }; + + triggers.Add(trigger); + return this; + } + + /// <summary> + /// Initialize the input mapping with a mouse button tirgger. + /// </summary> + /// <param name="type"></param> + /// <param name="mButton"></param> + /// <returns></returns> + public InputTrigger Mouse(EventType type, Button mButton) + { + t = type; + button = (int)mButton; + + Func<bool> trigger = () => + { + var e = Event.current; + + return + e.type == t && + e.button == button; + }; + + triggers.Add(trigger); + return this; + } + + /// <summary> + /// Initializes the input mapping with the event. + /// </summary> + /// <param name="type"></param> + /// <returns></returns> + public InputTrigger EventOnly(EventType type) + { + t = type; + Func<bool> trigger = () => { return Event.current.type == t; }; + + triggers.Add(trigger); + return this; + } + } + + /// <summary> + /// Special trigger that uses context menus to execute other actions. + /// </summary> + public class ContextTrigger : InputTrigger + { + private GenericMenu menu; + + public ContextTrigger() + { + menu = new GenericMenu(); + action = menu.ShowAsContext; + } + + public ContextTrigger Build(params Pair<string, Action>[] contents) + { + foreach (var content in contents) { + + string label = content.item1; + Action action = content.item2; + + menu.AddItem(new GUIContent(label), false, () => { action(); }); + } + + return this; + } + } + + public class MultiStageInputTrigger + { + private InputTrigger _startTrigger, _endTrigger, _runningTrigger; + + private bool _bStarted = false; + + public MultiStageInputTrigger(InputTrigger start, InputTrigger end, InputTrigger running) + { + start.action += () => { _bStarted = true; }; + start.triggers.Add(hasNotStarted); + + end.triggers.Add(HasStarted); + end.action += () => { _bStarted = false; }; + + running.triggers.Add(HasStarted); + } + + public bool HasStarted() + { + return _bStarted; + } + + private bool hasNotStarted() + { + return !_bStarted; + } + } + } +}
\ No newline at end of file diff --git a/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/ActionTriggerSystem.cs.meta b/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/ActionTriggerSystem.cs.meta new file mode 100644 index 00000000..6d66a0d4 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/ActionTriggerSystem.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 2b8fd837eb8876e4fa8c9b94d8b977f0 +timeCreated: 1501897267 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/CreateConnection.cs b/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/CreateConnection.cs new file mode 100644 index 00000000..09d3e521 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/CreateConnection.cs @@ -0,0 +1,106 @@ + +using System.Linq; +using System.Collections.Generic; + +using UnityEngine; +using UnityEditor; + +namespace UNEB +{ + public class CreateConnection : MultiStageAction + { + private NodeInput _input; + private NodeOutput _output; + + // The output of the old node it was connected to. + private NodeOutput _oldConnectedOutput; + + // Old inputs of the node. + private List<NodeInput> _oldConnectedInputs; + + public override void Do() + { + manager.window.state.selectedOutput = _output; + } + + public override void Undo() + { + _output.Remove(_input); + reconnectOldConnections(); + } + + public override void Redo() + { + disconnectOldConnections(); + _output.Add(_input); + } + + private void reconnectOldConnections() + { + // Re-connect old connections + if (_oldConnectedOutput != null) { + _oldConnectedOutput.Add(_input); + } + + if (_oldConnectedInputs != null) { + foreach (var input in _oldConnectedInputs) { + _output.Add(input); + } + } + } + + private void disconnectOldConnections() + { + // Remove old connections + if (_oldConnectedOutput != null) { + _oldConnectedOutput.Remove(_input); + } + + if (_oldConnectedInputs != null) { + _output.RemoveAll(); + } + } + + public override void OnActionStart() + { + _output = manager.window.state.selectedOutput; + } + + public override bool OnActionEnd() + { + manager.window.state.selectedOutput = null; + manager.window.editor.OnMouseOverInput((input) => { _input = input; }); + + // Make the connection. + if (_input != null && _output.CanConnectInput(_input)) { + + if (!_output.bCanHaveMultipleConnections) + { + _output.RemoveAll(); + } + + if (!_input.bCanHaveMultipleConnections) { + cacheOldConnections(); + disconnectOldConnections(); + } + + return _output.Add(_input); + } + + return false; + } + + private void cacheOldConnections() + { + // Check if the receiving node was already connected. + if (_input != null && _input.HasOutputConnected()) { + _oldConnectedOutput = _input.Outputs[0]; + } + + // Check if the origin node already had inputs + if (!_output.bCanHaveMultipleConnections && _output.InputCount > 0) { + _oldConnectedInputs = _output.Inputs.ToList(); + } + } + } +}
\ No newline at end of file diff --git a/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/CreateConnection.cs.meta b/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/CreateConnection.cs.meta new file mode 100644 index 00000000..5f6468b1 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/CreateConnection.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 89cf0324fa09d7d4b82a3308a2172117 +timeCreated: 1501807840 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/CreateNodeAction.cs b/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/CreateNodeAction.cs new file mode 100644 index 00000000..522fa0cb --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/CreateNodeAction.cs @@ -0,0 +1,55 @@ + +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace UNEB +{ + public class CreateNodeAction : UndoableAction + { + private NodeGraph _graph; + private Node _nodeCreated; + + // The node referenced can only be destroyed if the + // create action has been undone. + private bool _bCanDeleteNode = false; + + public override bool Init() + { + System.Type t = manager.window.state.typeToCreate; + return t != null && typeof(Node).IsAssignableFrom(t); + } + + public override void Do() + { + _graph = manager.window.graph; + + var state = manager.window.state; + + _nodeCreated = SaveManager.CreateNode(state.typeToCreate, _graph); + _nodeCreated.bodyRect.position = manager.window.state.lastClickedPosition; + + // Done with this type creation. + state.typeToCreate = null; + } + + public override void Undo() + { + _graph.Remove(_nodeCreated); + _bCanDeleteNode = true; + } + + public override void Redo() + { + _graph.Add(_nodeCreated); + _bCanDeleteNode = false; + } + + public override void OnDestroy() + { + if (_bCanDeleteNode && _nodeCreated) { + ScriptableObject.DestroyImmediate(_nodeCreated, true); + } + } + } +}
\ No newline at end of file diff --git a/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/CreateNodeAction.cs.meta b/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/CreateNodeAction.cs.meta new file mode 100644 index 00000000..06f04a85 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/CreateNodeAction.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f1c2e7f15404be3468c08ac729975c13 +timeCreated: 1501781600 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/DeleteNodeAction.cs b/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/DeleteNodeAction.cs new file mode 100644 index 00000000..2e2e6672 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/DeleteNodeAction.cs @@ -0,0 +1,128 @@ + +using System; +using System.Linq; +using System.Collections.Generic; +using UnityEngine; +using UNEB.Utility; + +namespace UNEB +{ + // Each input can have many outputs + using InputToOutputPair = Pair<NodeInput, List<NodeOutput>>; + + // Each output can have many inputs + using OutputToInputsPair = Pair<NodeOutput, List<NodeInput>>; + + public class DeleteNodeAction : UndoableAction + { + private NodeGraph _graph; + private Node _nodeRemoved = null; + + private List<InputToOutputPair> _oldConnectedOutputs; + private List<OutputToInputsPair> _oldConnectedInputs; + + // The node referenced can only be destroyed if the + // delete action has been done or redone. + private bool _bCanDeleteNode = false; + + public DeleteNodeAction() + { + + _oldConnectedOutputs = new List<InputToOutputPair>(); + _oldConnectedInputs = new List<OutputToInputsPair>(); + } + + public override bool Init() + { + return manager.window.state.selectedNode != null; + } + + public override void Do() + { + _graph = manager.window.graph; + _nodeRemoved = manager.window.state.selectedNode; + _graph.Remove(_nodeRemoved); + + // Remember all the old outputs the inputs were connected to. + foreach (var input in _nodeRemoved.Inputs) { + + if (input.HasOutputConnected()) { + _oldConnectedOutputs.Add(new InputToOutputPair(input, input.Outputs.ToList())); + } + } + + // Remember all the old input connections that the outputs were connected to. + foreach (var output in _nodeRemoved.Outputs) { + + if (output.InputCount != 0) { + _oldConnectedInputs.Add(new OutputToInputsPair(output, output.Inputs.ToList())); + } + } + + disconnectOldConnections(); + + _bCanDeleteNode = true; + } + + public override void Undo() + { + _graph.Add(_nodeRemoved); + reconnectOldConnections(); + + _bCanDeleteNode = false; + } + + public override void Redo() + { + _graph.Remove(_nodeRemoved); + disconnectOldConnections(); + + _bCanDeleteNode = true; + } + + private void disconnectOldConnections() + { + // For all the outputs for this node, remove all the connected inputs. + foreach (var output in _nodeRemoved.Outputs) { + output.RemoveAll(); + } + + // For all the inputs for this node, remove all the connected outputs. + foreach (var input in _nodeRemoved.Inputs) { + input.RemoveAll(); + } + } + + private void reconnectOldConnections() + { + // For all the remembered inputs (of this node) to output pairs, reconnect. + foreach (InputToOutputPair inOutPair in _oldConnectedOutputs) { + + NodeInput input = inOutPair.item1; + List<NodeOutput> outputs = inOutPair.item2; + + foreach (var output in outputs) { + output.Add(input); + } + } + + // For all the remembered outputs (of this node) to inputs, reconnect. + foreach (OutputToInputsPair outInsPair in _oldConnectedInputs) { + + NodeOutput output = outInsPair.item1; + List<NodeInput> inputs = outInsPair.item2; + + foreach (var input in inputs) { + output.Add(input); + } + } + } + + public override void OnDestroy() + { + if (_bCanDeleteNode && _nodeRemoved) { + ScriptableObject.DestroyImmediate(_nodeRemoved, true); + } + } + } +}
\ No newline at end of file diff --git a/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/DeleteNodeAction.cs.meta b/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/DeleteNodeAction.cs.meta new file mode 100644 index 00000000..4a62ff87 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/DeleteNodeAction.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 5653c134c34e88b4a971e196d0f42586 +timeCreated: 1501781608 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/DragNode.cs b/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/DragNode.cs new file mode 100644 index 00000000..9e4d89d0 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/DragNode.cs @@ -0,0 +1,42 @@ + +using UnityEngine; + +namespace UNEB +{ + public class DragNode : MultiStageAction + { + private Node _draggingNode; + + private Vector2 _startDragPos, _endDragPos; + + public const float dragSpeed = 1f; + + public override void Undo() + { + _draggingNode.bodyRect.position = _startDragPos; + } + + public override void Redo() + { + _draggingNode.bodyRect.position = _endDragPos; + } + + public override void Do() + { + NodeEditor editor = manager.window.editor; + _draggingNode.bodyRect.position += Event.current.delta * editor.ZoomScale * dragSpeed; + } + + public override void OnActionStart() + { + _draggingNode = manager.window.state.selectedNode; + _startDragPos = _draggingNode.bodyRect.position; + } + + public override bool OnActionEnd() + { + _endDragPos = _draggingNode.bodyRect.position; + return true; + } + } +}
\ No newline at end of file diff --git a/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/DragNode.cs.meta b/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/DragNode.cs.meta new file mode 100644 index 00000000..efbc5101 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/DragNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 2075b47cce2d17147a02ec2483f38698 +timeCreated: 1501792802 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/MultiStageAction.cs b/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/MultiStageAction.cs new file mode 100644 index 00000000..b7fd41fb --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/MultiStageAction.cs @@ -0,0 +1,18 @@ + +using System.Collections.Generic; +using UnityEngine; + +namespace UNEB +{ + public abstract class MultiStageAction : UndoableAction + { + + public abstract void OnActionStart(); + + /// <summary> + /// Returns true if the action completed succesfully. + /// </summary> + /// <returns></returns> + public abstract bool OnActionEnd(); + } +}
\ No newline at end of file diff --git a/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/MultiStageAction.cs.meta b/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/MultiStageAction.cs.meta new file mode 100644 index 00000000..bc4a1081 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/MultiStageAction.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 211fa78df12a1d440a6aa57ca343d5ab +timeCreated: 1501892778 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/RemoveConnection.cs b/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/RemoveConnection.cs new file mode 100644 index 00000000..341e9f63 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/RemoveConnection.cs @@ -0,0 +1,32 @@ + +using UnityEngine; + +namespace UNEB +{ + public class RemoveConnection : UndoableAction + { + + private NodeOutput _output; + private NodeInput _input; + + public override void Do() + { + _input = manager.window.state.selectedInput; + _output = _input.Outputs[0]; + + _output.Remove(_input); + + manager.window.state.selectedInput = null; + } + + public override void Undo() + { + _output.Add(_input); + } + + public override void Redo() + { + _output.Remove(_input); + } + } +}
\ No newline at end of file diff --git a/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/RemoveConnection.cs.meta b/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/RemoveConnection.cs.meta new file mode 100644 index 00000000..fec8868b --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/RemoveConnection.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d1b449f51ea4820498a2b38021e549d7 +timeCreated: 1501913312 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/UndoableAction.cs b/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/UndoableAction.cs new file mode 100644 index 00000000..53857a9f --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/UndoableAction.cs @@ -0,0 +1,12 @@ + +using System.Collections.Generic; +using UnityEngine; + +namespace UNEB +{ + public abstract class UndoableAction : ActionBase + { + public abstract void Undo(); + public abstract void Redo(); + } +}
\ No newline at end of file diff --git a/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/UndoableAction.cs.meta b/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/UndoableAction.cs.meta new file mode 100644 index 00000000..b6e7512b --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Editor/Actions/UndoableAction.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 72c02675816f81d4c9d15134303127b4 +timeCreated: 1501892769 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Other/NodeEditorExamples/Assets/UNEB/Editor/NodeEditor.cs b/Other/NodeEditorExamples/Assets/UNEB/Editor/NodeEditor.cs new file mode 100644 index 00000000..a7b8db1d --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Editor/NodeEditor.cs @@ -0,0 +1,665 @@ + +using System; +using System.Collections.Generic; + +using UnityEngine; +using UnityEditor; + +using NodeEditorFramework.Utilities; +using UNEB.Utility; + +namespace UNEB +{ + public class NodeEditor + { + /// <summary> + /// Callback for when a node is modified within the editor + /// </summary> + public static Action<NodeGraph, Node> onNodeGuiChange; + + /// <summary> + /// The rect bounds defining the recticle at the grid center. + /// </summary> + public static readonly Rect kReticleRect = new Rect(0, 0, 8, 8); + + public static float zoomDelta = 0.1f; + public static float minZoom = 1f; + public static float maxZoom = 4f; + public static float panSpeed = 1.2f; + + /// <summary> + /// The associated graph to visualize and edit. + /// </summary> + public NodeGraph graph; + private NodeEditorWindow _window; + + private Texture2D _gridTex; + private Texture2D _backTex; + private Texture2D _circleTex; + private Texture2D _knobTex; + private Texture2D _headerTex; + + public Color backColor; + public Color knobColor; + public Color guideColor; + + // To keep track of zooming. + private Vector2 _zoomAdjustment; + private Vector2 _zoom = Vector2.one; + public Vector2 panOffset = Vector2.zero; + + /// <summary> + /// Enables and disables drawing the guide to the grid center. + /// </summary> + public bool bDrawGuide = false; + + public NodeEditor(NodeEditorWindow w) + { + backColor = ColorExtensions.From255(59, 62, 74); + knobColor = ColorExtensions.From255(126, 186, 255); + + guideColor = Color.gray; + guideColor.a = 0.3f; + + _gridTex = TextureLib.GetTexture("Grid"); + _backTex = TextureLib.GetTexture("Square"); + _circleTex = TextureLib.GetTexture("Circle"); + + _window = w; + } + + #region Drawing + + public void Draw() + { + if (Event.current.type == EventType.Repaint) { + drawGrid(); + updateTextures(); + } + + if (graph) + drawGraphContents(); + + drawMode(); + } + + private void drawGraphContents() + { + Rect graphRect = _window.Size; + var center = graphRect.size / 2f; + + _zoomAdjustment = GUIScaleUtility.BeginScale(ref graphRect, center, ZoomScale, false); + + drawGridOverlay(); + drawConnectionPreview(); + drawConnections(); + drawNodes(); + + GUIScaleUtility.EndScale(); + } + + private void drawGrid() + { + var size = _window.Size.size; + var center = size / 2f; + + float zoom = ZoomScale; + + // Offset from origin in tile units + float xOffset = -(center.x * zoom + panOffset.x) / _gridTex.width; + float yOffset = ((center.y - size.y) * zoom + panOffset.y) / _gridTex.height; + + Vector2 tileOffset = new Vector2(xOffset, yOffset); + + // Amount of tiles + float tileAmountX = Mathf.Round(size.x * zoom) / _gridTex.width; + float tileAmountY = Mathf.Round(size.y * zoom) / _gridTex.height; + + Vector2 tileAmount = new Vector2(tileAmountX, tileAmountY); + + // Draw tiled background + GUI.DrawTextureWithTexCoords(_window.Size, _gridTex, new Rect(tileOffset, tileAmount)); + } + + // Handles drawing things over the grid such as axes. + private void drawGridOverlay() + { + drawAxes(); + drawGridCenter(); + + if (bDrawGuide) { + drawGuide(); + _window.Repaint(); + } + } + + private void drawGridCenter() + { + var rect = kReticleRect; + + rect.size *= ZoomScale; + rect.center = Vector2.zero; + rect.position = GraphToScreenSpace(rect.position); + + DrawTintTexture(rect, _circleTex, Color.gray); + } + + private void drawAxes() + { + // Draw axes. Make sure to scale based on zoom. + Vector2 up = Vector2.up * _window.Size.height * ZoomScale; + Vector2 right = Vector2.right * _window.Size.width * ZoomScale; + Vector2 down = -up; + Vector2 left = -right; + + // Make sure the axes follow the pan. + up.y -= panOffset.y; + down.y -= panOffset.y; + right.x -= panOffset.x; + left.x -= panOffset.x; + + up = GraphToScreenSpace(up); + down = GraphToScreenSpace(down); + right = GraphToScreenSpace(right); + left = GraphToScreenSpace(left); + + DrawLine(right, left, Color.gray); + DrawLine(up, down, Color.gray); + } + + /// <summary> + /// Shows where the center of the grid is. + /// </summary> + private void drawGuide() + { + Vector2 gridCenter = GraphToScreenSpace(Vector2.zero); + DrawLine(gridCenter, Event.current.mousePosition, guideColor); + } + + private void drawNodes() + { + // Calculate the viewing rect in graph space. + var view = _window.Size; + view.size *= ZoomScale; + view.center = -panOffset; + + // Render nodes within the view space for performance. + foreach (Node node in graph.nodes) { + + if (view.Overlaps(node.bodyRect)) { + drawNode(node); + drawKnobs(node); + } + } + } + + private void drawKnobs(Node node) + { + foreach (var input in node.Inputs) { + drawKnob(input); + } + + foreach (var output in node.Outputs) { + drawKnob(output); + } + } + + private void drawKnob(NodeConnection knob) + { + // Convert the body rect from graph to screen space. + var screenRect = knob.bodyRect; + screenRect.position = GraphToScreenSpace(screenRect.position); + + GUI.DrawTexture(screenRect, _knobTex); + } + + private void drawConnections() + { + foreach (var node in graph.nodes) { + foreach (var output in node.Outputs) { + foreach (var input in output.Inputs) { + + Vector2 start = GraphToScreenSpace(output.bodyRect.center); + Vector2 end = GraphToScreenSpace(input.bodyRect.center); + + DrawBezier(start, end, knobColor); + } + } + } + } + + private void drawConnectionPreview() + { + var output = _window.state.selectedOutput; + + if (output != null) { + Vector2 start = GraphToScreenSpace(output.bodyRect.center); + DrawBezier(start, Event.current.mousePosition, Color.gray); + } + } + + private void drawNode(Node node) + { + // Convert the node rect from graph to screen space. + Rect screenRect = node.bodyRect; + screenRect.position = GraphToScreenSpace(screenRect.position); + + // The node contents are grouped together within the node body. + BeginGroup(screenRect, backgroundStyle, backColor); + + // Make the body of node local to the group coordinate space. + Rect localRect = node.bodyRect; + localRect.position = Vector2.zero; + + // Draw the contents inside the node body, automatically laidout. + GUILayout.BeginArea(localRect, GUIStyle.none); + + node.HeaderStyle.normal.background = _headerTex; + + EditorGUI.BeginChangeCheck(); + node.OnNodeGUI(); + if (EditorGUI.EndChangeCheck()) + if (onNodeGuiChange != null) onNodeGuiChange(graph, node); + + GUILayout.EndArea(); + GUI.EndGroup(); + } + + /// <summary> + /// Draw the window mode in the background. + /// </summary> + public void drawMode() + { + if (!graph) { + GUI.Label(_modeStatusRect, new GUIContent("No Graph Set"), ModeStatusStyle); + } + + else if (_window.GetMode() == NodeEditorWindow.Mode.Edit) { + GUI.Label(_modeStatusRect, new GUIContent("Edit"), ModeStatusStyle); + } + + else { + GUI.Label(_modeStatusRect, new GUIContent("View"), ModeStatusStyle); + } + } + + /// <summary> + /// Draws a bezier between the two end points in screen space. + /// </summary> + public static void DrawBezier(Vector2 start, Vector2 end, Color color) + { + Vector2 endToStart = (end - start); + float dirFactor = Mathf.Clamp(endToStart.magnitude, 20f, 80f); + + endToStart.Normalize(); + Vector2 project = Vector3.Project(endToStart, Vector3.right); + + Vector2 startTan = start + project * dirFactor; + Vector2 endTan = end - project * dirFactor; + + UnityEditor.Handles.DrawBezier(start, end, startTan, endTan, color, null, 3f); + } + + /// <summary> + /// Draws a line between the two end points. + /// </summary> + /// <param name="start"></param> + /// <param name="end"></param> + public static void DrawLine(Vector2 start, Vector2 end, Color color) + { + var handleColor = Handles.color; + Handles.color = color; + + Handles.DrawLine(start, end); + Handles.color = handleColor; + } + + /// <summary> + /// Draws a GUI texture with a tint. + /// </summary> + /// <param name="r"></param> + /// <param name="t"></param> + /// <param name="c"></param> + public static void DrawTintTexture(Rect r, Texture t, Color c) + { + var guiColor = GUI.color; + GUI.color = c; + + GUI.DrawTexture(r, t); + GUI.color = guiColor; + } + + public static void BeginGroup(Rect r, GUIStyle style, Color color) + { + var old = GUI.color; + + GUI.color = color; + GUI.BeginGroup(r, style); + + GUI.color = old; + } + + // TODO: Call after exiting playmode. + private void updateTextures() + { + _knobTex = TextureLib.GetTintTex("Circle", knobColor); + _headerTex = TextureLib.GetTintTex("Square", ColorExtensions.From255(79, 82, 94)); + } + + #endregion + + #region View Operations + + public void ToggleDrawGuide() + { + bDrawGuide = !bDrawGuide; + } + + public void HomeView() + { + if (!graph || graph.nodes.Count == 0) { + panOffset = Vector2.zero; + return; + } + + float xMin = float.MaxValue; + float xMax = float.MinValue; + float yMin = float.MaxValue; + float yMax = float.MinValue; + + foreach (var node in graph.nodes) { + + Rect r = node.bodyRect; + + if (r.xMin < xMin) { + xMin = r.xMin; + } + + if (r.xMax > xMax) { + xMax = r.xMax; + } + + if (r.yMin < yMin) { + yMin = r.yMin; + } + + if (r.yMax > yMax) { + yMax = r.yMax; + } + } + + // Add some padding so nodes do not appear on the edge of the view. + xMin -= Node.kDefaultSize.x; + xMax += Node.kDefaultSize.x; + yMin -= Node.kDefaultSize.y; + yMax += Node.kDefaultSize.y; + var nodesArea = Rect.MinMaxRect(xMin, yMin, xMax, yMax); + + // Center the pan in the bounding view. + panOffset = -nodesArea.center; + + // Calculate the required zoom based on the ratio between the window view and node area rect. + var winSize = _window.Size; + float zoom = 1f; + + // Use the view width to determine zoom to fit the entire node area width. + if (nodesArea.width > nodesArea.height) { + + float widthRatio = nodesArea.width / winSize.width; + zoom = widthRatio; + + if (widthRatio < 1f) { + zoom = 1 / widthRatio; + } + } + + // Use the height to determine zoom. + else { + + float heightRatio = nodesArea.height / winSize.height; + zoom = heightRatio; + + if (heightRatio < 1f) { + zoom = 1 / heightRatio; + } + } + + ZoomScale = zoom; + } + + #endregion + + #region Space Transformations and Mouse Utilities + + public void Pan(Vector2 delta) + { + panOffset += delta * ZoomScale * panSpeed; + } + + public void Zoom(float zoomDirection) + { + float scale = (zoomDirection < 0f) ? (1f - zoomDelta) : (1f + zoomDelta); + + _zoom *= scale; + + float cap = Mathf.Clamp(_zoom.x, minZoom, maxZoom); + _zoom.Set(cap, cap); + } + + public float ZoomScale + { + get { return _zoom.x; } + set + { + float z = Mathf.Clamp(value, minZoom, maxZoom); + _zoom.Set(z, z); + } + } + + /// <summary> + /// Convertes the screen position to graph space. + /// </summary> + public Vector2 ScreenToGraphSpace(Vector2 screenPos) + { + var graphRect = _window.Size; + var center = graphRect.size / 2f; + return (screenPos - center) * ZoomScale - panOffset; + } + + /// <summary> + /// Returns the mouse position in graph space. + /// </summary> + /// <returns></returns> + public Vector2 MousePosition() + { + return ScreenToGraphSpace(Event.current.mousePosition); + } + + /// <summary> + /// Tests if the rect is under the mouse. + /// </summary> + /// <param name="r"></param> + /// <returns></returns> + public bool IsUnderMouse(Rect r) + { + return r.Contains(MousePosition()); + } + + /// <summary> + /// Converts the graph position to screen space. + /// This only works for geometry inside the GUIScaleUtility.BeginScale() + /// </summary> + /// <param name="graphPos"></param> + /// <returns></returns> + public Vector2 GraphToScreenSpace(Vector2 graphPos) + { + return graphPos + _zoomAdjustment + panOffset; + } + + /// <summary> + /// Converts the graph position to screen space. + /// This only works for geometry inside the GUIScaleUtility.BeginScale(). + /// </summary> + /// <param name="graphPos"></param> + public void graphToScreenSpace(ref Vector2 graphPos) + { + graphPos += _zoomAdjustment + panOffset; + } + + /// <summary> + /// Converts the graph position to screen space. + /// This works for geometry NOT inside the GUIScaleUtility.BeginScale(). + /// </summary> + /// <param name="graphPos"></param> + public void graphToScreenSpaceZoomAdj(ref Vector2 graphPos) + { + graphPos = GraphToScreenSpace(graphPos) / ZoomScale; + } + + /// <summary> + /// Executes the callback on the first node that is detected under the mouse. + /// </summary> + /// <param name="callback"></param> + public bool OnMouseOverNode(Action<Node> callback) + { + if (!graph) { + return false; + } + + for (int i = graph.nodes.Count - 1; i >= 0; --i) { + + Node node = graph.nodes[i]; + + if (IsUnderMouse(node.bodyRect)) { + callback(node); + return true; + } + } + + // No node under mouse. + return false; + } + + /// <summary> + /// Tests if the mouse is over an output. + /// </summary> + /// <param name="callback"></param> + /// <returns></returns> + public bool OnMouseOverOutput(Action<NodeOutput> callback) + { + if (!graph) { + return false; + } + + foreach (var node in graph.nodes) { + + foreach (var output in node.Outputs) { + + if (IsUnderMouse(output.bodyRect)) { + callback(output); + return true; + } + } + } + + return false; + } + + /// <summary> + /// Tests if the mouse is over an input. + /// </summary> + /// <param name="callback"></param> + /// <returns></returns> + public bool OnMouseOverInput(Action<NodeInput> callback) + { + if (!graph) { + return false; + } + + foreach (var node in graph.nodes) { + + foreach (var input in node.Inputs) { + + if (IsUnderMouse(input.bodyRect)) { + callback(input); + return true; + } + } + } + + return false; + } + + /// <summary> + /// Tests if the mouse is over the node or the input. + /// </summary> + /// <param name="callback"></param> + /// <returns></returns> + public bool OnMouseOverNode_OrInput(Action<Node> callback) + { + if (!graph) { + return false; + } + + foreach (var node in graph.nodes) { + + if (IsUnderMouse(node.bodyRect)) { + callback(node); + return true; + } + + // Check inputs + else { + + foreach (var input in node.Inputs) { + if (IsUnderMouse(input.bodyRect)) { + callback(node); + return true; + } + } + } + } + + // No node under mouse. + return false; + } + + #endregion + + #region Styles + + private GUIStyle _backgroundStyle; + private GUIStyle backgroundStyle + { + get + { + if (_backgroundStyle == null) { + _backgroundStyle = new GUIStyle(GUI.skin.box); + _backgroundStyle.normal.background = _backTex; + } + + return _backgroundStyle; + } + } + + + private static Rect _modeStatusRect = new Rect(20f, 20f, 250f, 150f); + private static GUIStyle _modeStatusStyle; + private static GUIStyle ModeStatusStyle + { + get + { + if (_modeStatusStyle == null) { + _modeStatusStyle = new GUIStyle(); + _modeStatusStyle.fontSize = 36; + _modeStatusStyle.fontStyle = FontStyle.Bold; + _modeStatusStyle.normal.textColor = new Color(1f, 1f, 1f, 0.2f); + } + + return _modeStatusStyle; + } + } + + #endregion + } +} diff --git a/Other/NodeEditorExamples/Assets/UNEB/Editor/NodeEditor.cs.meta b/Other/NodeEditorExamples/Assets/UNEB/Editor/NodeEditor.cs.meta new file mode 100644 index 00000000..15c06c0c --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Editor/NodeEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: a13b690ab7a11cb4cb37718591f0f20a +timeCreated: 1501781542 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Other/NodeEditorExamples/Assets/UNEB/Editor/NodeEditorWindow.cs b/Other/NodeEditorExamples/Assets/UNEB/Editor/NodeEditorWindow.cs new file mode 100644 index 00000000..e6407f19 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Editor/NodeEditorWindow.cs @@ -0,0 +1,320 @@ + +using System.IO; +using UnityEngine; +using UnityEditor; +using UnityEditor.Callbacks; + +using NodeEditorFramework.Utilities; +using UNEB.Utility; + +namespace UNEB +{ + public class NodeEditorWindow : EditorWindow + { + [MenuItem("Window/Node Editor")] + static void Init() + { + var w = EditorWindow.CreateInstance<NodeEditorWindow>(); + w.titleContent = new GUIContent("Node Editor"); + w.Show(); + } + + public const float kToolbarHeight = 20f; + public const float kToolbarButtonWidth = 50f; + + [SerializeField] + public NodeGraph graph; + + public NodeEditor editor; + public ActionManager actions; + public ActionTriggerSystem triggers; + public NodeEditorState state; + private SaveManager _saveManager; + + public enum Mode { Edit, View }; + private Mode _mode = Mode.Edit; + + void OnEnable() + { + GUIScaleUtility.CheckInit(); + TextureLib.LoadStandardTextures(); + + actions = new ActionManager(this); + editor = new NodeEditor(this); + triggers = new ActionTriggerSystem(actions); + state = new NodeEditorState(); + + _saveManager = new SaveManager(this); + + editor.graph = graph; + + // Make sure that changes from the undo system are immediately + // updated in the window. If not, the undo changes will be + // visually delayed. + actions.OnUndo += Repaint; + actions.OnRedo += Repaint; + + // Always start in edit mode. + // The only way it can be in view mode is if the window is + // already opened and the user selects a some graph. + _mode = Mode.Edit; + + editor.HomeView(); + } + + void OnDisable() + { + _saveManager.Cleanup(); + } + + void OnDestroy() + { + cleanup(); + } + + void OnGUI() + { + // Asset removed. + if (!graph && !_saveManager.IsInNographState()) { + _saveManager.InitState(); + } + + editor.Draw(); + drawToolbar(); + + // This must go after draw calls or there can be + // GUI layout errors. + triggers.Update(); + } + + public void SetGraph(NodeGraph g, Mode mode = Mode.Edit) + { + graph = g; + editor.graph = g; + + // Reset Undo and Redo buffers. + actions.Reset(); + + _mode = mode; + } + + private void cleanup() + { + if (actions != null) { + actions.OnUndo -= Repaint; + actions.OnRedo -= Repaint; + } + + actions.Reset(); + _saveManager.Cleanup(); + } + + private void drawToolbar() + { + EditorGUILayout.BeginHorizontal("Toolbar"); + + if (DropdownButton("File", kToolbarButtonWidth)) { + createFileMenu(); + } + + if (DropdownButton("Edit", kToolbarButtonWidth)) { + createEditMenu(); + } + + if (DropdownButton("View", kToolbarButtonWidth)) { + createViewMenu(); + } + + if (DropdownButton("Settings", kToolbarButtonWidth + 10f)) { + createSettingsMenu(); + } + + if (DropdownButton("Tools", kToolbarButtonWidth)) { + createToolsMenu(); + } + + // Make the toolbar extend all throughout the window extension. + GUILayout.FlexibleSpace(); + drawGraphName(); + + EditorGUILayout.EndHorizontal(); + } + + private void drawGraphName() + { + string graphName = "None"; + if (graph != null) { + graphName = graph.name; + } + + GUILayout.Label(graphName); + } + + private void createFileMenu() + { + var menu = new GenericMenu(); + + menu.AddItem(new GUIContent("Create New"), false, _saveManager.RequestNew); + menu.AddItem(new GUIContent("Load"), false, _saveManager.RequestLoad); + + menu.AddSeparator(""); + menu.AddItem(new GUIContent("Save"), false, _saveManager.RequestSave); + menu.AddItem(new GUIContent("Save As"), false, _saveManager.RequestSaveAs); + + menu.DropDown(new Rect(5f, kToolbarHeight, 0f, 0f)); + } + + private void createEditMenu() + { + var menu = new GenericMenu(); + + menu.AddItem(new GUIContent("Undo"), false, actions.UndoAction); + menu.AddItem(new GUIContent("Redo"), false, actions.RedoAction); + + menu.DropDown(new Rect(55f, kToolbarHeight, 0f, 0f)); + } + + private void createViewMenu() + { + var menu = new GenericMenu(); + + menu.AddItem(new GUIContent("Home"), false, editor.HomeView); + menu.AddItem(new GUIContent("Zoom In"), false, () => { editor.Zoom(-1); }); + menu.AddItem(new GUIContent("Zoom Out"), false, () => { editor.Zoom(1); }); + + menu.DropDown(new Rect(105f, kToolbarHeight, 0f, 0f)); + } + + private void createSettingsMenu() + { + var menu = new GenericMenu(); + + menu.AddItem(new GUIContent("Show Guide"), editor.bDrawGuide, editor.ToggleDrawGuide); + + menu.DropDown(new Rect(155f, kToolbarHeight, 0f, 0f)); + } + + private void createToolsMenu() + { + var menu = new GenericMenu(); + + menu.AddItem(new GUIContent("Add Test Nodes"), false, addTestNodes); + menu.AddItem(new GUIContent("Clear Nodes"), false, clearNodes); + + menu.DropDown(new Rect(215f, kToolbarHeight, 0f, 0f)); + } + + public bool DropdownButton(string name, float width) + { + return GUILayout.Button(name, EditorStyles.toolbarDropDown, GUILayout.Width(width)); + } + + private void addTestNodes() + { + if (graph) { + + for (int x = 0; x < 10; x++) { + for (int y = 0; y < 10; y++) { + + var node = SaveManager.CreateNode<BasicNode>(graph); + + float xpos = x * Node.kDefaultSize.x * 1.5f; + float ypos = y * Node.kDefaultSize.y * 1.5f; + node.bodyRect.position = new Vector2(xpos, ypos); + } + } + } + } + + private void clearNodes() + { + if (graph) { + + foreach (var node in graph.nodes) { + ScriptableObject.DestroyImmediate(node, true); + } + + actions.Reset(); + graph.nodes.Clear(); + } + } + + /// <summary> + /// The size of the window. + /// </summary> + public Rect Size + { + get { return new Rect(Vector2.zero, position.size); } + } + + /// <summary> + /// The rect used to filter input. + /// This is so the toolbar is not ignored by editor inputs. + /// </summary> + public Rect InputRect + { + get + { + var rect = Size; + + rect.y += kToolbarHeight; + rect.height -= kToolbarHeight; + + return rect; + } + } + + public Mode GetMode() + { + return _mode; + } + + /// <summary> + /// Opens up the node editor window from asset selection. + /// </summary> + /// <param name="instanceID"></param> + /// <param name="line"></param> + /// <returns></returns> + [OnOpenAsset(1)] + private static bool OpenGraphAsset(int instanceID, int line) + { + var graphSelected = EditorUtility.InstanceIDToObject(instanceID) as NodeGraph; + + if (graphSelected != null) { + + NodeEditorWindow windowToUse = null; + + // Try to find an editor window without a graph... + var windows = Resources.FindObjectsOfTypeAll<NodeEditorWindow>(); + foreach (var w in windows) { + + // The canvas is already opened + if (w.graph == graphSelected) { + return false; + } + + // Found a window with no active canvas. + if (w.graph == null) { + windowToUse = w; + break; + } + } + + // No windows available...just make a new one. + if (!windowToUse) { + windowToUse = EditorWindow.CreateInstance<NodeEditorWindow>(); + windowToUse.titleContent = new GUIContent("Node Editor"); + windowToUse.Show(); + } + + windowToUse.SetGraph(graphSelected); + windowToUse._saveManager.InitState(); + windowToUse.Repaint(); + + return true; + } + + return false; + } + } +}
\ No newline at end of file diff --git a/Other/NodeEditorExamples/Assets/UNEB/Editor/NodeEditorWindow.cs.meta b/Other/NodeEditorExamples/Assets/UNEB/Editor/NodeEditorWindow.cs.meta new file mode 100644 index 00000000..84abdc2e --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Editor/NodeEditorWindow.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: e9e0c3fd288222b4ea49d6b9eb70ccaa +timeCreated: 1501781512 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Other/NodeEditorExamples/Assets/UNEB/Editor/SaveManager.cs b/Other/NodeEditorExamples/Assets/UNEB/Editor/SaveManager.cs new file mode 100644 index 00000000..c9825ae0 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Editor/SaveManager.cs @@ -0,0 +1,473 @@ + +using System; +using System.IO; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using UnityEditor.Callbacks; + +using Bonsai.Utility; + +namespace UNEB +{ + /// <summary> + /// Handles the saving and loading of tree assets. + /// </summary> + public class SaveManager + { + public enum SaveState { NoGraph, TempGraph, SavedGraph }; + + // The FSM used to structure the logic control of saving and loading. + private StateMachine<SaveState> _saveFSM; + + // The events that dictate the flow of the manager's FSM. + private enum SaveOp { None, New, Load, Save, SaveAs }; + private SaveOp _saveOp = SaveOp.None; + + private NodeEditorWindow _window; + + private const string kRootUNEB = "UNEB"; + + // Path that stores temporary graphs. + private const string kTempGraphDirectory = "TempGraphsUNEB"; + private const string kTempFileName = "TempNodeGraphUNEB"; + + public SaveManager(NodeEditorWindow w) + { + _window = w; + + _saveFSM = new StateMachine<SaveState>(); + + var noGraph = new StateMachine<SaveState>.State(SaveState.NoGraph); + var tempGraph = new StateMachine<SaveState>.State(SaveState.TempGraph); + var savedGraph = new StateMachine<SaveState>.State(SaveState.SavedGraph); + + _saveFSM.AddState(noGraph); + _saveFSM.AddState(tempGraph); + _saveFSM.AddState(savedGraph); + + // Actions to take when starting out on a window with no graph. + _saveFSM.AddTransition(noGraph, tempGraph, isNewRequested, createNewOnto_Window_WithTempOrEmpty); + _saveFSM.AddTransition(noGraph, savedGraph, isLoadRequested, loadOnto_EmptyWindow); + + // Actions to take when the window has a temp graph. + _saveFSM.AddTransition(tempGraph, tempGraph, isNewRequested, createNewOnto_Window_WithTempOrEmpty); + _saveFSM.AddTransition(tempGraph, savedGraph, isSaveOrSaveAsRequested, saveTempAs); + _saveFSM.AddTransition(tempGraph, savedGraph, isLoadRequested, loadOnto_Window_WithTempgraph); + + // Actions to take when the window has a valid graph (already saved). + _saveFSM.AddTransition(savedGraph, savedGraph, isSaveRequested, save); + _saveFSM.AddTransition(savedGraph, savedGraph, isSaveAsRequested, saveCloneAs); + _saveFSM.AddTransition(savedGraph, savedGraph, isLoadRequested, loadOnto_Window_WithSavedgraph); + _saveFSM.AddTransition(savedGraph, tempGraph, isNewRequested, createNewOnto_Window_WithSavedgraph); + + // Consume the save operation even after the transition is made. + _saveFSM.OnStateChangedEvent += () => { _saveOp = SaveOp.None; }; + + InitState(); + + NodeConnection.OnConnectionCreated -= saveConnection; + NodeConnection.OnConnectionCreated += saveConnection; + } + + /// <summary> + /// This hanldes setting up the proper state based on the window's graph. + /// </summary> + internal void InitState() + { + // If the window has a valid graph and editable. + if (_window.graph != null && _window.GetMode() == NodeEditorWindow.Mode.Edit) { + + string path = getCurrentGraphPath(); + + // If the graph is temp. + if (path.Contains(kTempGraphDirectory)) { + SetState(SaveState.TempGraph); + } + + // If the graph is saved (not a temp). + else { + SetState(SaveState.SavedGraph); + } + } + + // Window is fresh, no graph yet set. + else { + SetState(SaveState.NoGraph); + } + } + + /// <summary> + /// Get the path from open file dialog. + /// </summary> + /// <returns></returns> + private string getGraphFilePath() + { + string path = EditorUtility.OpenFilePanel("Open Node Graph", "Assets/", "asset"); + + // If the path is outside the project's asset folder. + if (!path.Contains(Application.dataPath)) { + + // If the selection was not cancelled... + if (!string.IsNullOrEmpty(path)) { + _window.ShowNotification(new GUIContent("Please select a Graph asset within the project's Asset folder.")); + return null; + } + } + + return path; + } + + /// <summary> + /// Assumes that the path is already valid. + /// </summary> + /// <param name="path"></param> + private void loadGraph(string path) + { + int assetIndex = path.IndexOf("/Assets/"); + path = path.Substring(assetIndex + 1); + + var graph = AssetDatabase.LoadAssetAtPath<NodeGraph>(path); + _window.SetGraph(graph); + } + + /// <summary> + /// Gets the file path to save the canavs at. + /// </summary> + /// <returns></returns> + private string getSaveFilePath() + { + string path = EditorUtility.SaveFilePanelInProject("Save Node Graph", "NewNodeGraph", "asset", "Select a destination to save the graph."); + + if (string.IsNullOrEmpty(path)) { + return ""; + } + + return path; + } + + #region Save Operations + + /// <summary> + /// Creates and adds a node to the graph. + /// </summary> + /// <param name="t"></param> + /// <param name="bt"></param> + /// <returns></returns> + public static Node CreateNode(Type t, NodeGraph g) + { + try { + + var node = ScriptableObject.CreateInstance(t) as Node; + AssetDatabase.AddObjectToAsset(node, g); + + // Optional, set reference to graph: node.graph = g + + node.Init(); + g.Add(node); + return node; + } + + catch (Exception e) { + throw new UnityException(e.Message); + } + } + + /// <summary> + /// Creates and adds a node to the graph. + /// </summary> + /// <typeparam name="T"></typeparam> + /// <param name="bt"></param> + /// <returns></returns> + public static Node CreateNode<T>(NodeGraph g) where T : Node + { + var node = ScriptableObject.CreateInstance<T>(); + AssetDatabase.AddObjectToAsset(node, g); + + // Optional, set reference to graph: node.graph = g + + node.Init(); + g.Add(node); + return node; + } + + /// <summary> + /// Creates a graph asset and saves it. + /// </summary> + /// <param name="path">The full path including name and extension.</param> + /// <returns></returns> + public static NodeGraph CreateNodeGraph(string path) + { + // We create a graph asset in the data base in order to add node assets + // under the graph. This way things are organized in the editor. + // + // The drawback is that we need to create a temp asset for the tree + // and make sure it does not linger if the temp asset is discarded. + // + // This means that we need to have a persistent directoy to store temp + // assets. + + var graph = ScriptableObject.CreateInstance<NodeGraph>(); + + AssetDatabase.CreateAsset(graph, path); + AssetDatabase.SaveAssets(); + AssetDatabase.Refresh(); + + return graph; + } + + /// <summary> + /// Creates a new temporary node graph. + /// </summary> + /// <returns></returns> + private NodeGraph createNew() + { + string tempPath = getTempFilePath(); + + if (!string.IsNullOrEmpty(tempPath)) { + + _window.ShowNotification(new GUIContent("New Graph Created")); + return CreateNodeGraph(tempPath); + } + + return null; + } + + // Create a new temp graph on an empty window or with a temp graph. + private bool createNewOnto_Window_WithTempOrEmpty() + { + _window.SetGraph(createNew()); + return true; + } + + // Saves the current active graph then loads a new graph. + private bool createNewOnto_Window_WithSavedgraph() + { + // Save the old graph to avoid loss. + AssetDatabase.SaveAssets(); + + _window.SetGraph(createNew()); + + return true; + } + + // Load a graph to a window that has no graph active. + private bool loadOnto_EmptyWindow() + { + loadGraph(getGraphFilePath()); + return true; + } + + // Load a graph to a window that has a temp graph active. + private bool loadOnto_Window_WithTempgraph() + { + string path = getGraphFilePath(); + + if (!string.IsNullOrEmpty(path)) { + + // Get rid of the temporary graph. + AssetDatabase.DeleteAsset(getCurrentGraphPath()); + loadGraph(path); + return true; + } + + return false; + } + + // Load a graph to a window that has a saved graph active. + private bool loadOnto_Window_WithSavedgraph() + { + string path = getGraphFilePath(); + + if (!string.IsNullOrEmpty(path)) { + + // Save the old graph. + save(); + loadGraph(path); + return true; + } + + return false; + } + + // Makes the temporary graph into a saved graph. + private bool saveTempAs() + { + string newPath = getSaveFilePath(); + string currentPath = getCurrentGraphPath(); + + //If asset exists on path, delete it first. + if (AssetDatabase.LoadAssetAtPath<ScriptableObject>(newPath) != null) { + AssetDatabase.DeleteAsset(newPath); + } + + string result = AssetDatabase.ValidateMoveAsset(currentPath, newPath); + + if (result.Length == 0) { + AssetDatabase.MoveAsset(currentPath, newPath); + save(); + return true; + } + + else { + Debug.LogError(result); + return false; + } + } + + // Copies the current active graph to a new location. + private bool saveCloneAs() + { + string newPath = getSaveFilePath(); + + if (!string.IsNullOrEmpty(newPath)) { + + string currentPath = getCurrentGraphPath(); + + AssetDatabase.CopyAsset(currentPath, newPath); + AssetDatabase.SetMainObject(_window.graph, currentPath); + + save(); + return true; + } + + return false; + } + + // Saves the current graph (not a temp graph). + private bool save() + { + _window.graph.OnSave(); + AssetDatabase.SaveAssets(); + AssetDatabase.Refresh(); + + _window.ShowNotification(new GUIContent("Graph Saved")); + return true; + } + + // Helper method for the NodeConnection.OnConnectionCreated callback. + private void saveConnection(NodeConnection conn) + { + if (!AssetDatabase.Contains(conn)) { + AssetDatabase.AddObjectToAsset(conn, _window.graph); + } + } + + #endregion + + /// <summary> + /// Handles deleting temporary graph or saving valid graph. + /// </summary> + internal void Cleanup() + { + // Only save/delete things if we are in edit mode. + if (_window.GetMode() != NodeEditorWindow.Mode.Edit) { + return; + } + + SaveState state = _saveFSM.CurrentState.Value; + + if (state == SaveState.TempGraph) { + AssetDatabase.DeleteAsset(getCurrentGraphPath()); + } + + else if (state == SaveState.SavedGraph) { + save(); + } + } + + /* + * These are conditions used the save FSM to know when to transition. + * */ + private bool isNewRequested() { return _saveOp == SaveOp.New; } + private bool isLoadRequested() { return _saveOp == SaveOp.Load; } + private bool isSaveRequested() { return _saveOp == SaveOp.Save; } + private bool isSaveAsRequested() { return _saveOp == SaveOp.SaveAs; } + private bool isSaveOrSaveAsRequested() { return isSaveAsRequested() || isSaveRequested(); } + + /* + * These are the events that drive the save manager. + * Whenever one of this is fired, the save operation is set + * and the save FSM updated. + * */ + internal void RequestNew() { _saveOp = SaveOp.New; _saveFSM.Update(); } + internal void RequestLoad() { _saveOp = SaveOp.Load; _saveFSM.Update(); } + internal void RequestSave() { _saveOp = SaveOp.Save; _saveFSM.Update(); } + internal void RequestSaveAs() { _saveOp = SaveOp.SaveAs; _saveFSM.Update(); } + + private string getTempFilePath() + { + string tempRoot = getTempDirPath(); + + if (string.IsNullOrEmpty(tempRoot)) { + return ""; + } + + string filename = kTempFileName + _window.GetInstanceID().ToString().Ext("asset"); + return tempRoot.Dir(filename); + } + + internal void SetState(SaveState state) + { + _saveFSM.SetCurrentState(state); + } + + internal bool IsInNographState() + { + return _saveFSM.CurrentState.Value == SaveState.NoGraph; + } + + internal SaveState CurrentState() + { + return _saveFSM.CurrentState.Value; + } + + private string getCurrentGraphPath() + { + return AssetDatabase.GetAssetPath(_window.graph); + } + + private string getTempDirPath() + { + string[] dirs = Directory.GetDirectories(Application.dataPath, kTempGraphDirectory, SearchOption.AllDirectories); + + // Return first occurance containing targetFolderName. + if (dirs.Length != 0) { + return getTempPathRelativeToAssets(dirs[0]); + } + + // Could not find anything. Make the folder + string rootPath = getPathToRootUNEB(); + + if (!string.IsNullOrEmpty(rootPath)) { + var dirInfo = Directory.CreateDirectory(rootPath.Dir(kTempGraphDirectory)); + return getTempPathRelativeToAssets(dirInfo.FullName); + } + + else { + return ""; + } + } + + private static string getPathToRootUNEB() + { + // Find the UNEB project root directory within the Unity project. + var dirs = Directory.GetDirectories(Application.dataPath, kRootUNEB, SearchOption.AllDirectories); + + if (dirs.Length != 0) { + return dirs[0]; + } + else { + Debug.LogError("Could not find project root: /" + kRootUNEB + '/'); + return ""; + } + } + + // Assumes that the fullTempPath is valid. + private static string getTempPathRelativeToAssets(string fullTempPath) + { + int index = fullTempPath.IndexOf("Assets"); + return fullTempPath.Substring(index); + } + } +}
\ No newline at end of file diff --git a/Other/NodeEditorExamples/Assets/UNEB/Editor/SaveManager.cs.meta b/Other/NodeEditorExamples/Assets/UNEB/Editor/SaveManager.cs.meta new file mode 100644 index 00000000..48c5f044 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Editor/SaveManager.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 2c1fb70b507fdef4e947a73357d0d811 +timeCreated: 1503072834 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Other/NodeEditorExamples/Assets/UNEB/FlowTraversal.cs b/Other/NodeEditorExamples/Assets/UNEB/FlowTraversal.cs new file mode 100644 index 00000000..eb795dfc --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/FlowTraversal.cs @@ -0,0 +1,12 @@ + +namespace UNEB +{ + /// <summary> + /// Uni-directional graph traversal. + /// Does not support cycles. + /// </summary> + public class FlowTraversal + { + + } +}
\ No newline at end of file diff --git a/Other/NodeEditorExamples/Assets/UNEB/FlowTraversal.cs.meta b/Other/NodeEditorExamples/Assets/UNEB/FlowTraversal.cs.meta new file mode 100644 index 00000000..69e5ca25 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/FlowTraversal.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d88ae7fbcd48f58469e623dac843578b +timeCreated: 1503204799 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Other/NodeEditorExamples/Assets/UNEB/Node.cs b/Other/NodeEditorExamples/Assets/UNEB/Node.cs new file mode 100644 index 00000000..a00ac329 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Node.cs @@ -0,0 +1,305 @@ + +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using UNEB.Utility; + +namespace UNEB +{ + /// <summary> + /// The visual representation of a logic unit such as an object or function. + /// </summary> + public abstract class Node : ScriptableObject + { + public static readonly Vector2 kDefaultSize = new Vector2(140f, 110f); + + /// <summary> + /// The space reserved between knobs. + /// </summary> + public const float kKnobOffset = 4f; + + /// <summary> + /// The space reserved for the header (title) of the node. + /// </summary> + public const float kHeaderHeight = 15f; + + /// <summary> + /// The max label width for a field in the body. + /// </summary> + public const float kBodyLabelWidth = 100f; + + /// <summary> + /// The rect of the node in canvas space. + /// </summary> + [HideInInspector] + public Rect bodyRect; + + /// <summary> + /// How much additional offset to apply when resizing. + /// </summary> + public const float resizePaddingX = 20f; + + [SerializeField, HideInInspector] + private List<NodeOutput> _outputs = new List<NodeOutput>(); + + [SerializeField, HideInInspector] + private List<NodeInput> _inputs = new List<NodeInput>(); + + // Hides the node asset. + // Sets up the name via type information. + void OnEnable() + { + hideFlags = HideFlags.HideInHierarchy; + name = GetType().Name; + +#if UNITY_EDITOR + name = ObjectNames.NicifyVariableName(name); +#endif + + } + + /// <summary> + /// Always call the base OnDisable() to cleanup the connection objects. + /// </summary> + protected virtual void OnDestroy() + { + _inputs.RemoveAll( + (input) => + { + ScriptableObject.DestroyImmediate(input, true); + return true; + }); + + _outputs.RemoveAll( + (output) => + { + ScriptableObject.DestroyImmediate(output, true); + return true; + }); + } + + /// <summary> + /// Use this for initialization. + /// </summary> + public virtual void Init() { + bodyRect.size = kDefaultSize; + } + + public virtual void OnNodeGUI() + { + OnNodeHeaderGUI(); + OnConnectionsGUI(); + onBodyGuiInternal(); + } + + /// <summary> + /// Renders the node connections. By default, after the header. + /// </summary> + public virtual void OnConnectionsGUI() + { + int inputCount = _inputs.Count; + int outputCount = _outputs.Count; + + int maxCount = (int)Mathf.Max(inputCount, outputCount); + + // The entire knob section is stacked rows of inputs and outputs. + for (int i = 0; i < maxCount; ++i) { + + GUILayout.BeginHorizontal(); + + // Render the knob layout horizontally. + if (i < inputCount) _inputs[i].OnConnectionGUI(i); + if (i < outputCount) _outputs[i].OnConnectionGUI(i); + + GUILayout.EndHorizontal(); + } + } + + /// <summary> + /// Render the title/header of the node. By default, renders on top of the node. + /// </summary> + public virtual void OnNodeHeaderGUI() + { + // Draw header + GUILayout.Box(name, HeaderStyle); + } + + /// <summary> + /// Draws the body of the node. By default, after the connections. + /// </summary> + public virtual void OnBodyGUI() { } + + // Handles the coloring and layout of the body. + // This is for convenience so the user does not need to worry about this boiler plate code. + protected virtual void onBodyGuiInternal() + { + float oldLabelWidth = EditorGUIUtility.labelWidth; + EditorGUIUtility.labelWidth = kBodyLabelWidth; + + // Cache the old label style. + // Do this first before changing the EditorStyles.label style. + // So the original values are kept. + var oldLabelStyle = UnityLabelStyle; + + // Setup new values for the label style. + EditorStyles.label.normal = DefaultStyle.normal; + EditorStyles.label.active = DefaultStyle.active; + EditorStyles.label.focused = DefaultStyle.focused; + + EditorGUILayout.BeginVertical(); + + GUILayout.Space(kKnobOffset); + OnBodyGUI(); + + // Revert back to old label style. + EditorStyles.label.normal = oldLabelStyle.normal; + EditorStyles.label.active = oldLabelStyle.active; + EditorStyles.label.focused = oldLabelStyle.focused; + + EditorGUIUtility.labelWidth = oldLabelWidth; + EditorGUILayout.EndVertical(); + } + + public NodeInput AddInput(string name = "input", bool multipleConnections = false) + { + var input = NodeInput.Create(this, multipleConnections); + input.name = name; + _inputs.Add(input); + + return input; + } + + public NodeOutput AddOutput(string name = "output", bool multipleConnections = false) + { + var output = NodeOutput.Create(this, multipleConnections); + output.name = name; + _outputs.Add(output); + + return output; + } + + /// <summary> + /// Called when the output knob had an input connection removed. + /// </summary> + /// <param name="removedInput"></param> + public virtual void OnInputConnectionRemoved(NodeInput removedInput) { } + + /// <summary> + /// Called when the output knob made a connection to an input knob. + /// </summary> + /// <param name="addedInput"></param> + public virtual void OnNewInputConnection(NodeInput addedInput) { } + + public IEnumerable<NodeOutput> Outputs + { + get { return _outputs; } + } + + public IEnumerable<NodeInput> Inputs + { + get { return _inputs; } + } + + public int InputCount + { + get { return _inputs.Count; } + } + + public int OutputCount + { + get { return _outputs.Count; } + } + + public NodeInput GetInput(int index) + { + return _inputs[index]; + } + + public NodeOutput GetOutput(int index) + { + return _outputs[index]; + } + + /// <summary> + /// Get the Y value of the top header. + /// </summary> + public float HeaderTop + { + get { return bodyRect.yMin + kHeaderHeight; } + } + + /// <summary> + /// Resize the node to fit the knobs. + /// </summary> + public void FitKnobs() + { + int maxCount = (int)Mathf.Max(_inputs.Count, _outputs.Count); + + float totalKnobsHeight = maxCount * NodeConnection.kMinSize.y; + float totalOffsetHeight = (maxCount - 1) * kKnobOffset; + + float heightRequired = totalKnobsHeight + totalOffsetHeight + kHeaderHeight; + + // Add some extra height at the end. + bodyRect.height = heightRequired + kHeaderHeight / 2f; + } + + #region Styles and Contents + + private static GUIStyle _unityLabelStyle; + + /// <summary> + /// Caches the default EditorStyle. + /// There is a strange bug with it being overriden when opening an Animation window. + /// </summary> + public static GUIStyle UnityLabelStyle + { + get + { + if (_unityLabelStyle == null) { + _unityLabelStyle = new GUIStyle(EditorStyles.label); + } + + return _unityLabelStyle; + } + } + + private static GUIStyle _defStyle; + public static GUIStyle DefaultStyle + { + get + { + if (_defStyle == null) { + _defStyle = new GUIStyle(EditorStyles.label); + _defStyle.normal.textColor = Color.white * 0.9f; + _defStyle.active.textColor = ColorExtensions.From255(126, 186, 255) * 0.9f; + _defStyle.focused.textColor = ColorExtensions.From255(126, 186, 255); + } + + return _defStyle; + } + } + + private static GUIStyle _headerStyle; + public GUIStyle HeaderStyle + { + get + { + if (_headerStyle == null) { + + _headerStyle = new GUIStyle(); + + _headerStyle.stretchWidth = true; + _headerStyle.alignment = TextAnchor.MiddleLeft; + _headerStyle.padding.left = 5; + _headerStyle.normal.textColor = Color.white * 0.9f; + _headerStyle.fixedHeight = kHeaderHeight; + } + + return _headerStyle; + } + } + + #endregion + } +}
\ No newline at end of file diff --git a/Other/NodeEditorExamples/Assets/UNEB/Node.cs.meta b/Other/NodeEditorExamples/Assets/UNEB/Node.cs.meta new file mode 100644 index 00000000..19287a49 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Node.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 7701d85b0845e514cbf1da5e92a37927 +timeCreated: 1501781551 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Other/NodeEditorExamples/Assets/UNEB/NodeConnection.cs b/Other/NodeEditorExamples/Assets/UNEB/NodeConnection.cs new file mode 100644 index 00000000..40f4d6de --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/NodeConnection.cs @@ -0,0 +1,91 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace UNEB +{ + public abstract class NodeConnection : ScriptableObject + { + public static readonly Vector2 kMinSize = new Vector2(12f, 12f); + public static readonly Vector2 kMinHalfSize = kMinSize / 2f; + + [HideInInspector] + public Rect bodyRect = new Rect(Vector2.zero, kMinSize); + + public System.Func<object> getValue; + + public static System.Action<NodeConnection> OnConnectionCreated; + + [SerializeField, HideInInspector] + protected Node parentNode; + + void OnEnable() + { + hideFlags = HideFlags.HideInHierarchy; + } + + public virtual void Init(Node parent) + { + name = "connection"; + parentNode = parent; + } + + /// <summary> + /// The node associated with this knob. + /// </summary> + public Node ParentNode + { + get { return parentNode; } + } + + public abstract GUIStyle GetStyle(); + + public virtual void OnConnectionGUI(int order) + { + OnNameGUI(); + + // Position the knobs properly for the draw pass of the knobs in the editor. + float yPos = parentNode.HeaderTop + order * GetStyle().fixedHeight + Node.kKnobOffset; + bodyRect.center = new Vector2(GetNodeAnchor(), 0f); + bodyRect.y = yPos; + } + + public virtual void OnNameGUI() + { + GUILayout.Label(Content, GetStyle()); + } + + private GUIContent _content; + private GUIContent Content + { + get + { + if (_content == null) { + _content = new GUIContent(name); + } + + return _content; + } + } + + /// <summary> + /// What side of the node should the knob anchor to. + /// </summary> + /// <returns></returns> + public abstract float GetNodeAnchor(); + + /// <summary> + /// Attempts to get the value of the specified type. + /// </summary> + /// <typeparam name="T"></typeparam> + /// <returns></returns> + public T GetValue<T>() + { + if (getValue != null) { + return (T)getValue(); + } + + return default(T); + } + } +}
\ No newline at end of file diff --git a/Other/NodeEditorExamples/Assets/UNEB/NodeConnection.cs.meta b/Other/NodeEditorExamples/Assets/UNEB/NodeConnection.cs.meta new file mode 100644 index 00000000..1f8e4fa4 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/NodeConnection.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 4a46115d42daa3e438d70eca59efba6b +timeCreated: 1501804873 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Other/NodeEditorExamples/Assets/UNEB/NodeEditorState.cs b/Other/NodeEditorExamples/Assets/UNEB/NodeEditorState.cs new file mode 100644 index 00000000..f11cddc2 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/NodeEditorState.cs @@ -0,0 +1,18 @@ + +using System.Collections.Generic; +using UnityEngine; + +namespace UNEB +{ + public class NodeEditorState + { + + public Node selectedNode; + public Vector2 lastClickedPosition; + + public NodeOutput selectedOutput; + public NodeInput selectedInput; + + public System.Type typeToCreate; + } +}
\ No newline at end of file diff --git a/Other/NodeEditorExamples/Assets/UNEB/NodeEditorState.cs.meta b/Other/NodeEditorExamples/Assets/UNEB/NodeEditorState.cs.meta new file mode 100644 index 00000000..f13de28d --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/NodeEditorState.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c4faacf28f5e1be4c9d441c74e2c9eda +timeCreated: 1501899343 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Other/NodeEditorExamples/Assets/UNEB/NodeGraph.cs b/Other/NodeEditorExamples/Assets/UNEB/NodeGraph.cs new file mode 100644 index 00000000..e977e698 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/NodeGraph.cs @@ -0,0 +1,57 @@ + +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace UNEB +{ + /// <summary> + /// Represents a graph of nodes. + /// </summary> + public class NodeGraph : ScriptableObject + { + /// <summary> + /// The types of nodes accepted by the graph. + /// </summary> + public static HashSet<Type> nodeTypes = new HashSet<Type>(); + + [HideInInspector] + public List<Node> nodes = new List<Node>(); + + /// <summary> + /// Add a node to the graph. + /// It is recommended that the save manager adds the nodes. + /// </summary> + /// <param name="n"></param> + public void Add(Node n) + { + nodes.Add(n); + } + + /// <summary> + /// Removes a node from the graph but it is not destroyed. + /// </summary> + /// <param name="node"></param> + public void Remove(Node node) + { + nodes.Remove(node); + } + + /// <summary> + /// Put the node at the end of the node list. + /// </summary> + /// <param name="node"></param> + public void PushToEnd(Node node) + { + if (nodes.Remove(node)) { + nodes.Add(node); + } + } + + /// <summary> + /// Gets called right before the graph is saved. + /// Can be used to setup things before saving like sorting nodes. + /// </summary> + public virtual void OnSave() { } + } +}
\ No newline at end of file diff --git a/Other/NodeEditorExamples/Assets/UNEB/NodeGraph.cs.meta b/Other/NodeEditorExamples/Assets/UNEB/NodeGraph.cs.meta new file mode 100644 index 00000000..c2ffc888 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/NodeGraph.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 5472e37c6bced914daa030c486155845 +timeCreated: 1501782614 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Other/NodeEditorExamples/Assets/UNEB/NodeInput.cs b/Other/NodeEditorExamples/Assets/UNEB/NodeInput.cs new file mode 100644 index 00000000..fab62c10 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/NodeInput.cs @@ -0,0 +1,114 @@ + +using System.Collections.Generic; +using System.Linq; +using UnityEngine; + +namespace UNEB +{ + public class NodeInput : NodeConnection + { + [SerializeField] + private bool _bCanHaveMultipleConnections; + + [SerializeField] + private List<NodeOutput> _outputs = new List<NodeOutput>(); + + private GUIStyle _style; + + public virtual void Init(Node parent, bool multipleConnections = true) + { + base.Init(parent); + name = "input"; + _bCanHaveMultipleConnections = multipleConnections; + } + + /// <summary> + /// Should only be called by NodeOutput + /// </summary> + /// <param name="output"></param> + internal void Connect(NodeOutput output) + { + if (!_outputs.Contains(output)) + _outputs.Add(output); + } + + /// <summary> + /// Should only be called by NodeOutput. + /// </summary> + internal void Disconnect(NodeOutput output) + { + if (_outputs.Contains(output)) + _outputs.Remove(output); + } + + public bool HasOutputConnected() + { + return _outputs.Count > 0; + } + + public void RemoveAll() { + // Cache the outputs since in order to disconnect them, + // they must be removed from _outputs List. + var outputs = new List<NodeOutput>(_outputs); + + _outputs.Clear(); + + foreach (NodeOutput output in outputs) { + output.Remove(this); + } + } + + public List<NodeOutput> Outputs + { + get { return _outputs; } + } + + public int OutputCount + { + get { return _outputs.Count; } + } + + public NodeOutput GetOutput(int index) + { + return _outputs[index]; + } + + public override GUIStyle GetStyle() + { + if (_style == null) { + + _style = new GUIStyle(); + + _style.fixedHeight = kMinSize.y + Node.kKnobOffset; + _style.alignment = TextAnchor.MiddleLeft; + _style.normal.textColor = Color.white * 0.9f; + _style.padding.left = (int)kMinHalfSize.x + 5; + } + + return _style; + } + + /// <summary> + /// The input is anchored at the left side of the node. + /// </summary> + /// <returns></returns> + public override float GetNodeAnchor() + { + return parentNode.bodyRect.xMin; + } + + public bool bCanHaveMultipleConnections + { + get { return _bCanHaveMultipleConnections; } + } + + public static NodeInput Create(Node parent, bool multipleConnections = false) + { + var input = ScriptableObject.CreateInstance<NodeInput>(); + input.Init(parent, multipleConnections); + + NodeConnection.OnConnectionCreated(input); + return input; + } + } +}
\ No newline at end of file diff --git a/Other/NodeEditorExamples/Assets/UNEB/NodeInput.cs.meta b/Other/NodeEditorExamples/Assets/UNEB/NodeInput.cs.meta new file mode 100644 index 00000000..62740a8d --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/NodeInput.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 0bace920f087ccf4595fad22948ac526 +timeCreated: 1501804790 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Other/NodeEditorExamples/Assets/UNEB/NodeOutput.cs b/Other/NodeEditorExamples/Assets/UNEB/NodeOutput.cs new file mode 100644 index 00000000..4a64ec73 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/NodeOutput.cs @@ -0,0 +1,157 @@ + +using System.Linq; +using System.Collections.Generic; +using UnityEngine; + +namespace UNEB +{ + public class NodeOutput : NodeConnection + { + [SerializeField] + private bool _bCanHaveMultipleConnections; + + [SerializeField] + private List<NodeInput> _inputs = new List<NodeInput>(); + + private GUIStyle _style; + + public virtual void Init(Node parent, bool multipleConnections = true) + { + base.Init(parent); + _bCanHaveMultipleConnections = multipleConnections; + } + + public List<NodeInput> Inputs + { + get { return _inputs; } + } + + public int InputCount + { + get { return _inputs.Count; } + } + + public NodeInput GetInput(int index) + { + return _inputs[index]; + } + + /// <summary> + /// Returns true if the connection was added successfully. + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + public bool Add(NodeInput input) + { + if (!CanConnectInput(input)) { + return false; + } + + // The input cannot be connected to anything. + // This test is not inside the CanConnectInput() because + // an action can remove the old connections automatically to make it + // easier for the user to change connections between nodes. + if (input.HasOutputConnected() && !input.bCanHaveMultipleConnections) { + + // Changes to the inputs need to be properly handled by the Action system, + // so it works with undo. + Debug.LogWarning("Cannot add an input that is already connected"); + return false; + } + + input.Connect(this); + _inputs.Add(input); + + parentNode.OnNewInputConnection(input); + + return true; + } + + /// <summary> + /// Tests to see if the output can be connected to the input. + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + public bool CanConnectInput(NodeInput input) + { + if (input == null) { + Debug.LogError("Attempted to add a null input."); + return false; + } + + // Avoid self-connecting + if (parentNode.Inputs.Contains(input)) { + Debug.LogWarning("Cannot self connect."); + return false; + } + + // Avoid connecting when it is already connected. + if (input.Outputs.Contains(this)) { + Debug.LogWarning("Already Connected"); + return false; + } + + return true; + } + + public void Remove(NodeInput input) + { + if (_inputs.Remove(input)) { + parentNode.OnInputConnectionRemoved(input); + input.Disconnect(this); + } + } + + public void RemoveAll() + { + // Cache the inputs since in order to disconnect them, + // they must be removed from _inputs List. + var inputs = new List<NodeInput>(_inputs); + + _inputs.Clear(); + + foreach (NodeInput input in inputs) { + parentNode.OnInputConnectionRemoved(input); + input.Disconnect(this); + } + } + + public override GUIStyle GetStyle() + { + if (_style == null) { + + _style = new GUIStyle(); + + _style.fixedHeight = kMinSize.y + Node.kKnobOffset; + _style.alignment = TextAnchor.MiddleRight; + _style.normal.textColor = Color.white * 0.9f; + _style.padding.right = (int)kMinHalfSize.x + 5; + } + + return _style; + } + + /// <summary> + /// The output is anchored at the right side of the node. + /// </summary> + /// <returns></returns> + public override float GetNodeAnchor() + { + return parentNode.bodyRect.xMax; + } + + public bool bCanHaveMultipleConnections + { + get { return _bCanHaveMultipleConnections; } + } + + public static NodeOutput Create(Node parent, bool multipleConnections = true) + { + var output = ScriptableObject.CreateInstance<NodeOutput>(); + output.Init(parent, multipleConnections); + + NodeConnection.OnConnectionCreated(output); + return output; + } + } +}
\ No newline at end of file diff --git a/Other/NodeEditorExamples/Assets/UNEB/NodeOutput.cs.meta b/Other/NodeEditorExamples/Assets/UNEB/NodeOutput.cs.meta new file mode 100644 index 00000000..1178dc35 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/NodeOutput.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 505fc75df63b6cd4694c90b7f0428f99 +timeCreated: 1501804800 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Other/NodeEditorExamples/Assets/UNEB/Nodes.meta b/Other/NodeEditorExamples/Assets/UNEB/Nodes.meta new file mode 100644 index 00000000..8a294dde --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Nodes.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e0dd5d51fa34588489d6675851e9486e +folderAsset: yes +timeCreated: 1502911891 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Other/NodeEditorExamples/Assets/UNEB/Nodes/BasicNode.cs b/Other/NodeEditorExamples/Assets/UNEB/Nodes/BasicNode.cs new file mode 100644 index 00000000..fd9ea801 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Nodes/BasicNode.cs @@ -0,0 +1,39 @@ + +using UnityEngine; +using UnityEditor; + +namespace UNEB +{ + public class BasicNode : Node + { + private int _someInt = 0; + + public override void Init() + { + base.Init(); + + AddInput("Input"); + AddOutput("Ouput"); + + FitKnobs(); + + // Fit the int field, need to automate this. + bodyRect.height += 20f; + } + + public override void OnBodyGUI() + { + _someInt = EditorGUILayout.IntField("Int Value", _someInt); + } + + public override void OnNewInputConnection(NodeInput addedInput) + { + Debug.Log("Added Input: " + addedInput.name); + } + + public override void OnInputConnectionRemoved(NodeInput removedInput) + { + Debug.Log("Removed Input: " + removedInput.name); + } + } +}
\ No newline at end of file diff --git a/Other/NodeEditorExamples/Assets/UNEB/Nodes/BasicNode.cs.meta b/Other/NodeEditorExamples/Assets/UNEB/Nodes/BasicNode.cs.meta new file mode 100644 index 00000000..38d9d18c --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Nodes/BasicNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b0d0b3390e407b34d9672707671fdf01 +timeCreated: 1502911896 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Other/NodeEditorExamples/Assets/UNEB/TempGraphsUNEB.meta b/Other/NodeEditorExamples/Assets/UNEB/TempGraphsUNEB.meta new file mode 100644 index 00000000..dd9d21c8 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/TempGraphsUNEB.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: b885bb71b1d0fd34584e1392483dba6d +folderAsset: yes +timeCreated: 1503087061 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Other/NodeEditorExamples/Assets/UNEB/TempGraphsUNEB/TempNodeGraphUNEB-18000.asset b/Other/NodeEditorExamples/Assets/UNEB/TempGraphsUNEB/TempNodeGraphUNEB-18000.asset new file mode 100644 index 00000000..f562815f --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/TempGraphsUNEB/TempNodeGraphUNEB-18000.asset @@ -0,0 +1,6515 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5472e37c6bced914daa030c486155845, type: 3} + m_Name: TempNodeGraphUNEB-18000 + m_EditorClassIdentifier: + nodes: + - {fileID: 114649820198714802} + - {fileID: 114318772694394034} + - {fileID: 114247328516611494} + - {fileID: 114188287407102516} + - {fileID: 114488006925090048} + - {fileID: 114668404074355798} + - {fileID: 114372441715335820} + - {fileID: 114544046452556548} + - {fileID: 114318072981352580} + - {fileID: 114995943598026618} + - {fileID: 114372460049263836} + - {fileID: 114595714967894500} + - {fileID: 114809703780796474} + - {fileID: 114924491257293590} + - {fileID: 114298590628864988} + - {fileID: 114214789622764380} + - {fileID: 114094250832233624} + - {fileID: 114484120233952240} + - {fileID: 114372608875964954} + - {fileID: 114549266524813346} + - {fileID: 114724721532079774} + - {fileID: 114258201408638206} + - {fileID: 114416965029609000} + - {fileID: 114279443101610996} + - {fileID: 114535851105013628} + - {fileID: 114331226178011978} + - {fileID: 114978496358228684} + - {fileID: 114157618514019984} + - {fileID: 114127330872578466} + - {fileID: 114537698157735394} + - {fileID: 114592582420987538} + - {fileID: 114826471941662460} + - {fileID: 114495392188715312} + - {fileID: 114779143377165324} + - {fileID: 114508363775481748} + - {fileID: 114748890917427988} + - {fileID: 114212919586348082} + - {fileID: 114060468691274060} + - {fileID: 114586171112551252} + - {fileID: 114123719148343364} + - {fileID: 114343114984546550} + - {fileID: 114104407920392924} + - {fileID: 114627603537053588} + - {fileID: 114102133613934306} + - {fileID: 114032647566845792} + - {fileID: 114558006963751182} + - {fileID: 114735742031852318} + - {fileID: 114791909558126260} + - {fileID: 114753436896775260} + - {fileID: 114185767057852742} + - {fileID: 114342869155660718} + - {fileID: 114463183136394232} + - {fileID: 114291501057425104} + - {fileID: 114794504564065380} + - {fileID: 114105289680323532} + - {fileID: 114235848786241888} + - {fileID: 114216783342308070} + - {fileID: 114385647069057010} + - {fileID: 114155030097666606} + - {fileID: 114906112867144964} + - {fileID: 114582611350948750} + - {fileID: 114195846631795460} + - {fileID: 114970029795268052} + - {fileID: 114816260020250312} + - {fileID: 114899868845616516} + - {fileID: 114461922176674752} + - {fileID: 114851792330118846} + - {fileID: 114867537130609524} + - {fileID: 114729652895838470} + - {fileID: 114903470640933088} + - {fileID: 114492910285958856} + - {fileID: 114587963243139904} + - {fileID: 114220700694228568} + - {fileID: 114730562526222724} + - {fileID: 114964089510329778} + - {fileID: 114407112841337898} + - {fileID: 114580975342486084} + - {fileID: 114844738074964444} + - {fileID: 114693143912305152} + - {fileID: 114286271705629688} + - {fileID: 114709234588755810} + - {fileID: 114601912298373078} + - {fileID: 114169632940801564} + - {fileID: 114576911103601276} + - {fileID: 114638634703980764} + - {fileID: 114426660520134716} + - {fileID: 114312773077251228} + - {fileID: 114503251171754162} + - {fileID: 114035303143955214} + - {fileID: 114719136315363464} + - {fileID: 114055381488272514} + - {fileID: 114519746998358522} + - {fileID: 114222944304035782} + - {fileID: 114578668458250286} + - {fileID: 114442000406844188} + - {fileID: 114952593327603842} + - {fileID: 114786548535745842} + - {fileID: 114595812434298278} + - {fileID: 114677833350987524} + - {fileID: 114754120066644676} +--- !u!114 &114001671155620418 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1252.5 + y: 1339 + width: 15 + height: 15 + parentNode: {fileID: 114729652895838470} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114011123281342946 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1602.5 + y: 844 + width: 15 + height: 15 + parentNode: {fileID: 114407112841337898} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114021341993425826 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 132.5 + y: 19 + width: 15 + height: 15 + parentNode: {fileID: 114649820198714802} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114021699380983960 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 2022.5 + y: 349 + width: 15 + height: 15 + parentNode: {fileID: 114222944304035782} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114022396875520970 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 132.5 + y: 844 + width: 15 + height: 15 + parentNode: {fileID: 114668404074355798} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114026035281217696 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1812.5 + y: 1339 + width: 15 + height: 15 + parentNode: {fileID: 114035303143955214} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114030281820682114 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1812.5 + y: 514 + width: 15 + height: 15 + parentNode: {fileID: 114576911103601276} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114032647566845792 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 840 + y: 660 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114046665484049786} + _inputs: + - {fileID: 114688430239101240} +--- !u!114 &114035303143955214 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1680 + y: 1320 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114026035281217696} + _inputs: + - {fileID: 114228224168405964} +--- !u!114 &114036256417699856 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1042.5 + y: 184 + width: 15 + height: 15 + parentNode: {fileID: 114463183136394232} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114045636928124764 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: -7.5 + y: 184 + width: 15 + height: 15 + parentNode: {fileID: 114318772694394034} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114046015062868526 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1812.5 + y: 679 + width: 15 + height: 15 + parentNode: {fileID: 114638634703980764} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114046665484049786 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 972.5 + y: 679 + width: 15 + height: 15 + parentNode: {fileID: 114032647566845792} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114049435994216540 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1672.5 + y: 514 + width: 15 + height: 15 + parentNode: {fileID: 114576911103601276} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114054398101695222 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1182.5 + y: 1009 + width: 15 + height: 15 + parentNode: {fileID: 114216783342308070} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114055381488272514 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1890 + y: 0 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114354078374219062} + _inputs: + - {fileID: 114732689614608988} +--- !u!114 &114057440960578784 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 2022.5 + y: 1339 + width: 15 + height: 15 + parentNode: {fileID: 114677833350987524} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114058908433932722 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 552.5 + y: 1504 + width: 15 + height: 15 + parentNode: {fileID: 114537698157735394} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114059270142671446 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 202.5 + y: 844 + width: 15 + height: 15 + parentNode: {fileID: 114214789622764380} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114060468691274060 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 630 + y: 1155 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114795600385364100} + _inputs: + - {fileID: 114692140502736702} +--- !u!114 &114064592695255072 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1042.5 + y: 19 + width: 15 + height: 15 + parentNode: {fileID: 114342869155660718} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114067836920298000 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1462.5 + y: 1009 + width: 15 + height: 15 + parentNode: {fileID: 114580975342486084} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114069368663378846 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 832.5 + y: 349 + width: 15 + height: 15 + parentNode: {fileID: 114627603537053588} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114079228532555544 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1812.5 + y: 1504 + width: 15 + height: 15 + parentNode: {fileID: 114719136315363464} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114086803895435852 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 202.5 + y: 19 + width: 15 + height: 15 + parentNode: {fileID: 114372460049263836} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114091354739448916 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 622.5 + y: 184 + width: 15 + height: 15 + parentNode: {fileID: 114826471941662460} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114092724552326696 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 552.5 + y: 514 + width: 15 + height: 15 + parentNode: {fileID: 114279443101610996} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114092793003749472 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1182.5 + y: 1504 + width: 15 + height: 15 + parentNode: {fileID: 114906112867144964} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114094250832233624 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 210 + y: 990 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114955182263277056} + _inputs: + - {fileID: 114949153467399768} +--- !u!114 &114102133613934306 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 840 + y: 495 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114150513525053244} + _inputs: + - {fileID: 114296000429823454} +--- !u!114 &114104407920392924 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 840 + y: 165 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114564631989367198} + _inputs: + - {fileID: 114176198538265880} +--- !u!114 &114105289680323532 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1050 + y: 660 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114464153349159156} + _inputs: + - {fileID: 114975688528033068} +--- !u!114 &114120408963611960 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1672.5 + y: 1009 + width: 15 + height: 15 + parentNode: {fileID: 114312773077251228} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114123719148343364 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 630 + y: 1485 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114330711847355500} + _inputs: + - {fileID: 114303047529592570} +--- !u!114 &114127330872578466 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 420 + y: 1320 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114615187719956714} + _inputs: + - {fileID: 114513622963664910} +--- !u!114 &114129556680958820 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 552.5 + y: 19 + width: 15 + height: 15 + parentNode: {fileID: 114724721532079774} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114131937200386948 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 832.5 + y: 844 + width: 15 + height: 15 + parentNode: {fileID: 114558006963751182} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114138540684449194 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 132.5 + y: 514 + width: 15 + height: 15 + parentNode: {fileID: 114188287407102516} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114139763991355432 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 972.5 + y: 1174 + width: 15 + height: 15 + parentNode: {fileID: 114791909558126260} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114142066382874350 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 552.5 + y: 1174 + width: 15 + height: 15 + parentNode: {fileID: 114157618514019984} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114144399137022088 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1392.5 + y: 19 + width: 15 + height: 15 + parentNode: {fileID: 114582611350948750} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114146543418525146 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1042.5 + y: 1504 + width: 15 + height: 15 + parentNode: {fileID: 114906112867144964} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114148187341695068 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 622.5 + y: 1009 + width: 15 + height: 15 + parentNode: {fileID: 114212919586348082} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114148521313434022 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 552.5 + y: 349 + width: 15 + height: 15 + parentNode: {fileID: 114416965029609000} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114149206805687562 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1602.5 + y: 1174 + width: 15 + height: 15 + parentNode: {fileID: 114844738074964444} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114150513525053244 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 972.5 + y: 514 + width: 15 + height: 15 + parentNode: {fileID: 114102133613934306} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114154234458328364 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1252.5 + y: 349 + width: 15 + height: 15 + parentNode: {fileID: 114970029795268052} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114155030097666606 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1050 + y: 1320 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114811656040908320} + _inputs: + - {fileID: 114694725891797130} +--- !u!114 &114157618514019984 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 420 + y: 1155 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114142066382874350} + _inputs: + - {fileID: 114337812970617456} +--- !u!114 &114160035018724188 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 972.5 + y: 19 + width: 15 + height: 15 + parentNode: {fileID: 114343114984546550} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114163812832239278 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: -7.5 + y: 1009 + width: 15 + height: 15 + parentNode: {fileID: 114372441715335820} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114167251018549298 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1672.5 + y: 844 + width: 15 + height: 15 + parentNode: {fileID: 114426660520134716} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114169632940801564 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1680 + y: 330 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114998529089306044} + _inputs: + - {fileID: 114686552855947096} +--- !u!114 &114171629767782314 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1252.5 + y: 19 + width: 15 + height: 15 + parentNode: {fileID: 114582611350948750} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114176198538265880 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 832.5 + y: 184 + width: 15 + height: 15 + parentNode: {fileID: 114104407920392924} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114176425944178666 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1392.5 + y: 184 + width: 15 + height: 15 + parentNode: {fileID: 114195846631795460} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114182654162089432 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1882.5 + y: 844 + width: 15 + height: 15 + parentNode: {fileID: 114952593327603842} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114185767057852742 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 840 + y: 1485 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114224169038261350} + _inputs: + - {fileID: 114628534875840702} +--- !u!114 &114188287407102516 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 0 + y: 495 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114138540684449194} + _inputs: + - {fileID: 114533503901114068} +--- !u!114 &114192113363169920 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1812.5 + y: 1009 + width: 15 + height: 15 + parentNode: {fileID: 114312773077251228} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114195846631795460 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1260 + y: 165 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114176425944178666} + _inputs: + - {fileID: 114415755779835962} +--- !u!114 &114198595924211876 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: -7.5 + y: 1339 + width: 15 + height: 15 + parentNode: {fileID: 114318072981352580} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114204136897111338 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 202.5 + y: 679 + width: 15 + height: 15 + parentNode: {fileID: 114298590628864988} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114207513964066840 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 552.5 + y: 679 + width: 15 + height: 15 + parentNode: {fileID: 114535851105013628} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114207799271921918 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1462.5 + y: 844 + width: 15 + height: 15 + parentNode: {fileID: 114407112841337898} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114212919586348082 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 630 + y: 990 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114673998392407258} + _inputs: + - {fileID: 114148187341695068} +--- !u!114 &114213799034815696 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1672.5 + y: 1174 + width: 15 + height: 15 + parentNode: {fileID: 114503251171754162} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114214789622764380 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 210 + y: 825 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114344266174767670} + _inputs: + - {fileID: 114059270142671446} +--- !u!114 &114215758429549356 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 2022.5 + y: 184 + width: 15 + height: 15 + parentNode: {fileID: 114519746998358522} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114216783342308070 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1050 + y: 990 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114054398101695222} + _inputs: + - {fileID: 114947244980610300} +--- !u!114 &114217294926676420 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1812.5 + y: 844 + width: 15 + height: 15 + parentNode: {fileID: 114426660520134716} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114220700694228568 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1470 + y: 330 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114866156505868784} + _inputs: + - {fileID: 114758093600472114} +--- !u!114 &114221303362999580 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 622.5 + y: 679 + width: 15 + height: 15 + parentNode: {fileID: 114508363775481748} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114222944304035782 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1890 + y: 330 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114021699380983960} + _inputs: + - {fileID: 114768861245032676} +--- !u!114 &114223578349965356 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1042.5 + y: 514 + width: 15 + height: 15 + parentNode: {fileID: 114794504564065380} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114224169038261350 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 972.5 + y: 1504 + width: 15 + height: 15 + parentNode: {fileID: 114185767057852742} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114228224168405964 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1672.5 + y: 1339 + width: 15 + height: 15 + parentNode: {fileID: 114035303143955214} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114233473679809758 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 202.5 + y: 514 + width: 15 + height: 15 + parentNode: {fileID: 114924491257293590} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114233527380986214 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1462.5 + y: 1504 + width: 15 + height: 15 + parentNode: {fileID: 114286271705629688} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114235848786241888 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1050 + y: 825 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114766069295182146} + _inputs: + - {fileID: 114323000564522410} +--- !u!114 &114243640797432118 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 622.5 + y: 349 + width: 15 + height: 15 + parentNode: {fileID: 114495392188715312} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114247328516611494 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 0 + y: 330 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114414525360453778} + _inputs: + - {fileID: 114460546136940212} +--- !u!114 &114250615166782950 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 412.5 + y: 184 + width: 15 + height: 15 + parentNode: {fileID: 114258201408638206} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114255955519873922 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1672.5 + y: 184 + width: 15 + height: 15 + parentNode: {fileID: 114601912298373078} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114258201408638206 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 420 + y: 165 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114681217675056844} + _inputs: + - {fileID: 114250615166782950} +--- !u!114 &114259854081428940 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 832.5 + y: 19 + width: 15 + height: 15 + parentNode: {fileID: 114343114984546550} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114260543212820992 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 342.5 + y: 514 + width: 15 + height: 15 + parentNode: {fileID: 114924491257293590} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114265837573135884 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1252.5 + y: 514 + width: 15 + height: 15 + parentNode: {fileID: 114816260020250312} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114279443101610996 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 420 + y: 495 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114092724552326696} + _inputs: + - {fileID: 114806391775952548} +--- !u!114 &114286271705629688 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1470 + y: 1485 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114413724917062214} + _inputs: + - {fileID: 114233527380986214} +--- !u!114 &114291501057425104 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1050 + y: 330 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114972869643474944} + _inputs: + - {fileID: 114642787968873662} +--- !u!114 &114296000429823454 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 832.5 + y: 514 + width: 15 + height: 15 + parentNode: {fileID: 114102133613934306} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114298590628864988 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 210 + y: 660 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114783157596119098} + _inputs: + - {fileID: 114204136897111338} +--- !u!114 &114303047529592570 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 622.5 + y: 1504 + width: 15 + height: 15 + parentNode: {fileID: 114123719148343364} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114308445692205998 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1182.5 + y: 514 + width: 15 + height: 15 + parentNode: {fileID: 114794504564065380} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114312773077251228 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1680 + y: 990 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114192113363169920} + _inputs: + - {fileID: 114120408963611960} +--- !u!114 &114318072981352580 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 0 + y: 1320 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114417450592935928} + _inputs: + - {fileID: 114198595924211876} +--- !u!114 &114318772694394034 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 0 + y: 165 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114333723834092882} + _inputs: + - {fileID: 114045636928124764} +--- !u!114 &114323000564522410 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1042.5 + y: 844 + width: 15 + height: 15 + parentNode: {fileID: 114235848786241888} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114324074816370092 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 132.5 + y: 679 + width: 15 + height: 15 + parentNode: {fileID: 114488006925090048} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114325389654104252 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1602.5 + y: 184 + width: 15 + height: 15 + parentNode: {fileID: 114587963243139904} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114330711847355500 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 762.5 + y: 1504 + width: 15 + height: 15 + parentNode: {fileID: 114123719148343364} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114331226178011978 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 420 + y: 825 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114792452818695174} + _inputs: + - {fileID: 114623541315529784} +--- !u!114 &114333723834092882 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 132.5 + y: 184 + width: 15 + height: 15 + parentNode: {fileID: 114318772694394034} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114337812970617456 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 412.5 + y: 1174 + width: 15 + height: 15 + parentNode: {fileID: 114157618514019984} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114342869155660718 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1050 + y: 0 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114377133730835656} + _inputs: + - {fileID: 114064592695255072} +--- !u!114 &114343114984546550 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 840 + y: 0 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114160035018724188} + _inputs: + - {fileID: 114259854081428940} +--- !u!114 &114344266174767670 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 342.5 + y: 844 + width: 15 + height: 15 + parentNode: {fileID: 114214789622764380} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114346240878861572 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1882.5 + y: 1009 + width: 15 + height: 15 + parentNode: {fileID: 114786548535745842} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114354078374219062 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 2022.5 + y: 19 + width: 15 + height: 15 + parentNode: {fileID: 114055381488272514} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114363613899660596 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1672.5 + y: 19 + width: 15 + height: 15 + parentNode: {fileID: 114709234588755810} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114372441715335820 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 0 + y: 990 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114417378196762410} + _inputs: + - {fileID: 114163812832239278} +--- !u!114 &114372460049263836 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 210 + y: 0 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114642663622843824} + _inputs: + - {fileID: 114086803895435852} +--- !u!114 &114372608875964954 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 210 + y: 1320 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114874388098277048} + _inputs: + - {fileID: 114870878225041800} +--- !u!114 &114377133730835656 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1182.5 + y: 19 + width: 15 + height: 15 + parentNode: {fileID: 114342869155660718} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114377759737611548 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 412.5 + y: 1504 + width: 15 + height: 15 + parentNode: {fileID: 114537698157735394} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114378066669872004 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1462.5 + y: 514 + width: 15 + height: 15 + parentNode: {fileID: 114730562526222724} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114378669117163648 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 762.5 + y: 349 + width: 15 + height: 15 + parentNode: {fileID: 114495392188715312} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114380919628130816 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 762.5 + y: 19 + width: 15 + height: 15 + parentNode: {fileID: 114592582420987538} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114385647069057010 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1050 + y: 1155 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114655561224605726} + _inputs: + - {fileID: 114732635930678278} +--- !u!114 &114397270286976436 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1672.5 + y: 1504 + width: 15 + height: 15 + parentNode: {fileID: 114719136315363464} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114407112841337898 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1470 + y: 825 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114011123281342946} + _inputs: + - {fileID: 114207799271921918} +--- !u!114 &114409187314540462 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 762.5 + y: 514 + width: 15 + height: 15 + parentNode: {fileID: 114779143377165324} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114413724917062214 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1602.5 + y: 1504 + width: 15 + height: 15 + parentNode: {fileID: 114286271705629688} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114414525360453778 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 132.5 + y: 349 + width: 15 + height: 15 + parentNode: {fileID: 114247328516611494} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114415755779835962 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1252.5 + y: 184 + width: 15 + height: 15 + parentNode: {fileID: 114195846631795460} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114416965029609000 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 420 + y: 330 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114148521313434022} + _inputs: + - {fileID: 114814935640544030} +--- !u!114 &114417378196762410 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 132.5 + y: 1009 + width: 15 + height: 15 + parentNode: {fileID: 114372441715335820} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114417450592935928 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 132.5 + y: 1339 + width: 15 + height: 15 + parentNode: {fileID: 114318072981352580} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114419868793824710 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1252.5 + y: 1174 + width: 15 + height: 15 + parentNode: {fileID: 114867537130609524} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114421761065742202 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 2022.5 + y: 844 + width: 15 + height: 15 + parentNode: {fileID: 114952593327603842} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114422984684629644 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1812.5 + y: 184 + width: 15 + height: 15 + parentNode: {fileID: 114601912298373078} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114426660520134716 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1680 + y: 825 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114217294926676420} + _inputs: + - {fileID: 114167251018549298} +--- !u!114 &114428533554137858 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 622.5 + y: 19 + width: 15 + height: 15 + parentNode: {fileID: 114592582420987538} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114435575373244152 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1602.5 + y: 679 + width: 15 + height: 15 + parentNode: {fileID: 114964089510329778} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114442000406844188 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1890 + y: 660 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114733855804583510} + _inputs: + - {fileID: 114577975947466440} +--- !u!114 &114442915415878272 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 622.5 + y: 844 + width: 15 + height: 15 + parentNode: {fileID: 114748890917427988} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114453339144657796 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 832.5 + y: 1009 + width: 15 + height: 15 + parentNode: {fileID: 114735742031852318} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114453818972680006 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 412.5 + y: 19 + width: 15 + height: 15 + parentNode: {fileID: 114724721532079774} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114455813581842644 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1392.5 + y: 514 + width: 15 + height: 15 + parentNode: {fileID: 114816260020250312} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114460546136940212 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: -7.5 + y: 349 + width: 15 + height: 15 + parentNode: {fileID: 114247328516611494} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114461922176674752 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1260 + y: 825 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114844909480189294} + _inputs: + - {fileID: 114520090539263432} +--- !u!114 &114463183136394232 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1050 + y: 165 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114743798990957344} + _inputs: + - {fileID: 114036256417699856} +--- !u!114 &114464153349159156 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1182.5 + y: 679 + width: 15 + height: 15 + parentNode: {fileID: 114105289680323532} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114472743358668682 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1602.5 + y: 1009 + width: 15 + height: 15 + parentNode: {fileID: 114580975342486084} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114481029219770476 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1462.5 + y: 1339 + width: 15 + height: 15 + parentNode: {fileID: 114693143912305152} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114484120233952240 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 210 + y: 1155 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114493911685783342} + _inputs: + - {fileID: 114759216864638356} +--- !u!114 &114488006925090048 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 0 + y: 660 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114324074816370092} + _inputs: + - {fileID: 114734523107015782} +--- !u!114 &114492910285958856 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1470 + y: 0 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114541749899237478} + _inputs: + - {fileID: 114568567758687386} +--- !u!114 &114493911685783342 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 342.5 + y: 1174 + width: 15 + height: 15 + parentNode: {fileID: 114484120233952240} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114495392188715312 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 630 + y: 330 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114378669117163648} + _inputs: + - {fileID: 114243640797432118} +--- !u!114 &114503251171754162 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1680 + y: 1155 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114744951861517220} + _inputs: + - {fileID: 114213799034815696} +--- !u!114 &114507278802011122 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: -7.5 + y: 844 + width: 15 + height: 15 + parentNode: {fileID: 114668404074355798} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114508363775481748 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 630 + y: 660 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114687940223319342} + _inputs: + - {fileID: 114221303362999580} +--- !u!114 &114513622963664910 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 412.5 + y: 1339 + width: 15 + height: 15 + parentNode: {fileID: 114127330872578466} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114518411516238768 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 202.5 + y: 184 + width: 15 + height: 15 + parentNode: {fileID: 114595714967894500} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114519746998358522 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1890 + y: 165 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114215758429549356} + _inputs: + - {fileID: 114842706196820562} +--- !u!114 &114520090539263432 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1252.5 + y: 844 + width: 15 + height: 15 + parentNode: {fileID: 114461922176674752} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114526347215813776 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1252.5 + y: 1009 + width: 15 + height: 15 + parentNode: {fileID: 114851792330118846} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114533503901114068 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: -7.5 + y: 514 + width: 15 + height: 15 + parentNode: {fileID: 114188287407102516} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114535851105013628 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 420 + y: 660 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114207513964066840} + _inputs: + - {fileID: 114766860237946060} +--- !u!114 &114537698157735394 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 420 + y: 1485 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114058908433932722} + _inputs: + - {fileID: 114377759737611548} +--- !u!114 &114541749899237478 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1602.5 + y: 19 + width: 15 + height: 15 + parentNode: {fileID: 114492910285958856} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114544046452556548 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 0 + y: 1155 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114905837760230530} + _inputs: + - {fileID: 114545309586114844} +--- !u!114 &114545309586114844 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: -7.5 + y: 1174 + width: 15 + height: 15 + parentNode: {fileID: 114544046452556548} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114549266524813346 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 210 + y: 1485 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114580882340762694} + _inputs: + - {fileID: 114930515935297554} +--- !u!114 &114554886157775580 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1602.5 + y: 514 + width: 15 + height: 15 + parentNode: {fileID: 114730562526222724} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114558006963751182 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 840 + y: 825 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114569332090812236} + _inputs: + - {fileID: 114131937200386948} +--- !u!114 &114561025448010958 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 552.5 + y: 1009 + width: 15 + height: 15 + parentNode: {fileID: 114978496358228684} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114562184610295042 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1602.5 + y: 1339 + width: 15 + height: 15 + parentNode: {fileID: 114693143912305152} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114563591049466754 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1252.5 + y: 679 + width: 15 + height: 15 + parentNode: {fileID: 114899868845616516} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114564508886529610 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 972.5 + y: 1339 + width: 15 + height: 15 + parentNode: {fileID: 114753436896775260} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114564631989367198 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 972.5 + y: 184 + width: 15 + height: 15 + parentNode: {fileID: 114104407920392924} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114568567758687386 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1462.5 + y: 19 + width: 15 + height: 15 + parentNode: {fileID: 114492910285958856} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114569332090812236 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 972.5 + y: 844 + width: 15 + height: 15 + parentNode: {fileID: 114558006963751182} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114576911103601276 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1680 + y: 495 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114030281820682114} + _inputs: + - {fileID: 114049435994216540} +--- !u!114 &114577975947466440 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1882.5 + y: 679 + width: 15 + height: 15 + parentNode: {fileID: 114442000406844188} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114578668458250286 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1890 + y: 495 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114741999339535908} + _inputs: + - {fileID: 114889190475240398} +--- !u!114 &114580829955589776 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 2022.5 + y: 1174 + width: 15 + height: 15 + parentNode: {fileID: 114595812434298278} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114580882340762694 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 342.5 + y: 1504 + width: 15 + height: 15 + parentNode: {fileID: 114549266524813346} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114580975342486084 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1470 + y: 990 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114472743358668682} + _inputs: + - {fileID: 114067836920298000} +--- !u!114 &114582611350948750 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1260 + y: 0 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114144399137022088} + _inputs: + - {fileID: 114171629767782314} +--- !u!114 &114586171112551252 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 630 + y: 1320 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114889917528243060} + _inputs: + - {fileID: 114907626386969702} +--- !u!114 &114587963243139904 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1470 + y: 165 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114325389654104252} + _inputs: + - {fileID: 114740462656451092} +--- !u!114 &114589334417388670 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1392.5 + y: 1504 + width: 15 + height: 15 + parentNode: {fileID: 114903470640933088} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114592582420987538 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 630 + y: 0 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114380919628130816} + _inputs: + - {fileID: 114428533554137858} +--- !u!114 &114595714967894500 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 210 + y: 165 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114656271419409666} + _inputs: + - {fileID: 114518411516238768} +--- !u!114 &114595812434298278 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1890 + y: 1155 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114580829955589776} + _inputs: + - {fileID: 114812010943235154} +--- !u!114 &114601912298373078 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1680 + y: 165 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114422984684629644} + _inputs: + - {fileID: 114255955519873922} +--- !u!114 &114615187719956714 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 552.5 + y: 1339 + width: 15 + height: 15 + parentNode: {fileID: 114127330872578466} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114623541315529784 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 412.5 + y: 844 + width: 15 + height: 15 + parentNode: {fileID: 114331226178011978} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114627603537053588 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 840 + y: 330 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114877567627212650} + _inputs: + - {fileID: 114069368663378846} +--- !u!114 &114628534875840702 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 832.5 + y: 1504 + width: 15 + height: 15 + parentNode: {fileID: 114185767057852742} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114638164312271686 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1882.5 + y: 1504 + width: 15 + height: 15 + parentNode: {fileID: 114754120066644676} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114638634703980764 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1680 + y: 660 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114046015062868526} + _inputs: + - {fileID: 114706606264321634} +--- !u!114 &114642663622843824 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 342.5 + y: 19 + width: 15 + height: 15 + parentNode: {fileID: 114372460049263836} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114642787968873662 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1042.5 + y: 349 + width: 15 + height: 15 + parentNode: {fileID: 114291501057425104} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114649820198714802 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114021341993425826} + _inputs: + - {fileID: 114784539778093238} +--- !u!114 &114655561224605726 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1182.5 + y: 1174 + width: 15 + height: 15 + parentNode: {fileID: 114385647069057010} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114656271419409666 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 342.5 + y: 184 + width: 15 + height: 15 + parentNode: {fileID: 114595714967894500} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114668404074355798 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 0 + y: 825 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114022396875520970} + _inputs: + - {fileID: 114507278802011122} +--- !u!114 &114672329845936832 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1392.5 + y: 679 + width: 15 + height: 15 + parentNode: {fileID: 114899868845616516} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114673998392407258 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 762.5 + y: 1009 + width: 15 + height: 15 + parentNode: {fileID: 114212919586348082} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114677833350987524 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1890 + y: 1320 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114057440960578784} + _inputs: + - {fileID: 114980907721042644} +--- !u!114 &114681217675056844 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 552.5 + y: 184 + width: 15 + height: 15 + parentNode: {fileID: 114258201408638206} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114686552855947096 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1672.5 + y: 349 + width: 15 + height: 15 + parentNode: {fileID: 114169632940801564} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114687940223319342 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 762.5 + y: 679 + width: 15 + height: 15 + parentNode: {fileID: 114508363775481748} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114688430239101240 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 832.5 + y: 679 + width: 15 + height: 15 + parentNode: {fileID: 114032647566845792} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114692140502736702 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 622.5 + y: 1174 + width: 15 + height: 15 + parentNode: {fileID: 114060468691274060} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114693143912305152 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1470 + y: 1320 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114562184610295042} + _inputs: + - {fileID: 114481029219770476} +--- !u!114 &114694725891797130 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1042.5 + y: 1339 + width: 15 + height: 15 + parentNode: {fileID: 114155030097666606} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114704744442492192 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 2022.5 + y: 1009 + width: 15 + height: 15 + parentNode: {fileID: 114786548535745842} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114706606264321634 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1672.5 + y: 679 + width: 15 + height: 15 + parentNode: {fileID: 114638634703980764} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114709234588755810 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1680 + y: 0 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114806912815789804} + _inputs: + - {fileID: 114363613899660596} +--- !u!114 &114719136315363464 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1680 + y: 1485 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114079228532555544} + _inputs: + - {fileID: 114397270286976436} +--- !u!114 &114724721532079774 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 420 + y: 0 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114129556680958820} + _inputs: + - {fileID: 114453818972680006} +--- !u!114 &114729652895838470 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1260 + y: 1320 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114796118759526962} + _inputs: + - {fileID: 114001671155620418} +--- !u!114 &114730562526222724 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1470 + y: 495 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114554886157775580} + _inputs: + - {fileID: 114378066669872004} +--- !u!114 &114732635930678278 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1042.5 + y: 1174 + width: 15 + height: 15 + parentNode: {fileID: 114385647069057010} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114732689614608988 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1882.5 + y: 19 + width: 15 + height: 15 + parentNode: {fileID: 114055381488272514} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114733855804583510 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 2022.5 + y: 679 + width: 15 + height: 15 + parentNode: {fileID: 114442000406844188} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114734523107015782 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: -7.5 + y: 679 + width: 15 + height: 15 + parentNode: {fileID: 114488006925090048} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114735742031852318 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 840 + y: 990 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114976950462444310} + _inputs: + - {fileID: 114453339144657796} +--- !u!114 &114740462656451092 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1462.5 + y: 184 + width: 15 + height: 15 + parentNode: {fileID: 114587963243139904} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114741351006934176 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: -7.5 + y: 1504 + width: 15 + height: 15 + parentNode: {fileID: 114995943598026618} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114741999339535908 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 2022.5 + y: 514 + width: 15 + height: 15 + parentNode: {fileID: 114578668458250286} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114743798990957344 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1182.5 + y: 184 + width: 15 + height: 15 + parentNode: {fileID: 114463183136394232} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114744710742415316 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 202.5 + y: 349 + width: 15 + height: 15 + parentNode: {fileID: 114809703780796474} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114744951861517220 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1812.5 + y: 1174 + width: 15 + height: 15 + parentNode: {fileID: 114503251171754162} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114748890917427988 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 630 + y: 825 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114819209065616624} + _inputs: + - {fileID: 114442915415878272} +--- !u!114 &114753436896775260 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 840 + y: 1320 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114564508886529610} + _inputs: + - {fileID: 114995440111697984} +--- !u!114 &114754120066644676 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1890 + y: 1485 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114754951159244130} + _inputs: + - {fileID: 114638164312271686} +--- !u!114 &114754951159244130 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 2022.5 + y: 1504 + width: 15 + height: 15 + parentNode: {fileID: 114754120066644676} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114758093600472114 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1462.5 + y: 349 + width: 15 + height: 15 + parentNode: {fileID: 114220700694228568} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114759216864638356 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 202.5 + y: 1174 + width: 15 + height: 15 + parentNode: {fileID: 114484120233952240} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114766069295182146 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1182.5 + y: 844 + width: 15 + height: 15 + parentNode: {fileID: 114235848786241888} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114766860237946060 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 412.5 + y: 679 + width: 15 + height: 15 + parentNode: {fileID: 114535851105013628} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114768861245032676 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1882.5 + y: 349 + width: 15 + height: 15 + parentNode: {fileID: 114222944304035782} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114779143377165324 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 630 + y: 495 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114409187314540462} + _inputs: + - {fileID: 114816594903349010} +--- !u!114 &114780825815363388 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 412.5 + y: 1009 + width: 15 + height: 15 + parentNode: {fileID: 114978496358228684} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114783157596119098 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 342.5 + y: 679 + width: 15 + height: 15 + parentNode: {fileID: 114298590628864988} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114784539778093238 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: -7.5 + y: 19 + width: 15 + height: 15 + parentNode: {fileID: 114649820198714802} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114786548535745842 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1890 + y: 990 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114704744442492192} + _inputs: + - {fileID: 114346240878861572} +--- !u!114 &114786563481142584 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1462.5 + y: 679 + width: 15 + height: 15 + parentNode: {fileID: 114964089510329778} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114791909558126260 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 840 + y: 1155 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114139763991355432} + _inputs: + - {fileID: 114890517229404200} +--- !u!114 &114792452818695174 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 552.5 + y: 844 + width: 15 + height: 15 + parentNode: {fileID: 114331226178011978} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114794504564065380 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1050 + y: 495 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114308445692205998} + _inputs: + - {fileID: 114223578349965356} +--- !u!114 &114795600385364100 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 762.5 + y: 1174 + width: 15 + height: 15 + parentNode: {fileID: 114060468691274060} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114796118759526962 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1392.5 + y: 1339 + width: 15 + height: 15 + parentNode: {fileID: 114729652895838470} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114806391775952548 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 412.5 + y: 514 + width: 15 + height: 15 + parentNode: {fileID: 114279443101610996} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114806912815789804 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1812.5 + y: 19 + width: 15 + height: 15 + parentNode: {fileID: 114709234588755810} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114809067390081412 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1392.5 + y: 1009 + width: 15 + height: 15 + parentNode: {fileID: 114851792330118846} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114809703780796474 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 210 + y: 330 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114979262586425312} + _inputs: + - {fileID: 114744710742415316} +--- !u!114 &114811656040908320 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1182.5 + y: 1339 + width: 15 + height: 15 + parentNode: {fileID: 114155030097666606} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114812010943235154 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1882.5 + y: 1174 + width: 15 + height: 15 + parentNode: {fileID: 114595812434298278} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114814935640544030 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 412.5 + y: 349 + width: 15 + height: 15 + parentNode: {fileID: 114416965029609000} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114815031477891846 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1252.5 + y: 1504 + width: 15 + height: 15 + parentNode: {fileID: 114903470640933088} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114816260020250312 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1260 + y: 495 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114455813581842644} + _inputs: + - {fileID: 114265837573135884} +--- !u!114 &114816594903349010 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 622.5 + y: 514 + width: 15 + height: 15 + parentNode: {fileID: 114779143377165324} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114819209065616624 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 762.5 + y: 844 + width: 15 + height: 15 + parentNode: {fileID: 114748890917427988} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114826471941662460 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 630 + y: 165 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114832943604600684} + _inputs: + - {fileID: 114091354739448916} +--- !u!114 &114832943604600684 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 762.5 + y: 184 + width: 15 + height: 15 + parentNode: {fileID: 114826471941662460} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114842706196820562 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1882.5 + y: 184 + width: 15 + height: 15 + parentNode: {fileID: 114519746998358522} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114844738074964444 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1470 + y: 1155 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114149206805687562} + _inputs: + - {fileID: 114872688452594094} +--- !u!114 &114844909480189294 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1392.5 + y: 844 + width: 15 + height: 15 + parentNode: {fileID: 114461922176674752} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114851792330118846 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1260 + y: 990 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114809067390081412} + _inputs: + - {fileID: 114526347215813776} +--- !u!114 &114866156505868784 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1602.5 + y: 349 + width: 15 + height: 15 + parentNode: {fileID: 114220700694228568} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114867537130609524 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1260 + y: 1155 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114937807352434108} + _inputs: + - {fileID: 114419868793824710} +--- !u!114 &114870878225041800 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 202.5 + y: 1339 + width: 15 + height: 15 + parentNode: {fileID: 114372608875964954} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114872688452594094 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1462.5 + y: 1174 + width: 15 + height: 15 + parentNode: {fileID: 114844738074964444} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114874388098277048 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 342.5 + y: 1339 + width: 15 + height: 15 + parentNode: {fileID: 114372608875964954} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114877567627212650 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 972.5 + y: 349 + width: 15 + height: 15 + parentNode: {fileID: 114627603537053588} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114889190475240398 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1882.5 + y: 514 + width: 15 + height: 15 + parentNode: {fileID: 114578668458250286} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114889917528243060 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 762.5 + y: 1339 + width: 15 + height: 15 + parentNode: {fileID: 114586171112551252} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114890517229404200 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 832.5 + y: 1174 + width: 15 + height: 15 + parentNode: {fileID: 114791909558126260} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114893495342764084 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1392.5 + y: 349 + width: 15 + height: 15 + parentNode: {fileID: 114970029795268052} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114896499536795920 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 132.5 + y: 1504 + width: 15 + height: 15 + parentNode: {fileID: 114995943598026618} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114899868845616516 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1260 + y: 660 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114672329845936832} + _inputs: + - {fileID: 114563591049466754} +--- !u!114 &114903470640933088 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1260 + y: 1485 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114589334417388670} + _inputs: + - {fileID: 114815031477891846} +--- !u!114 &114905837760230530 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 132.5 + y: 1174 + width: 15 + height: 15 + parentNode: {fileID: 114544046452556548} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114906112867144964 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1050 + y: 1485 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114092793003749472} + _inputs: + - {fileID: 114146543418525146} +--- !u!114 &114907626386969702 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 622.5 + y: 1339 + width: 15 + height: 15 + parentNode: {fileID: 114586171112551252} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114924491257293590 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 210 + y: 495 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114260543212820992} + _inputs: + - {fileID: 114233473679809758} +--- !u!114 &114930515935297554 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 202.5 + y: 1504 + width: 15 + height: 15 + parentNode: {fileID: 114549266524813346} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114937807352434108 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1392.5 + y: 1174 + width: 15 + height: 15 + parentNode: {fileID: 114867537130609524} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114947244980610300 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1042.5 + y: 1009 + width: 15 + height: 15 + parentNode: {fileID: 114216783342308070} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114949153467399768 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 202.5 + y: 1009 + width: 15 + height: 15 + parentNode: {fileID: 114094250832233624} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114952593327603842 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1890 + y: 825 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114421761065742202} + _inputs: + - {fileID: 114182654162089432} +--- !u!114 &114955182263277056 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 342.5 + y: 1009 + width: 15 + height: 15 + parentNode: {fileID: 114094250832233624} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114964089510329778 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1470 + y: 660 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114435575373244152} + _inputs: + - {fileID: 114786563481142584} +--- !u!114 &114970029795268052 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1260 + y: 330 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114893495342764084} + _inputs: + - {fileID: 114154234458328364} +--- !u!114 &114972869643474944 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1182.5 + y: 349 + width: 15 + height: 15 + parentNode: {fileID: 114291501057425104} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114975688528033068 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1042.5 + y: 679 + width: 15 + height: 15 + parentNode: {fileID: 114105289680323532} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114976950462444310 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 972.5 + y: 1009 + width: 15 + height: 15 + parentNode: {fileID: 114735742031852318} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114978496358228684 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 420 + y: 990 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114561025448010958} + _inputs: + - {fileID: 114780825815363388} +--- !u!114 &114979262586425312 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 342.5 + y: 349 + width: 15 + height: 15 + parentNode: {fileID: 114809703780796474} + _bCanHaveMultipleConnections: 1 + _inputs: [] +--- !u!114 &114980907721042644 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1882.5 + y: 1339 + width: 15 + height: 15 + parentNode: {fileID: 114677833350987524} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114995440111697984 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0bace920f087ccf4595fad22948ac526, type: 3} + m_Name: Input + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 832.5 + y: 1339 + width: 15 + height: 15 + parentNode: {fileID: 114753436896775260} + _bCanHaveMultipleConnections: 0 + _outputs: [] +--- !u!114 &114995943598026618 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0d0b3390e407b34d9672707671fdf01, type: 3} + m_Name: Basic Node + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 0 + y: 1485 + width: 140 + height: 57.5 + _outputs: + - {fileID: 114896499536795920} + _inputs: + - {fileID: 114741351006934176} +--- !u!114 &114998529089306044 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 505fc75df63b6cd4694c90b7f0428f99, type: 3} + m_Name: Ouput + m_EditorClassIdentifier: + bodyRect: + serializedVersion: 2 + x: 1812.5 + y: 349 + width: 15 + height: 15 + parentNode: {fileID: 114169632940801564} + _bCanHaveMultipleConnections: 1 + _inputs: [] diff --git a/Other/NodeEditorExamples/Assets/UNEB/TempGraphsUNEB/TempNodeGraphUNEB-18000.asset.meta b/Other/NodeEditorExamples/Assets/UNEB/TempGraphsUNEB/TempNodeGraphUNEB-18000.asset.meta new file mode 100644 index 00000000..1ca2cfb8 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/TempGraphsUNEB/TempNodeGraphUNEB-18000.asset.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 7b48b278d2bc03d4ebb7e9554d7baeb5 +timeCreated: 1503266707 +licenseType: Free +NativeFormatImporter: + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Other/NodeEditorExamples/Assets/UNEB/UNEB Textures.meta b/Other/NodeEditorExamples/Assets/UNEB/UNEB Textures.meta new file mode 100644 index 00000000..1e5598c8 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/UNEB Textures.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 5761ae761e67fe64fa22031bd69b0dca +folderAsset: yes +timeCreated: 1501786124 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Other/NodeEditorExamples/Assets/UNEB/UNEB Textures/Circle.png b/Other/NodeEditorExamples/Assets/UNEB/UNEB Textures/Circle.png Binary files differnew file mode 100644 index 00000000..d91689af --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/UNEB Textures/Circle.png diff --git a/Other/NodeEditorExamples/Assets/UNEB/UNEB Textures/Circle.png.meta b/Other/NodeEditorExamples/Assets/UNEB/UNEB Textures/Circle.png.meta new file mode 100644 index 00000000..fd909015 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/UNEB Textures/Circle.png.meta @@ -0,0 +1,204 @@ +fileFormatVersion: 2 +guid: 7351ad259fd2ebb4e92d45d99d89ca33 +timeCreated: 1502521939 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 1 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: 16 + mipBias: 0 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 3 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 4 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 32 + textureFormat: 4 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 32 + textureFormat: 4 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: + - - {x: 0, y: 2} + - {x: -0.09813535, y: 1.9975909} + - {x: -0.19603428, y: 1.9903694} + - {x: -0.29346094, y: 1.978353} + - {x: -0.39018065, y: 1.9615705} + - {x: -0.4859604, y: 1.9400625} + - {x: -0.5805693, y: 1.9138807} + - {x: -0.67377967, y: 1.8830881} + - {x: -0.76536685, y: 1.8477591} + - {x: -0.8551101, y: 1.8079786} + - {x: -0.9427934, y: 1.7638426} + - {x: -1.0282055, y: 1.7154572} + - {x: -1.1111405, y: 1.6629392} + - {x: -1.1913986, y: 1.606415} + - {x: -1.2687867, y: 1.5460209} + - {x: -1.343118, y: 1.4819021} + - {x: -1.4142137, y: 1.4142134} + - {x: -1.4819024, y: 1.3431177} + - {x: -1.5460211, y: 1.2687864} + - {x: -1.6064153, y: 1.1913984} + - {x: -1.6629394, y: 1.1111403} + - {x: -1.7154574, y: 1.0282052} + - {x: -1.7638427, y: 0.94279313} + - {x: -1.8079787, y: 0.8551098} + - {x: -1.8477592, y: 0.76536644} + - {x: -1.8830884, y: 0.6737792} + - {x: -1.9138808, y: 0.5805688} + - {x: -1.9400626, y: 0.48595977} + - {x: -1.9615707, y: 0.39018002} + - {x: -1.9783531, y: 0.29346028} + - {x: -1.9903696, y: 0.19603357} + - {x: -1.9975909, y: 0.098134585} + - {x: -2, y: -0.0000008026785} + - {x: -1.9975909, y: -0.09813619} + - {x: -1.9903693, y: -0.19603516} + - {x: -1.9783529, y: -0.29346186} + - {x: -1.9615704, y: -0.3901816} + - {x: -1.9400623, y: -0.48596132} + - {x: -1.9138803, y: -0.58057034} + - {x: -1.8830878, y: -0.67378074} + - {x: -1.8477587, y: -0.7653679} + - {x: -1.8079782, y: -0.855111} + - {x: -1.7638422, y: -0.9427941} + - {x: -1.715457, y: -1.028206} + - {x: -1.6629391, y: -1.1111407} + - {x: -1.606415, y: -1.1913987} + - {x: -1.546021, y: -1.2687865} + - {x: -1.4819025, y: -1.3431177} + - {x: -1.4142139, y: -1.4142132} + - {x: -1.3431184, y: -1.4819018} + - {x: -1.2687873, y: -1.5460204} + - {x: -1.1913995, y: -1.6064144} + - {x: -1.1111416, y: -1.6629385} + - {x: -1.0282067, y: -1.7154565} + - {x: -0.9427949, y: -1.7638417} + - {x: -0.85511184, y: -1.8079778} + - {x: -0.76536876, y: -1.8477583} + - {x: -0.6737818, y: -1.8830874} + - {x: -0.5805717, y: -1.91388} + - {x: -0.48596293, y: -1.9400618} + - {x: -0.39018345, y: -1.96157} + - {x: -0.29346398, y: -1.9783525} + - {x: -0.1960375, y: -1.9903691} + - {x: -0.09813879, y: -1.9975908} + - {x: -0.0000036398517, y: -2} + - {x: 0.098131515, y: -1.9975911} + - {x: 0.19603026, y: -1.9903698} + - {x: 0.29345676, y: -1.9783536} + - {x: 0.3901763, y: -1.9615715} + - {x: 0.48595586, y: -1.9400636} + - {x: 0.58056474, y: -1.913882} + - {x: 0.67377496, y: -1.8830898} + - {x: 0.765362, y: -1.847761} + - {x: 0.8551053, y: -1.8079809} + - {x: 0.94278854, y: -1.7638452} + - {x: 1.0282005, y: -1.7154602} + - {x: 1.1111355, y: -1.6629425} + - {x: 1.1913936, y: -1.6064187} + - {x: 1.2687817, y: -1.5460249} + - {x: 1.3431131, y: -1.4819067} + - {x: 1.4142088, y: -1.4142184} + - {x: 1.4818976, y: -1.3431231} + - {x: 1.5460167, y: -1.2687918} + - {x: 1.6064112, y: -1.1914037} + - {x: 1.6629357, y: -1.1111456} + - {x: 1.7154542, y: -1.0282105} + - {x: 1.7638398, y: -0.94279844} + - {x: 1.8079762, y: -0.855115} + - {x: 1.8477571, y: -0.76537156} + - {x: 1.8830866, y: -0.6737842} + - {x: 1.9138794, y: -0.5805737} + - {x: 1.9400615, y: -0.48596448} + - {x: 1.9615698, y: -0.39018452} + - {x: 1.9783524, y: -0.29346457} + - {x: 1.9903691, y: -0.19603767} + - {x: 1.9975908, y: -0.09813846} + - {x: 2, y: -0.0000028371733} + - {x: 1.997591, y: 0.0981328} + - {x: 1.9903697, y: 0.19603202} + - {x: 1.9783533, y: 0.29345897} + - {x: 1.9615709, y: 0.39017895} + - {x: 1.9400629, y: 0.48595896} + - {x: 1.9138811, y: 0.58056825} + - {x: 1.8830885, y: 0.6737789} + - {x: 1.8477592, y: 0.7653663} + - {x: 1.8079787, y: 0.8551099} + - {x: 1.7638426, y: 0.9427934} + - {x: 1.7154571, y: 1.0282056} + - {x: 1.662939, y: 1.1111408} + - {x: 1.6064146, y: 1.1913992} + - {x: 1.5460203, y: 1.2687874} + - {x: 1.4819014, y: 1.3431189} + - {x: 1.4142125, y: 1.4142147} + - {x: 1.3431165, y: 1.4819036} + - {x: 1.2687849, y: 1.5460223} + - {x: 1.1913966, y: 1.6064166} + - {x: 1.1111382, y: 1.6629407} + - {x: 1.0282029, y: 1.7154588} + - {x: 0.94279057, y: 1.7638441} + - {x: 0.85510695, y: 1.8079801} + - {x: 0.76536334, y: 1.8477606} + - {x: 0.67377585, y: 1.8830895} + - {x: 0.58056515, y: 1.9138819} + - {x: 0.48595583, y: 1.9400636} + - {x: 0.3901758, y: 1.9615716} + - {x: 0.29345578, y: 1.9783537} + - {x: 0.1960288, y: 1.99037} + - {x: 0.09812956, y: 1.9975911} + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Other/NodeEditorExamples/Assets/UNEB/UNEB Textures/Grid.png b/Other/NodeEditorExamples/Assets/UNEB/UNEB Textures/Grid.png Binary files differnew file mode 100644 index 00000000..1c4457e0 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/UNEB Textures/Grid.png diff --git a/Other/NodeEditorExamples/Assets/UNEB/UNEB Textures/Grid.png.meta b/Other/NodeEditorExamples/Assets/UNEB/UNEB Textures/Grid.png.meta new file mode 100644 index 00000000..7affb106 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/UNEB Textures/Grid.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 4ab4e605fe422164da65569c46a161d2 +timeCreated: 1493143660 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 1 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 2 + aniso: 1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 0 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Other/NodeEditorExamples/Assets/UNEB/UNEB Textures/Square.png b/Other/NodeEditorExamples/Assets/UNEB/UNEB Textures/Square.png Binary files differnew file mode 100644 index 00000000..c8bbb357 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/UNEB Textures/Square.png diff --git a/Other/NodeEditorExamples/Assets/UNEB/UNEB Textures/Square.png.meta b/Other/NodeEditorExamples/Assets/UNEB/UNEB Textures/Square.png.meta new file mode 100644 index 00000000..9f830579 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/UNEB Textures/Square.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 2753fd6aa74e4ae48b498cb00649f41c +timeCreated: 1502670092 +licenseType: Free +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 1 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 32 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 32 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Other/NodeEditorExamples/Assets/UNEB/Utility.meta b/Other/NodeEditorExamples/Assets/UNEB/Utility.meta new file mode 100644 index 00000000..c637d44d --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Utility.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 5b4a95752fe3e454da78c3bfbf465f51 +folderAsset: yes +timeCreated: 1502670670 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Other/NodeEditorExamples/Assets/UNEB/Utility/ColorExtensions.cs b/Other/NodeEditorExamples/Assets/UNEB/Utility/ColorExtensions.cs new file mode 100644 index 00000000..5a2de0b0 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Utility/ColorExtensions.cs @@ -0,0 +1,13 @@ + +using UnityEngine; + +namespace UNEB.Utility +{ + public static class ColorExtensions + { + public static Color From255(byte r, byte g, byte b) + { + return new Color(r / 255f, g / 255f, b / 255f); + } + } +}
\ No newline at end of file diff --git a/Other/NodeEditorExamples/Assets/UNEB/Utility/ColorExtensions.cs.meta b/Other/NodeEditorExamples/Assets/UNEB/Utility/ColorExtensions.cs.meta new file mode 100644 index 00000000..9aa744fb --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Utility/ColorExtensions.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: fe88d4f484d88f541adb9ee3c76532e9 +timeCreated: 1502671454 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Other/NodeEditorExamples/Assets/UNEB/Utility/FiniteStack.cs b/Other/NodeEditorExamples/Assets/UNEB/Utility/FiniteStack.cs new file mode 100644 index 00000000..2faac0f1 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Utility/FiniteStack.cs @@ -0,0 +1,78 @@ + +using System; +using System.Collections; +using System.Collections.Generic; + +namespace UNEB.Utility +{ + /// <summary> + /// A simple stack with a limited capacity. + /// In order to make more room, the first element (not the top) in the stack is removed. + /// </summary> + /// <typeparam name="T"></typeparam> + public class FiniteStack<T> : IEnumerable<T> + { + private LinkedList<T> _container; + private int _capacity; + + /// <summary> + /// Called when the stack runs out of space and removes + /// the first item (bottom of stack) to make room. + /// </summary> + public event Action<T> OnRemoveBottomItem; + + public FiniteStack(int capacity) + { + _container = new LinkedList<T>(); + _capacity = capacity; + } + + public void Push(T value) + { + _container.AddLast(value); + + // Out of room, remove the first element in the stack. + if (_container.Count == _capacity) { + + T first = _container.First.Value; + _container.RemoveFirst(); + + if (OnRemoveBottomItem != null) + OnRemoveBottomItem(first); + } + } + + public T Peek() + { + return _container.Last.Value; + } + + public T Pop() + { + var lastVal = _container.Last.Value; + _container.RemoveLast(); + + return lastVal; + } + + public void Clear() + { + _container.Clear(); + } + + public int Count + { + get { return _container.Count; } + } + + public IEnumerator<T> GetEnumerator() + { + return _container.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return _container.GetEnumerator(); + } + } +}
\ No newline at end of file diff --git a/Other/NodeEditorExamples/Assets/UNEB/Utility/FiniteStack.cs.meta b/Other/NodeEditorExamples/Assets/UNEB/Utility/FiniteStack.cs.meta new file mode 100644 index 00000000..33af9b97 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Utility/FiniteStack.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 8b4b8b87bda6573489817470ee03e595 +timeCreated: 1503072950 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Other/NodeEditorExamples/Assets/UNEB/Utility/Pair.cs b/Other/NodeEditorExamples/Assets/UNEB/Utility/Pair.cs new file mode 100644 index 00000000..dfff1249 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Utility/Pair.cs @@ -0,0 +1,20 @@ + +namespace UNEB.Utility +{ + /// <summary> + /// Simple pair tuple. + /// </summary> + /// <typeparam name="T1"></typeparam> + /// <typeparam name="T2"></typeparam> + public class Pair<T1, T2> + { + public readonly T1 item1; + public readonly T2 item2; + + public Pair(T1 item1, T2 item2) + { + this.item1 = item1; + this.item2 = item2; + } + } +}
\ No newline at end of file diff --git a/Other/NodeEditorExamples/Assets/UNEB/Utility/Pair.cs.meta b/Other/NodeEditorExamples/Assets/UNEB/Utility/Pair.cs.meta new file mode 100644 index 00000000..ac58e80c --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Utility/Pair.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 4c74f38f4b664f749bd0e508ea0ccc2d +timeCreated: 1502603700 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Other/NodeEditorExamples/Assets/UNEB/Utility/StateMachine.cs b/Other/NodeEditorExamples/Assets/UNEB/Utility/StateMachine.cs new file mode 100644 index 00000000..9c3a8992 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Utility/StateMachine.cs @@ -0,0 +1,300 @@ +using UnityEngine; +using System; +using System.Collections.Generic; + +namespace Bonsai.Utility +{ + /// <summary> + /// A finite state machine. + /// </summary> + /// <typeparam name="T">The date type to be stored by the machine states.</typeparam> + public class StateMachine<T> + { + /// <summary> + /// An event that fires when the machine finishes transitioning to another state. + /// </summary> + public event Action OnStateChangedEvent = delegate { }; + + protected Dictionary<T, State> _states = new Dictionary<T, State>(); + + /// <summary> + /// Get all the state data. + /// </summary> + /// <returns></returns> + public IEnumerable<T> Data() + { + return _states.Keys; + } + + protected State _currentState; + + public State CurrentState + { + get { return _currentState; } + } + + /// <summary> + /// Adds a state to the machine. + /// </summary> + /// <param name="data"></param> + public void AddState(T data) + { + var s = new State(data); + _states.Add(data, s); ; + } + + public void AddState(State s) + { + _states.Add(s.Value, s); + } + + public void AddTransition(State start, State end, Func<bool> condition, Func<bool> onMakingTransition) + { + var t = new Transition(condition); + t.onMakingTransition = onMakingTransition; + + AddTransition(start, end, t); + } + + public void AddTransition(State start, State end, Transition t) + { + start.Add(t); + t.SetNextState(end); + } + + /// <summary> + /// Add a transition that goes from start to end state. + /// </summary> + /// <param name="start"></param> + /// <param name="end"></param> + /// <param name="t"></param> + public void AddTransition(T start, T end, Transition t) + { + var startST = GetState(start); + var endST = GetState(end); + + if (startST == null || endST == null) { + Debug.LogError("State(s) are not in the state machine"); + return; + } + + AddTransition(startST, endST, t); + } + + /// <summary> + /// Add two transitions. + /// One from start to end. + /// Another from end to start. + /// </summary> + /// <param name="start"></param> + /// <param name="end"></param> + /// <param name="startToEnd"></param> + /// <param name="endToStart"></param> + public void AddBiTransition(T start, T end, Transition startToEnd, Transition endToStart) + { + var startST = GetState(start); + var endST = GetState(end); + + if (startST == null || endST == null) { + Debug.LogError("State(s) are not in the state machine"); + return; + } + + AddTransition(startST, endST, startToEnd); + AddTransition(endST, startST, endToStart); + } + + /// <summary> + /// Gets the state associated with the data. + /// </summary> + /// <param name="data"></param> + /// <returns></returns> + public State GetState(T data) + { + if (_states.ContainsKey(data)) { + return _states[data]; + } + + return null; + } + + /// <summary> + /// Sets the current active state of the machine. + /// </summary> + /// <param name="data"></param> + public void SetCurrentState(T data) + { + + var state = GetState(data); + + if (state == null) { + Debug.LogError(data + " is not in the state machine."); + } + + else { + _currentState = state; + } + } + + /// <summary> + /// Handles moving to next state when conditions are met. + /// </summary> + public void Update() + { + if (_currentState == null) { + return; + } + + Transition validTrans = null; + + // Pick the next state if the transition conditions are met. + for (int i = 0; i < _currentState.Transitions.Count; i++) { + + if (_currentState.Transitions[i].AllConditionsMet()) { + validTrans = _currentState.Transitions[i]; + break; + } + } + + if (validTrans != null) { + + // Call on making transition. + if (validTrans.onMakingTransition()) { + + // Call on state exit. + if (_currentState.onStateExit != null) + _currentState.onStateExit(); + + // Change the state to the next one. + _currentState = validTrans.NextState; + + // Call on state enter. + if (_currentState.onStateEnter != null) + _currentState.onStateEnter(); + + OnStateChangedEvent(); + } + } + } + + /// <summary> + /// A transition between two states than only occurs if all + /// its conditions are satisfied. + /// </summary> + public class Transition + { + private State _nextState = null; + private List<Func<bool>> _conditions = new List<Func<bool>>(); + + /// <summary> + /// Called after the 'from' state exits and before the 'to' state enters. + /// If this fails, then it goes back to the starting state. + /// </summary> + public Func<bool> onMakingTransition = () => { return true; }; + + public Transition() + { + + } + + /// <summary> + /// Pass in initial conditions + /// </summary> + /// <param name="?"></param> + public Transition(params Func<bool>[] conditions) + { + foreach (var c in conditions) { + AddCondition(c); + } + } + + /// <summary> + /// Adds a condition that must be satisfied in order to do the transition. + /// </summary> + /// <param name="cond"></param> + public void AddCondition(Func<bool> cond) + { + _conditions.Add(cond); + } + + /// <summary> + /// Tests if all the conditions of the transition are satisfied. + /// </summary> + /// <returns></returns> + public bool AllConditionsMet() + { + for (int i = 0; i < _conditions.Count; i++) { + + if (!_conditions[i]()) return false; + } + + // All conditions returned true. + return true; + } + + /// <summary> + /// Set the state that transition goes to. + /// </summary> + /// <param name="next"></param> + public void SetNextState(State next) + { + _nextState = next; + } + + /// <summary> + /// The state that transition goes to. + /// </summary> + public State NextState + { + get { return _nextState; } + } + } + + /// <summary> + /// A state of the machine. + /// </summary> + public class State + { + private T _data; + private List<Transition> _transitions = new List<Transition>(); + + /// <summary> + /// Executes when the machine transitions into this state. + /// </summary> + public Action onStateEnter; + + /// <summary> + /// Executes when the machine transitions out of this state. + /// </summary> + public Action onStateExit; + + /// <summary> + /// Construct a state with its data. + /// </summary> + /// <param name="data"></param> + public State(T data) + { + _data = data; + } + + /// <summary> + /// Adds a transition to the state. + /// </summary> + /// <param name="t"></param> + public void Add(Transition t) + { + _transitions.Add(t); + } + + /// <summary> + /// The data held by the state. + /// </summary> + public T Value { get { return _data; } } + + /// <summary> + /// The transitions connected to the state. + /// </summary> + public List<Transition> Transitions { get { return _transitions; } } + } + } +}
\ No newline at end of file diff --git a/Other/NodeEditorExamples/Assets/UNEB/Utility/StateMachine.cs.meta b/Other/NodeEditorExamples/Assets/UNEB/Utility/StateMachine.cs.meta new file mode 100644 index 00000000..e84d2aad --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Utility/StateMachine.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 5431af42bc33d804eb9504ebe195cc41 +timeCreated: 1503072950 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Other/NodeEditorExamples/Assets/UNEB/Utility/StringExtensions.cs b/Other/NodeEditorExamples/Assets/UNEB/Utility/StringExtensions.cs new file mode 100644 index 00000000..33c0d960 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Utility/StringExtensions.cs @@ -0,0 +1,29 @@ + +namespace UNEB +{ + public static class StringExtensions + { + + /// <summary> + /// Merges the parent and child paths with the '/' character. + /// </summary> + /// <param name="parentDir"></param> + /// <param name="childDir"></param> + /// <returns></returns> + public static string Dir(this string parentDir, string childDir) + { + return parentDir + '/' + childDir; + } + + /// <summary> + /// Appends the extension to the file name with '.' + /// </summary> + /// <param name="file"></param> + /// <param name="extension"></param> + /// <returns></returns> + public static string Ext(this string file, string extension) + { + return file + '.' + extension; + } + } +}
\ No newline at end of file diff --git a/Other/NodeEditorExamples/Assets/UNEB/Utility/StringExtensions.cs.meta b/Other/NodeEditorExamples/Assets/UNEB/Utility/StringExtensions.cs.meta new file mode 100644 index 00000000..2d33c4b7 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Utility/StringExtensions.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ae4ec85959c405246890eb2d46b5c0e5 +timeCreated: 1503086644 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Other/NodeEditorExamples/Assets/UNEB/Utility/TextureLib.cs b/Other/NodeEditorExamples/Assets/UNEB/Utility/TextureLib.cs new file mode 100644 index 00000000..3849326a --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Utility/TextureLib.cs @@ -0,0 +1,191 @@ + +using System.Collections.Generic; +using System.IO; +using System.Linq; + +using UnityEngine; +using UnityEditor; + +namespace UNEB.Utility +{ + /// <summary> + /// A static library that loads and stores references to textures via name. + /// </summary> + public class TextureLib + { + public const string kStandardTexturesFolder = "UNEB Textures"; + public enum TexType { PNG, JPEG, BMP }; + + private static Dictionary<string, Texture2D> _textures = new Dictionary<string, Texture2D>(); + private static Dictionary<TintedTextureKey, Texture2D> _tintedTextures = new Dictionary<TintedTextureKey, Texture2D>(); + + public static void LoadStandardTextures() + { + _textures.Clear(); + _tintedTextures.Clear(); + + LoadTexture("Grid"); + LoadTexture("Circle"); + LoadTexture("Square"); + } + + public static void LoadTexture(string name, TexType type = TexType.PNG) + { + string ext = GetTexTypeExtension(type); + string filename = name.Ext(ext); + string path = GetTextureFolderPath().Dir(filename); + + var tex = AssetDatabase.LoadAssetAtPath<Texture2D>(path); + + if (tex != null) { + _textures.Add(name, tex); + } + + else { + Debug.LogError("The texture: " + path + " could not be found."); + } + } + + public static string GetTexTypeExtension(TexType type) + { + switch (type) { + case TexType.PNG: return "png"; + case TexType.JPEG: return "jpg"; + case TexType.BMP: return "bmp"; + } + + return ""; + } + + public static Texture2D GetTexture(string name) + { + if (_textures.ContainsKey(name)) { + return _textures[name]; + } + + Debug.LogError(name + " is not loaded in the texture library."); + return null; + } + + /// <summary> + /// Gets the texture with a tint. + /// It must be already loaded in the library. + /// </summary> + /// <param name="name"></param> + /// <param name="color"></param> + /// <returns></returns> + public static Texture2D GetTintTex(string name, Color color) + { + var key = new TintedTextureKey(color, name); + + // Check if it already exsists in the tint dictionary. + if (_tintedTextures.ContainsKey(key)) { + + if (_tintedTextures[key]) { + return _tintedTextures[key]; + } + + // Rebuild texture. + else { + _tintedTextures[key] = tintCopy(GetTexture(name), color); + return _tintedTextures[key]; + } + } + + // Make a new tint from the pre-loaded texture. + Texture2D tex = GetTexture(name); + + // Tint the tex and add to tinted tex dictionary. + if (tex) { + + var tintedTex = tintCopy(tex, color); + _tintedTextures.Add(key, tintedTex); + + return tintedTex; + } + + return null; + } + + private static Texture2D tintCopy(Texture2D tex, Color color) + { + int pixCount = tex.width * tex.height; + + var tintedTex = new Texture2D(tex.width, tex.height); + tintedTex.alphaIsTransparency = true; + + var newPixels = new Color[pixCount]; + var pixels = tex.GetPixels(); + + for (int i = 0; i < pixCount; ++i) { + newPixels[i] = color; + newPixels[i].a = pixels[i].a; + } + + tintedTex.SetPixels(newPixels); + tintedTex.Apply(); + + return tintedTex; + } + + public static string GetTextureFolderPath() + { + string fullpath = getFullPath(Application.dataPath, kStandardTexturesFolder); + + if (!string.IsNullOrEmpty(fullpath)) { + + // Return the texture folder path relative to Unity's Asset folder. + int index = fullpath.IndexOf("Assets"); + string localPath = fullpath.Substring(index); + + return localPath; + } + + Debug.LogError("Could not find folder: " + kStandardTexturesFolder); + return ""; + } + + private static string getFullPath(string root, string targetFolderName) + { + string[] dirs = Directory.GetDirectories(root, targetFolderName, SearchOption.AllDirectories); + + // Return first occurance containing targetFolderName. + if (dirs.Length != 0) { + return dirs[0]; + } + + // Could not find anything. + return ""; + } + + private struct TintedTextureKey + { + public readonly Color color; + public readonly string texName; + + public TintedTextureKey(Color c, string name) + { + color = c; + texName = name; + } + + public override int GetHashCode() + { + return color.GetHashCode() * texName.GetHashCode(); + } + + public override bool Equals(object obj) + { + if (obj is TintedTextureKey) { + + var key = (TintedTextureKey)obj; + return key.color == color && key.texName == texName; + } + + else { + return false; + } + } + } + } +}
\ No newline at end of file diff --git a/Other/NodeEditorExamples/Assets/UNEB/Utility/TextureLib.cs.meta b/Other/NodeEditorExamples/Assets/UNEB/Utility/TextureLib.cs.meta new file mode 100644 index 00000000..180ea446 --- /dev/null +++ b/Other/NodeEditorExamples/Assets/UNEB/Utility/TextureLib.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 620aee55f886f914e825c6b891b8bd9b +timeCreated: 1501784046 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: |