diff --git a/Assets/Scripts/InteractionEngine/CommunicationEvents.cs b/Assets/Scripts/InteractionEngine/CommunicationEvents.cs index c861fa17148827511f4b54b25cf5deb1ae586602..e38a240a28756860bf54abcfcf37c6d0365892f4 100644 --- a/Assets/Scripts/InteractionEngine/CommunicationEvents.cs +++ b/Assets/Scripts/InteractionEngine/CommunicationEvents.cs @@ -65,8 +65,9 @@ public class AnimationEventWithUris : UnityEvent<List<string>> //TODO: Remove this event after CompletionsDemo isn't necessary anymore public static AnimationEventWithUri parameterDisplayHint = new AnimationEventWithUri(); - public static AnimationEvent CompletionsHintEvent = new AnimationEvent(); + public static AnimationEvent ScrollFactHintEvent = new AnimationEvent(); public static FactEvent AnimateExistingFactEvent = new FactEvent(); + public static FactEvent AnimateNonExistingFactEvent = new FactEvent(); public static AnimationEventWithUris HintAvailableEvent = new AnimationEventWithUris(); diff --git a/Assets/Scripts/InteractionEngine/Fact.cs b/Assets/Scripts/InteractionEngine/Fact.cs index c576b07c83143d3bd4218bb084aece3aa070e178..bc281491985f8832e68a41f707b2cd11ff5e563b 100644 --- a/Assets/Scripts/InteractionEngine/Fact.cs +++ b/Assets/Scripts/InteractionEngine/Fact.cs @@ -9,7 +9,9 @@ public class ParsingDictionary { public static Dictionary<string, Func<Scroll.ScrollFact, Fact>> parseFactDictionary = new Dictionary<string, Func<Scroll.ScrollFact, Fact>>() { {MMTURIs.Point, PointFact.parseFact}, {MMTURIs.Metric, LineFact.parseFact}, - {MMTURIs.Angle, AngleFact.parseFact} + {MMTURIs.Angle, AngleFact.parseFact}, + //90Degree-Angle + {MMTURIs.Ded, AngleFact.parseFact} }; } @@ -36,6 +38,15 @@ public string format(float t) { return t.ToString("0.0000").Replace(',', '.'); } + + //If FactType depends on other Facts, e.g. AngleFacts depend on 3 PointFacts + public abstract Boolean hasDependentFacts(); + + public abstract int[] getDependentFactIds(); + + public abstract override bool Equals(System.Object obj); + + public abstract override int GetHashCode(); } public abstract class DirectedFact : Fact @@ -122,12 +133,45 @@ public PointFact(float a, float b, float c, string uri) public static PointFact parseFact(Scroll.ScrollFact fact) { String uri = fact.@ref.uri; - float a = (float) ((OMF)((OMA)((Scroll.ScrollSymbolFact)fact).df).arguments[0]).f; - float b = (float) ((OMF)((OMA)((Scroll.ScrollSymbolFact)fact).df).arguments[1]).f; - float c = (float) ((OMF)((OMA)((Scroll.ScrollSymbolFact)fact).df).arguments[2]).f; - return new PointFact(a, b, c, uri); + OMA df = (OMA)((Scroll.ScrollSymbolFact)fact).df; + if (df != null) + { + float a = (float)((OMF)df.arguments[0]).f; + float b = (float)((OMF)df.arguments[1]).f; + float c = (float)((OMF)df.arguments[2]).f; + return new PointFact(a, b, c, uri); + } + else { + return null; + } } + public override Boolean hasDependentFacts() { + return false; + } + + public override int[] getDependentFactIds() { + return null; + } + + public override bool Equals(System.Object obj) + { + //Check for null and compare run-time types. + if ((obj == null) || !this.GetType().Equals(obj.GetType())) + { + return false; + } + else + { + PointFact p = (PointFact)obj; + return this.Point.Equals(p.Point) && this.Normal.Equals(p.Normal); + } + } + + public override int GetHashCode() + { + return this.Point.GetHashCode() ^ this.Normal.GetHashCode(); + } } public class LineFact : DirectedFact @@ -186,9 +230,46 @@ public static LineFact parseFact(Scroll.ScrollFact fact) String uri = fact.@ref.uri; String pointAUri = ((OMS)((OMA)((Scroll.ScrollValueFact)fact).lhs).arguments[0]).uri; String pointBUri = ((OMS)((OMA)((Scroll.ScrollValueFact)fact).lhs).arguments[1]).uri; - int pid1 = CommunicationEvents.Facts.Find(x => x.backendURI.Equals(pointAUri)).Id; - int pid2 = CommunicationEvents.Facts.Find(x => x.backendURI.Equals(pointBUri)).Id; - return new LineFact(pid1, pid2, uri); + if (CommunicationEvents.Facts.Exists(x => x.backendURI.Equals(pointAUri)) && + CommunicationEvents.Facts.Exists(x => x.backendURI.Equals(pointBUri))) + { + int pid1 = CommunicationEvents.Facts.Find(x => x.backendURI.Equals(pointAUri)).Id; + int pid2 = CommunicationEvents.Facts.Find(x => x.backendURI.Equals(pointBUri)).Id; + return new LineFact(pid1, pid2, uri); + } + //If dependent facts do not exist return null + else { + return null; + } + } + + public override Boolean hasDependentFacts() + { + return true; + } + + public override int[] getDependentFactIds() + { + return new int[] { Pid1, Pid2 }; + } + + public override bool Equals(System.Object obj) + { + //Check for null and compare run-time types. + if ((obj == null) || !this.GetType().Equals(obj.GetType())) + { + return false; + } + else + { + LineFact l = (LineFact)obj; + return this.Pid1.Equals(l.Pid1) && this.Pid2.Equals(l.Pid2); + } + } + + public override int GetHashCode() + { + return this.Pid1 ^ this.Pid2; } } @@ -197,6 +278,35 @@ public class OpenLineFact : Fact //R: this is called RayFact for now (see below), feel free to change //an infinite Line through the Points Pid1 and Pid2 public int Pid1, Pid2; + + public override Boolean hasDependentFacts() + { + return true; + } + + public override int[] getDependentFactIds() + { + return new int[] { Pid1, Pid2 }; + } + + public override bool Equals(System.Object obj) + { + //Check for null and compare run-time types. + if ((obj == null) || !this.GetType().Equals(obj.GetType())) + { + return false; + } + else + { + OpenLineFact o = (OpenLineFact)obj; + return this.Pid1.Equals(o.Pid1) && this.Pid2.Equals(o.Pid2); + } + } + + public override int GetHashCode() + { + return this.Pid1 ^ this.Pid2; + } } public class RayFact : Fact @@ -232,7 +342,34 @@ public RayFact(int i, int pid1, int pid2, string uri, string valuri) this.backendValueURI = valuri; } + public override Boolean hasDependentFacts() + { + return true; + } + + public override int[] getDependentFactIds() + { + return new int[] { Pid1, Pid2 }; + } + public override bool Equals(System.Object obj) + { + //Check for null and compare run-time types. + if ((obj == null) || !this.GetType().Equals(obj.GetType())) + { + return false; + } + else + { + RayFact r = (RayFact)obj; + return this.Pid1.Equals(r.Pid1) && this.Pid2.Equals(r.Pid2); + } + } + + public override int GetHashCode() + { + return this.Pid1 ^ this.Pid2; + } } @@ -257,7 +394,34 @@ public OnLineFact(int i, int pid, int lid) Debug.Log("created onLine" + this.backendURI + " " + this.backendValueURI); } + public override Boolean hasDependentFacts() + { + return true; + } + + public override int[] getDependentFactIds() + { + return new int[] { Pid, Lid }; + } + + public override bool Equals(System.Object obj) + { + //Check for null and compare run-time types. + if ((obj == null) || !this.GetType().Equals(obj.GetType())) + { + return false; + } + else + { + OnLineFact o = (OnLineFact)obj; + return this.Pid.Equals(o.Pid) && this.Lid.Equals(o.Lid); + } + } + public override int GetHashCode() + { + return this.Pid ^ this.Lid; + } } @@ -322,13 +486,52 @@ public AngleFact(int Pid1, int Pid2, int Pid3, string backendURI) public static AngleFact parseFact(Scroll.ScrollFact fact) { - String uri = fact.@ref.uri; - String pointAUri = ((OMS)((OMA)((Scroll.ScrollValueFact)fact).lhs).arguments[0]).uri; - String pointBUri = ((OMS)((OMA)((Scroll.ScrollValueFact)fact).lhs).arguments[1]).uri; - String pointCUri = ((OMS)((OMA)((Scroll.ScrollValueFact)fact).lhs).arguments[2]).uri; - int pid1 = CommunicationEvents.Facts.Find(x => x.backendURI.Equals(pointAUri)).Id; - int pid2 = CommunicationEvents.Facts.Find(x => x.backendURI.Equals(pointBUri)).Id; - int pid3 = CommunicationEvents.Facts.Find(x => x.backendURI.Equals(pointCUri)).Id; + String uri; + String pointAUri; + String pointBUri; + String pointCUri; + int pid1; + int pid2; + int pid3; + + //If angle is not a 90Degree-Angle + if (fact.GetType().Equals(typeof(Scroll.ScrollValueFact))) + { + uri = fact.@ref.uri; + pointAUri = ((OMS)((OMA)((Scroll.ScrollValueFact)fact).lhs).arguments[0]).uri; + pointBUri = ((OMS)((OMA)((Scroll.ScrollValueFact)fact).lhs).arguments[1]).uri; + pointCUri = ((OMS)((OMA)((Scroll.ScrollValueFact)fact).lhs).arguments[2]).uri; + //If dependent facts do not exist return null + if (!CommunicationEvents.Facts.Exists(x => x.backendURI.Equals(pointAUri)) | + !CommunicationEvents.Facts.Exists(x => x.backendURI.Equals(pointBUri)) | + !CommunicationEvents.Facts.Exists(x => x.backendURI.Equals(pointCUri))) + { + return null; + } + + pid1 = CommunicationEvents.Facts.Find(x => x.backendURI.Equals(pointAUri)).Id; + pid2 = CommunicationEvents.Facts.Find(x => x.backendURI.Equals(pointBUri)).Id; + pid3 = CommunicationEvents.Facts.Find(x => x.backendURI.Equals(pointCUri)).Id; + } + //If angle is a 90Degree-Angle + else { + uri = fact.@ref.uri; + pointAUri = ((OMS)((OMA)((OMA)((OMA)((Scroll.ScrollSymbolFact)fact).tp).arguments[0]).arguments[1]).arguments[0]).uri; + pointBUri = ((OMS)((OMA)((OMA)((OMA)((Scroll.ScrollSymbolFact)fact).tp).arguments[0]).arguments[1]).arguments[1]).uri; + pointCUri = ((OMS)((OMA)((OMA)((OMA)((Scroll.ScrollSymbolFact)fact).tp).arguments[0]).arguments[1]).arguments[2]).uri; + //If dependent facts do not exist return null + if (!CommunicationEvents.Facts.Exists(x => x.backendURI.Equals(pointAUri)) | + !CommunicationEvents.Facts.Exists(x => x.backendURI.Equals(pointBUri)) | + !CommunicationEvents.Facts.Exists(x => x.backendURI.Equals(pointCUri))) + { + return null; + } + + pid1 = CommunicationEvents.Facts.Find(x => x.backendURI.Equals(pointAUri)).Id; + pid2 = CommunicationEvents.Facts.Find(x => x.backendURI.Equals(pointBUri)).Id; + pid3 = CommunicationEvents.Facts.Find(x => x.backendURI.Equals(pointCUri)).Id; + } + return new AngleFact(pid1, pid2, pid3, uri); } @@ -373,6 +576,35 @@ private MMTDeclaration generateNot90DegreeAngleDeclaration(float val, string p1U return new MMTValueDeclaration(this.Label, lhs, valueTp, value); } + + public override Boolean hasDependentFacts() + { + return true; + } + + public override int[] getDependentFactIds() + { + return new int[] { Pid1, Pid2, Pid3 }; + } + + public override bool Equals(System.Object obj) + { + //Check for null and compare run-time types. + if ((obj == null) || !this.GetType().Equals(obj.GetType())) + { + return false; + } + else + { + AngleFact a = (AngleFact)obj; + return this.Pid1.Equals(a.Pid1) && this.Pid2.Equals(a.Pid2) && this.Pid3.Equals(a.Pid3); + } + } + + public override int GetHashCode() + { + return this.Pid1 ^ this.Pid2 ^ this.Pid3; + } } diff --git a/Assets/Scripts/InteractionEngine/FactSpawner.cs b/Assets/Scripts/InteractionEngine/FactSpawner.cs index 6f29c77e49a8284cc9ab9e9980ecc1f7b0d1050e..ec067726e17480f87e9a4f331b4165a9a8362f50 100644 --- a/Assets/Scripts/InteractionEngine/FactSpawner.cs +++ b/Assets/Scripts/InteractionEngine/FactSpawner.cs @@ -15,36 +15,38 @@ void Start() AddFactEvent.AddListener(FactAction); RemoveFactEvent.AddListener(DeleteObject); + AnimateNonExistingFactEvent.AddListener(animateNonExistingFactTrigger); + //Default FactRepresenation = Sphere-Prefab for Points this.FactRepresentation = (GameObject) Resources.Load("Prefabs/Sphere", typeof(GameObject)); } - public void FactAction(Fact fact) + public void FactAction(Fact fact) { + getAction(fact)?.Invoke(fact); + } + + public Func<Fact, Fact> getAction(Fact fact) { - switch (fact) { case PointFact pointFact: - SpawnPoint(pointFact); - break; + return SpawnPoint; case LineFact lineFact: - SpawnLine(lineFact); - break; + return SpawnLine; case AngleFact angleFact: - SpawnAngle(angleFact); - break; + return SpawnAngle; case RayFact rayFact: - SpawnRay(rayFact); - break; - + return SpawnRay; + default: + return null; } } - public void SpawnPoint(PointFact fact) + public Fact SpawnPoint(Fact pointFact) { - + PointFact fact = ((PointFact)pointFact); this.FactRepresentation = (GameObject)Resources.Load("Prefabs/Sphere", typeof(GameObject)); GameObject point = GameObject.Instantiate(FactRepresentation); @@ -54,10 +56,13 @@ public void SpawnPoint(PointFact fact) point.GetComponentInChildren<TextMeshPro>().text = letter; point.GetComponent<FactObject>().Id = fact.Id; fact.Representation = point; + return fact; } - public void SpawnLine(LineFact lineFact) + public Fact SpawnLine(Fact fact) { + LineFact lineFact = ((LineFact)fact); + PointFact pointFact1 = (Facts[lineFact.Pid1] as PointFact); PointFact pointFact2 = (Facts[lineFact.Pid2] as PointFact); Vector3 point1 = pointFact1.Point; @@ -87,13 +92,16 @@ public void SpawnLine(LineFact lineFact) line.GetComponentInChildren<TextMeshPro>().text += " = " + Math.Round((point1-point2).magnitude, 2) + " m"; line.GetComponentInChildren<FactObject>().Id = lineFact.Id; lineFact.Representation = line; + return lineFact; } - public void SpawnRay(RayFact lineFact) + public Fact SpawnRay(Fact fact) { - PointFact pointFact1 = (Facts[lineFact.Pid1] as PointFact); - PointFact pointFact2 = (Facts[lineFact.Pid2] as PointFact); + RayFact rayFact = ((RayFact)fact); + + PointFact pointFact1 = (Facts[rayFact.Pid1] as PointFact); + PointFact pointFact2 = (Facts[rayFact.Pid2] as PointFact); Vector3 point1 = pointFact1.Point; @@ -123,16 +131,18 @@ public void SpawnRay(RayFact lineFact) line.transform.GetChild(0).localScale = v3T; line.transform.GetChild(0).rotation = Quaternion.FromToRotation(Vector3.right, point2 - point1); - string letter = ((Char)(64 + lineFact.Id + 1)).ToString(); + string letter = ((Char)(64 + rayFact.Id + 1)).ToString(); line.GetComponentInChildren<TextMeshPro>().text = letter; - line.GetComponentInChildren<FactObject>().Id = lineFact.Id; - lineFact.Representation = line; + line.GetComponentInChildren<FactObject>().Id = rayFact.Id; + rayFact.Representation = line; + return rayFact; } //Spawn an angle: point with id = angleFact.Pid2 is the point where the angle gets applied - public void SpawnAngle(AngleFact angleFact) + public Fact SpawnAngle(Fact fact) { + AngleFact angleFact = (AngleFact)fact; Vector3 point1 = (Facts[angleFact.Pid1] as PointFact).Point; Vector3 point2 = (Facts[angleFact.Pid2] as PointFact).Point; @@ -215,6 +225,7 @@ public void SpawnAngle(AngleFact angleFact) angle.GetComponentInChildren<FactObject>().Id = angleFact.Id; angleFact.Representation = angle; + return angleFact; } public void DeleteObject(Fact fact) @@ -222,6 +233,22 @@ public void DeleteObject(Fact fact) Debug.Log("delete obj of "+ fact.Id); GameObject factRepresentation = fact.Representation; GameObject.Destroy(factRepresentation); - + } + + public void animateNonExistingFactTrigger(Fact fact) { + StartCoroutine(animateNonExistingFact(fact)); + } + + public IEnumerator animateNonExistingFact(Fact fact) { + Fact returnedFact = getAction(fact)?.Invoke(fact); + if (returnedFact != null) + { + Animator animator = returnedFact.Representation.GetComponentInChildren<Animator>(); + animator.SetTrigger("animateHint"); + + yield return new WaitForSeconds(7); + + GameObject.Destroy(returnedFact.Representation); + } } } diff --git a/Assets/Scripts/InventoryStuff/RenderedScrollFact.cs b/Assets/Scripts/InventoryStuff/RenderedScrollFact.cs index 09c2f3c37773af7494f86efc9fa1503a1e74f4aa..3263b2603ac84f8db795c714ae024dd201cfe2f9 100644 --- a/Assets/Scripts/InventoryStuff/RenderedScrollFact.cs +++ b/Assets/Scripts/InventoryStuff/RenderedScrollFact.cs @@ -33,7 +33,7 @@ void Start() } public void OnClickHintButton() { - CompletionsHintEvent.Invoke(this.ScrollParameterObject, factUri); + ScrollFactHintEvent.Invoke(this.ScrollParameterObject, factUri); } public void OnHintAvailable(List<string> uris) { diff --git a/Assets/Scripts/InventoryStuff/Scroll.cs b/Assets/Scripts/InventoryStuff/Scroll.cs index 8b77dd0d57a66604ec237569156c60ad7222d11a..84679141fccb1dff113e2d7376ba2a961c3b82c0 100644 --- a/Assets/Scripts/InventoryStuff/Scroll.cs +++ b/Assets/Scripts/InventoryStuff/Scroll.cs @@ -74,6 +74,8 @@ public class ScrollSymbolFact : ScrollFact public override String getType() { if (this.tp is OMS) return ((OMS)this.tp).uri; + else if (this.tp is OMA) + return ((OMS)((OMA)this.tp).applicant).uri; else return null; } diff --git a/Assets/Scripts/InventoryStuff/ScrollDetails.cs b/Assets/Scripts/InventoryStuff/ScrollDetails.cs index a07eb8faff920a5ccf6d2def4caec8c95bc50bcc..5c03486b11b10320a40f403c9d649831fb1852d4 100644 --- a/Assets/Scripts/InventoryStuff/ScrollDetails.cs +++ b/Assets/Scripts/InventoryStuff/ScrollDetails.cs @@ -18,6 +18,7 @@ public class ScrollDetails : MonoBehaviour public static List<GameObject> ParameterDisplays; private static List<Scroll.ScrollAssignment> LatestCompletions; + private static List<Fact> LatestRenderedHints; public string currentMmtAnswer; @@ -32,7 +33,7 @@ void Start() if (cursor == null) cursor = GameObject.FindObjectOfType<WorldCursor>(); parameterDisplayHint.AddListener(animateScrollParameter); - CompletionsHintEvent.AddListener(animateCompletionsHint); + ScrollFactHintEvent.AddListener(animateHint); NewAssignmentEvent.AddListener(newAssignmentTrigger); } @@ -159,11 +160,17 @@ private void readPushout(List<Scroll.ScrollFact> pushoutFacts) for (int i = 0; i < pushoutFacts.Count; i++) { Fact newFact = ParsingDictionary.parseFactDictionary[pushoutFacts[i].getType()].Invoke(pushoutFacts[i]); - int id = factManager.GetFirstEmptyID(); - newFact.Id = id; - Facts.Insert(id, newFact); - AddFactEvent.Invoke(newFact); - PushoutFactEvent.Invoke(newFact); + if (newFact != null) + { + int id = factManager.GetFirstEmptyID(); + newFact.Id = id; + Facts.Insert(id, newFact); + AddFactEvent.Invoke(newFact); + PushoutFactEvent.Invoke(newFact); + } + else { + Debug.Log("Parsing on pushout-fact returned null -> One of the dependent facts does not exist"); + } } } @@ -174,35 +181,60 @@ public void processScrollDynamicInfo(Scroll.ScrollDynamicInfo scrollDynamicInfo) else LatestCompletions = new List<Scroll.ScrollAssignment>(); - List<string> completionUris = new List<string>(); + LatestRenderedHints = new List<Fact>(); + + List<string> hintUris = new List<string>(); foreach (Scroll.ScrollAssignment currentCompletion in LatestCompletions) { - completionUris.Add(currentCompletion.fact.uri); + hintUris.Add(currentCompletion.fact.uri); } - //Show that Hint is available for ScrollParameter - HintAvailableEvent.Invoke(completionUris); + //Update Scroll, process data for later hints and update Uri-List for which hints are available + hintUris = processRenderedScroll(scrollDynamicInfo.rendered, hintUris); - updateRenderedScroll(scrollDynamicInfo.rendered); + //Show that Hint is available for ScrollParameter + HintAvailableEvent.Invoke(hintUris); } - public void updateRenderedScroll(Scroll rendered) + public List<string> processRenderedScroll(Scroll rendered, List<string> hintUris) { Transform scroll = gameObject.transform.GetChild(1).transform; + //Update scroll-description scroll.GetChild(0).GetComponent<TextMeshProUGUI>().text = rendered.description; + for (int i = 0; i < rendered.requiredFacts.Count; i++) { + //Update ScrollParameter label var obj = ParameterDisplays.Find(x => x.transform.GetChild(0).GetComponent<RenderedScrollFact>().factUri.Equals(rendered.requiredFacts[i].@ref.uri)); obj.transform.GetChild(0).GetComponent<RenderedScrollFact>().Label = rendered.requiredFacts[i].label; + + //Check Hint Informations + //If ScrollFact is assigned -> No Hint + if (obj.transform.GetChild(0).GetComponent<DropHandling>().currentFact == null) { + Fact currentFact = ParsingDictionary.parseFactDictionary[rendered.requiredFacts[i].getType()].Invoke(rendered.requiredFacts[i]); + //If the fact could not be parsed -> Therefore not all dependent Facts exist -> No Hint + //AND if fact has no dependent facts -> No Hint + if (currentFact != null && currentFact.hasDependentFacts()) + { + //Hint available for abstract-problem uri + hintUris.Add(currentFact.backendURI); + LatestRenderedHints.Add(currentFact); + } + } } + + return hintUris; } - public void animateCompletionsHint(GameObject scrollParameter, string scrollParameterUri) { + public void animateHint(GameObject scrollParameter, string scrollParameterUri) { Scroll.ScrollAssignment suitableCompletion = LatestCompletions.Find(x => x.fact.uri.Equals(scrollParameterUri) ); + Fact fact; - if (suitableCompletion != null) { - Fact fact = Facts.Find(x => x.backendURI.Equals(suitableCompletion.assignment.uri)); - if (fact != null) { + if (suitableCompletion != null) + { + fact = Facts.Find(x => x.backendURI.Equals(suitableCompletion.assignment.uri)); + if (fact != null) + { //Animate ScrollParameter scrollParameter.GetComponentInChildren<Animator>().SetTrigger("animateHint"); //Animate Fact in FactPanel @@ -211,6 +243,30 @@ public void animateCompletionsHint(GameObject scrollParameter, string scrollPara fact.Representation.GetComponentInChildren<Animator>().SetTrigger("animateHint"); } } + else if (LatestRenderedHints.Exists(x => x.backendURI.Equals(scrollParameterUri))) { + fact = LatestRenderedHints.Find(x => x.backendURI.Equals(scrollParameterUri)); + + //If there is an equal existing fact -> Animate that fact AND ScrollParameter + if (Facts.Exists(x => x.Equals(fact))) + { + Fact existingFact = Facts.Find(x => x.Equals(fact)); + + //Animate ScrollParameter + scrollParameter.GetComponentInChildren<Animator>().SetTrigger("animateHint"); + //Animate Fact in FactPanel + AnimateExistingFactEvent.Invoke(existingFact); + //Animate factRepresentation in game + existingFact.Representation.GetComponentInChildren<Animator>().SetTrigger("animateHint"); + } + //If not -> Generate a Fact-Representation with such dependent facts + else + { + //Animate ScrollParameter + scrollParameter.GetComponentInChildren<Animator>().SetTrigger("animateHint"); + //Generate new FactRepresentation and animate it + AnimateNonExistingFactEvent.Invoke(fact); + } + } } public void animateScrollParameter(string label)