From b676da8773ee58d322095c56ac3056d0678e6019 Mon Sep 17 00:00:00 2001
From: s402520 <sven.gerlach@stud-mail.uni-wuerzburg.de>
Date: Thu, 4 May 2023 14:04:08 +0200
Subject: [PATCH] Navigate Articy Flow through DialogueBox

---
 Assets/ArticyTestData/StartFlowPlayer.cs      |  28 ++
 .../StartFlowPlayer.cs.meta}                  |   2 +-
 Assets/Scenes/ArticyTestScene.unity           | 303 ++++++++++++++++++
 Assets/Scenes/ArticyTestScene.unity.meta      |   7 +
 Assets/UI/DialogueBox/ArticyStoryline.cs      |  37 +++
 Assets/UI/DialogueBox/ArticyStoryline.cs.meta |  11 +
 Assets/UI/DialogueBox/DialogueBox.cs          |  58 ++--
 Assets/UI/DialogueBox/DialogueBox.cs.meta     |   2 +-
 Assets/UI/DialogueBox/Storyline.cs            |  79 -----
 .../UI/DialogueBox/WorldSpaceDialogueBox.cs   |  41 +++
 .../DialogueBox/WorldSpaceDialogueBox.cs.meta |  11 +
 11 files changed, 474 insertions(+), 105 deletions(-)
 create mode 100644 Assets/ArticyTestData/StartFlowPlayer.cs
 rename Assets/{UI/DialogueBox/Storyline.cs.meta => ArticyTestData/StartFlowPlayer.cs.meta} (83%)
 create mode 100644 Assets/Scenes/ArticyTestScene.unity
 create mode 100644 Assets/Scenes/ArticyTestScene.unity.meta
 create mode 100644 Assets/UI/DialogueBox/ArticyStoryline.cs
 create mode 100644 Assets/UI/DialogueBox/ArticyStoryline.cs.meta
 delete mode 100644 Assets/UI/DialogueBox/Storyline.cs
 create mode 100644 Assets/UI/DialogueBox/WorldSpaceDialogueBox.cs
 create mode 100644 Assets/UI/DialogueBox/WorldSpaceDialogueBox.cs.meta

diff --git a/Assets/ArticyTestData/StartFlowPlayer.cs b/Assets/ArticyTestData/StartFlowPlayer.cs
new file mode 100644
index 0000000..f676967
--- /dev/null
+++ b/Assets/ArticyTestData/StartFlowPlayer.cs
@@ -0,0 +1,28 @@
+using Articy.Unity;
+using Articy.Unity.Interfaces;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UIElements;
+
+public class StartFlowPlayer : MonoBehaviour
+{
+    private ArticyFlowPlayer flowPlayer;
+
+    void Start()
+    {
+        flowPlayer = GetComponent<ArticyFlowPlayer>();
+        flowPlayer.StartOn = ArticyDatabase.GetObject(72057594037928251);
+        Debug.Log("Press A or B to start one of the dialogues");
+    }
+
+    // Start is called before the first frame update
+    void Update() {
+        if (Input.GetKeyDown("a"))
+            flowPlayer.StartOn = ArticyDatabase.GetObject(72057594037928251);
+
+        if (Input.GetKeyDown("b"))
+            flowPlayer.StartOn = ArticyDatabase.GetObject(72057594037928445);
+    }
+
+}
diff --git a/Assets/UI/DialogueBox/Storyline.cs.meta b/Assets/ArticyTestData/StartFlowPlayer.cs.meta
similarity index 83%
rename from Assets/UI/DialogueBox/Storyline.cs.meta
rename to Assets/ArticyTestData/StartFlowPlayer.cs.meta
index cced93a..d7b44e0 100644
--- a/Assets/UI/DialogueBox/Storyline.cs.meta
+++ b/Assets/ArticyTestData/StartFlowPlayer.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 5ba11467abf042d4f8e33891cdac93bf
+guid: 04f433ebeda01b14092e4f7f84512a40
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Assets/Scenes/ArticyTestScene.unity b/Assets/Scenes/ArticyTestScene.unity
new file mode 100644
index 0000000..0d601c7
--- /dev/null
+++ b/Assets/Scenes/ArticyTestScene.unity
@@ -0,0 +1,303 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!29 &1
+OcclusionCullingSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_OcclusionBakeSettings:
+    smallestOccluder: 5
+    smallestHole: 0.25
+    backfaceThreshold: 100
+  m_SceneGUID: 00000000000000000000000000000000
+  m_OcclusionCullingData: {fileID: 0}
+--- !u!104 &2
+RenderSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 9
+  m_Fog: 0
+  m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
+  m_FogMode: 3
+  m_FogDensity: 0.01
+  m_LinearFogStart: 0
+  m_LinearFogEnd: 300
+  m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
+  m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
+  m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
+  m_AmbientIntensity: 1
+  m_AmbientMode: 0
+  m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
+  m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0}
+  m_HaloStrength: 0.5
+  m_FlareStrength: 1
+  m_FlareFadeSpeed: 3
+  m_HaloTexture: {fileID: 0}
+  m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
+  m_DefaultReflectionMode: 0
+  m_DefaultReflectionResolution: 128
+  m_ReflectionBounces: 1
+  m_ReflectionIntensity: 1
+  m_CustomReflection: {fileID: 0}
+  m_Sun: {fileID: 0}
+  m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1}
+  m_UseRadianceAmbientProbe: 0
+--- !u!157 &3
+LightmapSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 12
+  m_GIWorkflowMode: 1
+  m_GISettings:
+    serializedVersion: 2
+    m_BounceScale: 1
+    m_IndirectOutputScale: 1
+    m_AlbedoBoost: 1
+    m_EnvironmentLightingMode: 0
+    m_EnableBakedLightmaps: 1
+    m_EnableRealtimeLightmaps: 0
+  m_LightmapEditorSettings:
+    serializedVersion: 12
+    m_Resolution: 2
+    m_BakeResolution: 40
+    m_AtlasSize: 1024
+    m_AO: 0
+    m_AOMaxDistance: 1
+    m_CompAOExponent: 1
+    m_CompAOExponentDirect: 0
+    m_ExtractAmbientOcclusion: 0
+    m_Padding: 2
+    m_LightmapParameters: {fileID: 0}
+    m_LightmapsBakeMode: 1
+    m_TextureCompression: 1
+    m_FinalGather: 0
+    m_FinalGatherFiltering: 1
+    m_FinalGatherRayCount: 256
+    m_ReflectionCompression: 2
+    m_MixedBakeMode: 2
+    m_BakeBackend: 1
+    m_PVRSampling: 1
+    m_PVRDirectSampleCount: 32
+    m_PVRSampleCount: 512
+    m_PVRBounces: 2
+    m_PVREnvironmentSampleCount: 256
+    m_PVREnvironmentReferencePointCount: 2048
+    m_PVRFilteringMode: 1
+    m_PVRDenoiserTypeDirect: 1
+    m_PVRDenoiserTypeIndirect: 1
+    m_PVRDenoiserTypeAO: 1
+    m_PVRFilterTypeDirect: 0
+    m_PVRFilterTypeIndirect: 0
+    m_PVRFilterTypeAO: 0
+    m_PVREnvironmentMIS: 1
+    m_PVRCulling: 1
+    m_PVRFilteringGaussRadiusDirect: 1
+    m_PVRFilteringGaussRadiusIndirect: 5
+    m_PVRFilteringGaussRadiusAO: 2
+    m_PVRFilteringAtrousPositionSigmaDirect: 0.5
+    m_PVRFilteringAtrousPositionSigmaIndirect: 2
+    m_PVRFilteringAtrousPositionSigmaAO: 1
+    m_ExportTrainingData: 0
+    m_TrainingDataDestination: TrainingData
+    m_LightProbeSampleCountMultiplier: 4
+  m_LightingDataAsset: {fileID: 0}
+  m_LightingSettings: {fileID: 0}
+--- !u!196 &4
+NavMeshSettings:
+  serializedVersion: 2
+  m_ObjectHideFlags: 0
+  m_BuildSettings:
+    serializedVersion: 2
+    agentTypeID: 0
+    agentRadius: 0.5
+    agentHeight: 2
+    agentSlope: 45
+    agentClimb: 0.4
+    ledgeDropHeight: 0
+    maxJumpAcrossDistance: 0
+    minRegionArea: 2
+    manualCellSize: 0
+    cellSize: 0.16666667
+    manualTileSize: 0
+    tileSize: 256
+    accuratePlacement: 0
+    maxJobWorkers: 0
+    preserveTilesOutsideBounds: 0
+    debug:
+      m_Flags: 0
+  m_NavMeshData: {fileID: 0}
+--- !u!1 &1256801072
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1256801075}
+  - component: {fileID: 1256801074}
+  - component: {fileID: 1256801073}
+  m_Layer: 0
+  m_Name: Main Camera
+  m_TagString: MainCamera
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!81 &1256801073
+AudioListener:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1256801072}
+  m_Enabled: 1
+--- !u!20 &1256801074
+Camera:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1256801072}
+  m_Enabled: 1
+  serializedVersion: 2
+  m_ClearFlags: 1
+  m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
+  m_projectionMatrixMode: 1
+  m_GateFitMode: 2
+  m_FOVAxisMode: 0
+  m_SensorSize: {x: 36, y: 24}
+  m_LensShift: {x: 0, y: 0}
+  m_FocalLength: 50
+  m_NormalizedViewPortRect:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1
+  near clip plane: 0.3
+  far clip plane: 1000
+  field of view: 60
+  orthographic: 0
+  orthographic size: 5
+  m_Depth: -1
+  m_CullingMask:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_RenderingPath: -1
+  m_TargetTexture: {fileID: 0}
+  m_TargetDisplay: 0
+  m_TargetEye: 3
+  m_HDR: 1
+  m_AllowMSAA: 1
+  m_AllowDynamicResolution: 0
+  m_ForceIntoRT: 0
+  m_OcclusionCulling: 1
+  m_StereoConvergence: 10
+  m_StereoSeparation: 0.022
+--- !u!4 &1256801075
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1256801072}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 1, z: -10}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1933320861
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1933320863}
+  - component: {fileID: 1933320862}
+  m_Layer: 0
+  m_Name: Directional Light
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!108 &1933320862
+Light:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1933320861}
+  m_Enabled: 1
+  serializedVersion: 10
+  m_Type: 1
+  m_Shape: 0
+  m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1}
+  m_Intensity: 1
+  m_Range: 10
+  m_SpotAngle: 30
+  m_InnerSpotAngle: 21.80208
+  m_CookieSize: 10
+  m_Shadows:
+    m_Type: 2
+    m_Resolution: -1
+    m_CustomResolution: -1
+    m_Strength: 1
+    m_Bias: 0.05
+    m_NormalBias: 0.4
+    m_NearPlane: 0.2
+    m_CullingMatrixOverride:
+      e00: 1
+      e01: 0
+      e02: 0
+      e03: 0
+      e10: 0
+      e11: 1
+      e12: 0
+      e13: 0
+      e20: 0
+      e21: 0
+      e22: 1
+      e23: 0
+      e30: 0
+      e31: 0
+      e32: 0
+      e33: 1
+    m_UseCullingMatrixOverride: 0
+  m_Cookie: {fileID: 0}
+  m_DrawHalo: 0
+  m_Flare: {fileID: 0}
+  m_RenderMode: 0
+  m_CullingMask:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_RenderingLayerMask: 1
+  m_Lightmapping: 4
+  m_LightShadowCasterMode: 0
+  m_AreaSize: {x: 1, y: 1}
+  m_BounceIntensity: 1
+  m_ColorTemperature: 6570
+  m_UseColorTemperature: 0
+  m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0}
+  m_UseBoundingSphereOverride: 0
+  m_UseViewFrustumForShadowCasterCull: 1
+  m_ShadowRadius: 0
+  m_ShadowAngle: 0
+--- !u!4 &1933320863
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1933320861}
+  m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261}
+  m_LocalPosition: {x: 0, y: 3, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0}
diff --git a/Assets/Scenes/ArticyTestScene.unity.meta b/Assets/Scenes/ArticyTestScene.unity.meta
new file mode 100644
index 0000000..f9198f3
--- /dev/null
+++ b/Assets/Scenes/ArticyTestScene.unity.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 002b97dad56c6f843a061ab2ee0578c9
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/UI/DialogueBox/ArticyStoryline.cs b/Assets/UI/DialogueBox/ArticyStoryline.cs
new file mode 100644
index 0000000..14f3eaa
--- /dev/null
+++ b/Assets/UI/DialogueBox/ArticyStoryline.cs
@@ -0,0 +1,37 @@
+using Articy.Unity;
+using Articy.Unity.Interfaces;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class ArticyStoryline : MonoBehaviour, IArticyFlowPlayerCallbacks {
+    public IList<Branch> currentBranches;
+    
+    //previously ApplyTransition
+    public void OnFlowPlayerPaused(IFlowObject currentNode) {
+        var dialogueBox = GetComponent<DialogueBox>();
+        
+        var objWithText = currentNode as IObjectWithText;
+        if (objWithText != null) 
+            dialogueBox.SetText(objWithText.Text);
+
+        var objSpeaker = currentNode as IObjectWithSpeaker;
+        if (objSpeaker != null) {
+            var speakerDisplayName = objSpeaker.Speaker as IObjectWithDisplayName;
+            dialogueBox.SetActor(speakerDisplayName.DisplayName);
+        }
+        else
+            dialogueBox.SetActor(string.Empty);
+
+    }
+
+    public void OnBranchesUpdated(IList<Branch> branches) {
+        currentBranches = branches;
+        GetComponent<DialogueBox>().SetTransitions(currentBranches);
+    }
+
+    public void ApplyTransition(int count) {
+        GetComponent<DialogueBox>().ClearUI();
+        GetComponent<ArticyFlowPlayer>().Play(currentBranches[count]);
+    }
+}
diff --git a/Assets/UI/DialogueBox/ArticyStoryline.cs.meta b/Assets/UI/DialogueBox/ArticyStoryline.cs.meta
new file mode 100644
index 0000000..6a513f4
--- /dev/null
+++ b/Assets/UI/DialogueBox/ArticyStoryline.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: d52eb85494921dd48be8d847a8298602
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/UI/DialogueBox/DialogueBox.cs b/Assets/UI/DialogueBox/DialogueBox.cs
index 00c44f7..14d6305 100644
--- a/Assets/UI/DialogueBox/DialogueBox.cs
+++ b/Assets/UI/DialogueBox/DialogueBox.cs
@@ -1,46 +1,48 @@
 using UnityEditor;
+using System.Collections.Generic;
+using Articy.Unity;
+using Articy.Unity.Interfaces;
+using Articy.Unity.Utils;
 using UnityEngine;
-using UnityEngine.Events;
+using System.Collections;
+using UnityEngine.EventSystems;
 using UnityEngine.UIElements;
 
-
+[RequireComponent(typeof(UIDocument))]
 public class DialogueBox : MonoBehaviour {
     private UIDocument uiDocument;
-    [SerializeField] protected VisualTreeAsset visualTree;
-    [SerializeField] protected StyleSheet styleSheet;
-    [SerializeField] Katas.Experimental.WorldSpaceUIDocument worldSpaceUIDocument;
     private VisualElement root;
     private Button[] buttons;
 
+    public VisualTreeAsset visualTree;
+    public StyleSheet styleSheet;
 
     public void Awake() {
-        worldSpaceUIDocument.onUIDocumentReady.AddListener(setUIDocument);
+        uiDocument = GetComponent<UIDocument>();
     }
 
-    private void setUIDocument() {
-        uiDocument = GetComponent<UIDocument>();
+    public void OnEnable() {
         root = uiDocument.rootVisualElement;
         VisualElement tree = visualTree.CloneTree();
         tree.styleSheets.Add(styleSheet);
         root.Add(tree);
         buttons = root.Query<Button>().ToList().ToArray();
+        ClearUI();
 
-        for (var i = 0; i < buttons.Length; i++)
-        {
+        for (var i = 0; i < buttons.Length; i++) {
             var index = i;
-            buttons[i].RegisterCallback<MouseUpEvent>(_ => GetComponent<Storyline>().ApplyTransition(index));
+            buttons[i].RegisterCallback<MouseUpEvent>(_ => GetComponent<ArticyStoryline>().ApplyTransition(index));
         }
-
     }
 
-    public void OnEnable() {
-        
-        SetActor("ActorName");
-        SetText("DialogueText");
-
+    public void ClearUI() {
+        SetActor(string.Empty);
+        SetText(string.Empty);
+        for (var i = 0; i < buttons.Length; i++)
+            buttons[i].visible = false;
     }
 
-    public void SetActor(string actor) {
+public void SetActor(string actor) {
         root.Q<Label>("Actor").text = actor;
     }
 
@@ -48,15 +50,23 @@ public void SetText(string text) {
         root.Q<TextElement>("Dialogue").text = text;
     }
 
-    public void SetTransitions(Storyline.Transition[] transitions) {
-        for(var i = 0; i < buttons.Length; i++) {
-            if(i < transitions.Length) {
+    public void SetTransitions(IList<Branch> branches) {
+        for (var i = 0; i < buttons.Length; i++) {
+            buttons[i].text = string.Empty;        
+
+            if (i < branches.Count) {
                 buttons[i].visible = true;
-                buttons[i].text = transitions[i].transitionText;
+                if (branches.Count > 1) {
+                    var menuText = branches[i].Target as IObjectWithMenuText;
+                    buttons[i].text = menuText.MenuText;
+                }
+                else 
+                    buttons[i].text = "Continue";
+
             }
-            else {
+            else 
                 buttons[i].visible = false;
-            }
+
         }
     }
 }
diff --git a/Assets/UI/DialogueBox/DialogueBox.cs.meta b/Assets/UI/DialogueBox/DialogueBox.cs.meta
index 3b51a12..8216950 100644
--- a/Assets/UI/DialogueBox/DialogueBox.cs.meta
+++ b/Assets/UI/DialogueBox/DialogueBox.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: f6a8876d339d1ce4dbb83ea0158084f2
+guid: 0b06390bd25b8824eb83c9de4937a410
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Assets/UI/DialogueBox/Storyline.cs b/Assets/UI/DialogueBox/Storyline.cs
deleted file mode 100644
index ff1d3b4..0000000
--- a/Assets/UI/DialogueBox/Storyline.cs
+++ /dev/null
@@ -1,79 +0,0 @@
-using UnityEngine;
-
-public class Storyline : MonoBehaviour {
-    public Node currentNode;
-    [SerializeField] Katas.Experimental.WorldSpaceUIDocument worldSpaceUIDocument;
-
-
-    public void Start() {
-        Transition[] GHI = new Transition[2];
-        Node testNode = new Node("Actor 3","Testing Text 3",GHI);
-
-        Transition testTransition = new Transition("Continue", testNode);
-        Transition[] ABC = new Transition[1];
-        ABC[0] = testTransition;
-        Node TestNode2 = new Node("Actor 2","Testing Text 2", ABC);
-
-        Transition testTransition1 = new Transition("Yes", TestNode2);
-        Transition[] DEF = new Transition[1];
-        DEF[0] = testTransition1;
-        Node testNode3 = new Node("Actor 1","Testing Text 1", DEF);
-
-        Transition testTransition2 = new Transition("No", testNode3);
-        GHI[0] = testTransition1;
-       
-        Transition[] JKL = new Transition[5];
-        JKL[0] = testTransition1;
-        JKL[1] = testTransition2;
-        JKL[3] = testTransition;
-        JKL[4] = testTransition1;
-
-        Node testNode4 = new Node("Actor 4", "Testing Text 4", JKL);
-
-        Transition testTransition3 = new Transition("Unsure", testNode4);
-        GHI[1] = testTransition3;
-        JKL[2] = testTransition3;
-
-        currentNode = testNode4;
-        worldSpaceUIDocument.onUIDocumentReady.AddListener(UpdateUi);
-    }
-
-    public void ApplyTransition(int count) {
-        currentNode = currentNode.transitions[count].target;
-        UpdateUi();
-    }
-
-    public void UpdateUi() {
-        var dialogueBox = GetComponent<DialogueBox>();
-        dialogueBox.SetActor(currentNode.actorName);
-        dialogueBox.SetText(currentNode.dialogueText);
-        dialogueBox.SetTransitions(currentNode.transitions);
-    }
-
-
-    public class Node {
-        public readonly string actorName;
-        public readonly string dialogueText;
-        public readonly Transition[] transitions;
-
-        public Node(string actor, string dialogue) {
-            actorName = actor;
-            dialogueText = dialogue;
-        }
-
-        public Node(string actor, string dialogue, Transition[] transitions) : this(actor, dialogue) {
-            this.transitions = transitions;
-        }
-    }
-
-    
-    public class Transition {
-        public readonly string transitionText;
-        public readonly Node target;
-
-        public Transition(string text, Node target) {
-            transitionText = text;
-            this.target = target;
-        }
-    }
-}
\ No newline at end of file
diff --git a/Assets/UI/DialogueBox/WorldSpaceDialogueBox.cs b/Assets/UI/DialogueBox/WorldSpaceDialogueBox.cs
new file mode 100644
index 0000000..126e1f8
--- /dev/null
+++ b/Assets/UI/DialogueBox/WorldSpaceDialogueBox.cs
@@ -0,0 +1,41 @@
+using UnityEditor;
+using UnityEngine;
+using UnityEngine.Events;
+using UnityEngine.UIElements;
+
+
+public class WorldSpaceDialogueBox : MonoBehaviour {
+
+    //Only the different parts for now
+
+    private UIDocument uiDocument;
+    [SerializeField] protected VisualTreeAsset visualTree;
+    [SerializeField] protected StyleSheet styleSheet;
+    [SerializeField] Katas.Experimental.WorldSpaceUIDocument worldSpaceUIDocument;
+    private VisualElement root;
+    private Button[] buttons;
+
+
+    public void Awake() {
+        worldSpaceUIDocument.onUIDocumentReady.AddListener(setUIDocument);
+    }
+
+    private void setUIDocument() {
+        uiDocument = GetComponent<UIDocument>();
+        root = uiDocument.rootVisualElement;
+        VisualElement tree = visualTree.CloneTree();
+        tree.styleSheets.Add(styleSheet);
+        root.Add(tree);
+        buttons = root.Query<Button>().ToList().ToArray();
+
+        for (var i = 0; i < buttons.Length; i++) {
+            var index = i;
+            buttons[i].RegisterCallback<MouseUpEvent>(_ => GetComponent<ArticyStoryline>().ApplyTransition(index));
+        }
+
+    }
+
+}
+
+
+
diff --git a/Assets/UI/DialogueBox/WorldSpaceDialogueBox.cs.meta b/Assets/UI/DialogueBox/WorldSpaceDialogueBox.cs.meta
new file mode 100644
index 0000000..3b51a12
--- /dev/null
+++ b/Assets/UI/DialogueBox/WorldSpaceDialogueBox.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: f6a8876d339d1ce4dbb83ea0158084f2
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
-- 
GitLab