public static DialogueNode Create(string title, DialogueProperties properties, string next = "") { var node = new DialogueNode { title = title, Guid = System.Guid.NewGuid().ToString(), name = "CustomNode", Properties = properties, }; var inputPort = DialoguePort.Create(Direction.Input, Port.Capacity.Multi); inputPort.portName = "Prev"; inputPort.name = "Port"; var outputPort = DialoguePort.Create(Direction.Output, Port.Capacity.Single); outputPort.portName = "Next"; outputPort.name = "Port"; (outputPort as DialoguePort).Next = next; var propertiesFoldout = new Foldout { text = "Dialogue Properties" }; //Dialogue Background var bgField = new ObjectField { objectType = typeof(Sprite), value = properties.Speaker, label = "Background" }; bgField.RegisterValueChangedCallback(e => { node.Properties.Background = e.newValue as Sprite; }); node.Properties.Background = bgField.value as Sprite; //Create Dialogue Properties var sentenceTextfield = new TextField { value = properties.Text, multiline = true, }; node.Properties.Text = sentenceTextfield.value; sentenceTextfield.RegisterValueChangedCallback(e => { node.Properties.Text = e.newValue; }); //Create Speaker var speakerField = new ObjectField { objectType = typeof(Character), value = properties.Speaker, label = "Speaker" }; speakerField.RegisterValueChangedCallback(e => { node.Properties.Speaker = e.newValue as Character; }); node.Properties.Speaker = speakerField.value as Character; var speakerPositionEnum = new EnumField(); speakerPositionEnum.label = "Speaker On-Screen Position"; speakerPositionEnum.Init(CharacterScreenPosition.Middle); speakerPositionEnum.value = CharacterScreenPosition.Middle; speakerPositionEnum.RegisterValueChangedCallback(e => { node.Properties.speakerPosition = (CharacterScreenPosition)e.newValue; }); //Create Conversant1 var conversant1Field = new ObjectField { objectType = typeof(Character), value = properties.Conversant1, label = "Conversant1" }; conversant1Field.RegisterValueChangedCallback(e => { node.Properties.Conversant1 = e.newValue as Character; }); node.Properties.Conversant1 = conversant1Field.value as Character; var conversant1PositionEnum = new EnumField(); conversant1PositionEnum.label = "Conversant1 On-Screen Position"; conversant1PositionEnum.Init(properties.conversant1Position); conversant1PositionEnum.value = properties.conversant1Position; conversant1PositionEnum.RegisterValueChangedCallback(e => { node.Properties.conversant1Position = (CharacterScreenPosition)e.newValue; }); //Create Conversant2 var conversant2Field = new ObjectField { objectType = typeof(Character), value = properties.Conversant2, label = "Conversant2" }; conversant2Field.RegisterValueChangedCallback(e => { node.Properties.Conversant2 = e.newValue as Character; }); node.Properties.Conversant2 = conversant2Field.value as Character; var conversant2PositionEnum = new EnumField(); conversant2PositionEnum.label = "Conversant2 On-Screen Position"; conversant2PositionEnum.Init(properties.conversant2Position); conversant2PositionEnum.value = properties.conversant2Position; conversant2PositionEnum.RegisterValueChangedCallback(e => { node.Properties.conversant2Position = (CharacterScreenPosition)e.newValue; }); node.mainContainer.Add(propertiesFoldout); propertiesFoldout.contentContainer.Add(bgField); propertiesFoldout.contentContainer.Add(speakerField); propertiesFoldout.contentContainer.Add(speakerPositionEnum); propertiesFoldout.contentContainer.Add(conversant1Field); propertiesFoldout.contentContainer.Add(conversant1PositionEnum); propertiesFoldout.contentContainer.Add(conversant2Field); propertiesFoldout.contentContainer.Add(conversant2PositionEnum); node.mainContainer.Add(sentenceTextfield); node.inputContainer.Add(inputPort); node.outputContainer.Add(outputPort); node.RefreshPorts(); node.RefreshExpandedState(); node.SetPosition(new Rect(Vector2.zero, nodeSize)); return(node); }